硬编码寻找序列号(五)
使用工具
- OllyDbg 1.10原版,简称
OD; OD汉化和插件均来自互联网;- CrackMe来自互联网,仅供学习使用;
- 文中特殊数字均是
HEX,为了书写方便采用DEC;
逆向思路
首先,打开软件到处点点,逆向一个软件起码要会用吧,不会用就没必要说逆向了;
倒入
OD开始分析:首先按下
Ctrl + A让OD分析一下代码;接着按下
Ctrl + N查看使用了哪些API,翻了翻还真不少,善用搜索,GetDlgItemTextA没找到,那就试试GetWindowTextA,还真有,就它了,在GetWindowTextA上设置断点,然后去断点窗口双击断点进入反汇编窗口给断点设置备注,这是一个好的习惯,请保持;F9运行程序,然鹅,输入内容并点击验证按钮后,程序并没有暂停;界面有按钮,试试消息断点,还是没用,又尝试
硬件断点以及内存断点均无效;使用一个特殊的
API:TranslateMessage,没错,它的功能就是字面的意思翻译虚拟按键消息为字符消息,很好很强大;在
API列表页面搜索,还真有,设置断点,然后在断点窗口双击断点进入反汇编窗口给断点设置备注,还没有完,在断点上右键断点>>条件记录或者Shift + F4(也就是条件记录断点,毕竟API断点的本质就是CC断点),修改条件:![TranslateMessage]()
然后运行程序,输入并点击验证,程序在
TranslateMessage函数的行首暂停下来,然后Ctrl + F9或者点击菜单栏的调试选项并选择执行到返回,然后F8单步执行到程序领空;然后在
内存窗口按下Ctrl + B或者右键选择查找,搜索输入的序列号:![查找]()
找到最接近
输入的序列号的内容,设置内存访问断点:![内存访问断点]()
运行程序,程序暂停在了读取序列号的地方,开始分析:
好聪明的“程序”,开始转移数据了:![转移数据]()
既然它都挪窝儿了,咱也别闲着了:在
EDI上右键选择数据窗口中跟随,果然,输入的序列号在这里了,选择序列号的数据右键断点>>删除内存访问断点删除第一次设置的内存访问断点,也可以理解为设置在ESI上的内存访问断点,既然数据都转移了,断点也就没意义了,所以要重新设置在EDI上,再次选择序列号的数据右键断点>>内存访问,这样就实时掌握了输入的序列号的动向了:![EDI]()
继续运行程序,终于来到来最关键的地方:比较
![比较]()
分析完毕,逻辑简单粗暴:
- 首先,假码 和 可疑字符串 的前 4 个字节的机器码进行比较,不相等跳转到下一步;
- 接着,假码 和 可疑字符串 的第 1 个字节的机器码进行比较,不相等跳转到下一步;
- 最后,恢复寄存器的内容并
RETN,直接弹出错误的弹窗;
分析的时候已经发现了正确的序列号,也就是可疑字符串,试一下:
![完工]()






