- 第一章 - OD 的各个窗口介绍
- 第二章 - 数值系统
- 第三章 - 寄存器
- 第四章 - 汇编指令
- 第五章 - 数学指令
- 第六章 - 比较和条件跳转
- 第七章 - call ret
- 第八章 - 循环 字符串指令和寻址方式
- 第九章 - 基本概念
- 第十章 - 断点
- 第十一章:硬件断点与条件断点
- 第十二章 - 消息断点
- 第十三章 - 硬编码序列号寻踪-Part1
- 第十四章 - 硬编码序列号寻踪-Part2
- 第十五章 - 硬编码序列号寻踪-Part3
- 第十六章 - 序列号生成算法分析-Part1
- 第十七章 - 序列号生成算法分析-Part2
- 第十八章 - 序列号生成算法分析-Part3
- 第十九章 - OllyDbg 反调试之 IsDebuggerPresent
- 第二十章 - OllyDbg 反调试之检测 OD 进程名
- 第二十一章 - OllyDbg 反调试之检测 OD 进程名,窗口类名,窗口标题名
- 第二十二章 - OllyDbg 反调试之 UnhandledExceptionFilter,ZwQueryInformationProcess
- 第二十三章 - OllyDbg 反调试之 ProcessHeap,NTGlobalFlag,OutputDebugStringA
- 第二十四章 - OllyDbg 反调试之综合 CrackMe
- 第二十五章 - 异常处理
- 第二十六章 - Visual Basic 程序的破解-Part1
- 第二十七章 - Visual Basic 程序的破解-Part2
- 第二十八章 - Visual Basic 程序的破解-Part3
- 第二十九章 - P-CODE-Part1
- 第三十章 - P-CODE-Part2
- 第三十一章 - 脱壳简介
- 第三十二章 - OEP 寻踪
- 第三十三章 - 神马是 IAT 如何修复
- 第三十四章 - 手脱 UPX,修复 IAT
- 第三十五章 - 手脱 ASPack V2.12
- 第三十六章 - IAT 重定向
- 第三十七章 - 论 IAT 重定向之修复
- 第三十八章 - 手脱 Yoda's Protector v1.3(Yoda's Crypter)
- 第三十九章 - 神马是 stolen bytes
- 第四十章 - OllyDbg 脚本的编写
- 第四十一章 - 神马是 AntiDump
- 第四十二章 - ACProtect V1.09 脱壳(寻找 OEP 绕过硬件断点的检测 修复 Stolen code)
- 第四十三章 - ACProtect V1.09 脱壳(编写脚本修复 IAT)
- 第四十四章 - ACProtect V1.09 脱壳(修复 AntiDump)
- 第四十五章补充章节-ReCrypt v0.80 脱壳(续)
- 第四十六章 - Patrick 的 CrackMe-Part1
- 第四十七章 - Patrick 的 CrackMe-Part2
- 第四十八章 - PeSpin V1.3.04 脱壳-Part1
- 第四十九章 - PeSpin V1.3.04 脱壳-Part2
- 第五十章 - 再谈 ReCrypt v.0.80 脱壳(调戏 OutputDebugString)
- 第五十一章 - ASProtect v2.3.04.26 脱壳-Part1
- 第五十二章 - ASProtect v2.3.04.26 脱壳-Part2
- 第五十三章 - TPPpack 脱壳
- 第五十四章 - EXECryptor v2.2.50.a 脱壳-Part1
- 第五十五章 - ExeCryptor v2.2.50.a-Part2
- 第五十六章 - EXECryptor v2.2.50.b 脱壳
- 第五十七章 - ExeCryptor v2.2.50.c/d/e/f/g 脱壳
- 第五十八章 - ExeCryptor v2.2.50
第十七章 - 序列号生成算法分析-Part2
首先我们来解决上一章留下的 mexcrk1.zip 这个 CrackMe,很简单。首先用 OD 加载它,断在入口点处。
首先看看程序中使用了哪些字符串,单击鼠标右键:
可以看到以下字符串。
我们可以在正确字符串上面或者错误字符串上面双击来到关键代码附近。
我们看到这里有一个 CALL 指令决定后面的 JE 指令是跳转到”Thanks you made it”代码处,还是直接显示后面的”Wrong Code DUDE”。我们在 42D534 地址处设置一个断点,然后运行起来。
我们在 Enter Serial#下面的编辑框中随便输入一个序列号。
这里我输入 Narvajita。
如果你跟进这个 CALL,你会发生时我们输入的错误序列号”Narvajita”在于”Benadryl”进行比较。
好了,我们现在达到了比较指令处,”Benadryl”就是正确的序列号,我们删除之前设置的断点,运行程序。
这里我们可以看到,显示”Thanks you made it”提示序列号正确的字样。
好了,接下来我们分析 Canasta 5.0 这个 CrackMe。
该 CrackMe 属于那种 OK 按钮开始不可用,当用户输入的用户名与序列号相匹配的时候才可以单击的例子。
我们首先安装程序,然后打开 About 对话框。
提示 20 美元,确切是说是 19.95 美元。
我们单击 Enter License 按钮。
提示说只有当用户输入的用户名和序列号组合正确时 OK 按钮才会变为可用。
用 OD 加载该程序。
我们断在了入口点处。
好,我们来看看 API 函数列表以及字符串列表。
由于 OK 按钮不可用,所以我们不能通过单击 OK 按钮来获取错误提示是什么,嘿嘿。
我们运行起来,然后打开注册窗口,我们运用一些方法来攻击这种保护。
我们输入用户名,假设该程序对用户名没有限制,接在我们输入 6 个字母的序列号。例如:WMYXSZ。首先单击 W。
接着按 M 键。
现在我们在内存中搜索刚刚输入的两个字母。
我们单击工具栏中的 M 按钮,打开内存窗口,查找 WM 字符串。
这里,我们勾选上区分大小写。
找到了一个,我们继续按 CTRL+L 查找看看还有没有其他地方有该字符串。提示未找到其他条目,说明这就是我们刚刚输入的序列号。
我们在数据窗口中定位到给字符串。
我们输入刚刚找到的这个地址,由于该地址是字母 c 开头,所以我们要在前面加上 0,不然 OD 不认识。
可以用户输入的序列号就保存在这里,我们输入“WMYXSZ”接下来一个字母 Y。
继续转到数据窗口查看,发现字母 Y 加被保存进来了。然后对 0C35DF9 开始的连续六个字节内存单元设置内存访问断点。
现在运行起来。
输入字母’X’。
现在将保存该字母了。
这里如果按 F8 键,ESI 将保存到 EDI 中。
这里拷贝我们前面输入的 4 个字节。
按 F8 键,这 4 个字节将被拷贝到 12E79C 起始的内存单元中。
既然我们已经设置过内存访问断点,那我们就来设置硬件访问断点。
我们继续跟,就可以看到我们输入的用户名也被保存到了堆栈中。
我们输入的用户名长度为 0E,与 0 做比较。
如果用户名长度不为零,程序将继续执行。
然后判断是不是黑名单中的名称,也就是说不能是 TNO,afdad 等,嘿嘿。
继续运行。
断在了比较指令处,我们可以看到是我们输入的序列号在与另一个字符串进行比较。
我们可以看到”354910”就是正确的序列号,我们删除所有断点。
输入正确的序列号以后,OK 按钮就变为可用状态了,嘿嘿。两一种解决方法这里就不再赘述了,也不是很复杂,就利用我们每按下一个键就发产生 WM_KEYUP 消息,显得比较麻烦,但也很直接。
好了,我们休息一下,下一章,我们来看看别的例子。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论