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




