硬编码寻找序列号(一)
使用工具
- OllyDbg 1.10原版,简称
OD
; OD
汉化
和插件
均来自互联网;- CrackMe来自互联网,仅供学习使用;
- 文中特殊数字均是
HEX
,为了书写方便采用DEC
;
逆向思路
首先,打开软件到处点点,逆向一个软件起码要会用吧,不会用就没必要说逆向了;
倒入
OD
开始分析:首先按下
Ctrl + A
让OD
分析一下代码;接着按下
Ctrl + N
查看使用了哪些API
,咦,发现可疑函数:就是它了,选中它并右键
在输入函数上切换断点
,然后去断点窗口(B 窗口)
双击断点进入反汇编窗口
给断点设置备注,这是一个好的习惯,请保持;然后运行程序,“随便输入”一些字符后点击验证,可以随便输入,但请记住它;
程序停在了设置断点的
API
的行首,在堆栈窗口可以看到API
的各种参数,而参数Buffer
里存放着函数返回的数据,选中Buffer
右键数据窗口中跟随
,可以看到,由于断点中断在了函数的第一行,所以这个地址里什么也没有:接着按下
Ctrl + F9
或点击菜单栏的调试选项并选择执行到返回
,然后发现Buffer
对应的地址里有数据了,并且是我们输入的字符串;在上一步中,我们
执行到返回
,那就意味着接下来登场的将会是RETN
了,按下F7 或 F8
,返回到调用API
的程序,发现接下来将要执行的代码很可疑:一个比较,一个跳转,并且文字显示和序列号有关;
分析一下这几行可疑的代码:
MOV EDX,CrackMe.00403008
将00403008
这个地址拷贝到EDX
,执行一下这行代码:在
EDX
存放的地址中发现一串可疑字符串,选中EDX
右键数据窗口中跟随
,原来可疑字符串只是前面几位,而后面那几个字符是我们输入的字符;MOV EBX,DWORD PTR DS:[403010]
将00403010
这个地址中的数据的前四个字节拷贝到EBX
,执行一下这行代码:既然
EBX
中存放的是数据,而数据又看不懂,怎么知道是什么呢?OD
很强大,选择那行代码并右键数据窗口中跟随,然后选择内存地址
或者在数据窗口选中那行代码的数据并选择数据窗口中跟随地址
就可以看到EBX
中存放的内容了,原来是我们输入的“序列号”;CMP EBX,DWORD PTR DS:[403008]
这行代码就没什么好说的了,减法比较是否相等,还使用了一个障眼法,EDX
放地址,EBX
放数据,在这里再取出EDX
的数据进行比较;JE SHORT CrackMe.00401087
这行也没啥说的,JE
根据ZF 标志位
进行跳转,而如果上一步的计算结果为0
,则ZF
为1
,JE
跳转成立,也就是说,如果EDX
和EBX
中的数据相同,那么序列号就是对的,JE
跳转并向下执行,最后弹出正确!
,反之则不跳转向下执行,弹出序列号错误!
,看来第一步中发现的可疑字符串就是真正的序列号了;如果想要输入啥都能通过验证,那么可以将
JE
改为JMP
无条件跳转,保存修改到文件就获得了一个新的程序;但我们的目的是找出真正的序列号,所以嘛,复制那串字符去试一下,果然,一切如我们所料!