硬编码寻找序列号(五)
使用工具
- 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
函数的行首暂停下来,然后Ctrl + F9
或者点击菜单栏的调试选项并选择执行到返回
,然后F8
单步执行到程序领空;然后在
内存窗口
按下Ctrl + B
或者右键选择查找
,搜索输入的序列号:找到最接近
输入的序列号
的内容,设置内存访问断点
:运行程序,程序暂停在了读取序列号的地方,开始分析:
好聪明的“程序”,开始转移数据了:既然它都挪窝儿了,咱也别闲着了:在
EDI
上右键选择数据窗口中跟随
,果然,输入的序列号在这里了,选择序列号的数据右键断点>>删除内存访问断点
删除第一次设置的内存访问断点
,也可以理解为设置在ESI
上的内存访问断点
,既然数据都转移了,断点也就没意义了,所以要重新设置在EDI
上,再次选择序列号的数据右键断点>>内存访问
,这样就实时掌握了输入的序列号的动向了:继续运行程序,终于来到来最关键的地方:比较
分析完毕,逻辑简单粗暴:
- 首先,假码 和 可疑字符串 的前 4 个字节的机器码进行比较,不相等跳转到下一步;
- 接着,假码 和 可疑字符串 的第 1 个字节的机器码进行比较,不相等跳转到下一步;
- 最后,恢复寄存器的内容并
RETN
,直接弹出错误的弹窗;
分析的时候已经发现了正确的序列号,也就是可疑字符串,试一下: