这一篇讲的是函数参考

同上结合一小软件进行讲解软件特点大概如下

wKioL1MFcNay5HdxAAB3ZTB6zew618.jpg

点一下“Check It”按钮试一下,没反应!再输个“78787878”试试,还是没反应。再试试输入字母或其它字符,输不进去。由此判断注册码应该都是数字,只有输入正确的注册码才有反应。这个状态下我们没有什么字符串可以参考的所以想到在API上下断点,让被调试的程序停在我们希望的地方。具体操作:

在OllyDBG的反汇编窗口中右击,选择查找->当前模块中的名称(标签),或者CTR+N组合键也可以(注意在进行此操作时要在OllyDBG中保证是在当前被调试程序的领空,如果调试这个程序时OllyDBG的标题栏显示的就是“[CPU –主线程,模块– CrackHea]”,这表明我们当前在被调试程序的领空)。通过上面的操作后会弹出一个对话框,如图:

wKioL1MFcPDyKAcwAAJc404BVC8162.jpg

对于这样的编辑框中输注册码的程序一般会设断点首选的API函数是

GetDlgItemText及GetWindowText。每个函数都有两个版本,

一个是ASCII版,在函数后添加一个A表示,如GetDlgItemTextA,

一个是UNICODE版,在函数后添加一个W表示。如GetDlgItemTextW。

对于编译为UNCODE版的程序可能在Win98下不能运行,因为Win98并非是完全支持UNICODE的系统。而NT系统则从底层支持UNICODE,它可以在操作系统内对字串进行转换,同时支持ASCII和UNICODE版本函数的调用。一般我们打开的程序看到的调用都是ASCII类型的函数,以“A”结尾。

我们现在就是要找一下我们调试的程序有没有调用GetDlgItemTextA或GetWindowTextA函数。找到一个GetWindowTextA。下断点可以在这个函数上右击,选择“在每个参考上设置断点”,我们会在OllyDBG窗口最下面的那个状态栏里看到“已设置2个断点”。也可以就是那个GetWindowTextA函数上右击,在弹出菜单上选择“查找输入函数参考”(或者按回车键)弹出所有含有GetWindowTextA的地方我们只要在callGetWindowTextA下断点即可F9运行输入注册码点check按钮 程序会断在咱下的这个断点处

同上一篇用F7进入分析程序.如果之前下API断点是采用方式一即所有的都下了此时程序会跑到非程序领空中(可以看OllyDBG的标题栏显示)此时先将此多余断点删掉,按一下 ALT+F9 组合键回到程序领空,F7继续进入分析部分程序如下

004013D2  /$  56           PUSH ESI

004013D3  |.  33C0          XOR EAX,EAX

004013D5  |.  8D35 C4334000 LEA ESI,DWORD PTR DS:[4033C4]把框中的数值送到ESI

004013DB  |.  33C9          XOR ECX,ECX

004013DD  |.  33D2          XOR EDX,EDX

004013DF  |.  8A06         MOV AL,BYTE PTR DS:[ESI] 把注册码中的每个字符送AL

004013E1  |.  46            INC ESI

004013E2  |.  3C 2D         CMP AL,2D

把取得的字符与16进制值为2D的字符(即“-”)比较,这里用于判断输入的是不是负数

004013E4  |.  75 08         JNZ SHORT CrackHea.004013EE

004013E6  |.  BA FFFFFFFF   MOV EDX,-1

004013EB  |.  8A06          MOV AL,BYTE PTR DS:[ESI]

004013ED  |.  46            INC ESI

004013EE  |>  EB 0B         JMP SHORT CrackHea.004013FB

004013F0  |>  2C 30         /SUB AL,30

004013F2  |.  8D0C89        |LEA ECX,DWORD PTR DS:[ECX+ECX*4]

004013F5  |.  8D0C48        |LEA ECX,DWORD PTR DS:[EAX+ECX*2]

004013F8  |.  8A06          |MOV AL,BYTE PTR DS:[ESI]

004013FA  |.  46            |INC ESI

004013FB  |>  0AC0           OR AL,AL

004013FD  |.^ 75 F1         \JNZ SHORT CrackHea.004013F0

004013FF  |.  8D040A        LEA EAX,DWORD PTR DS:[EDX+ECX]

00401402  |.  33C2          XOR EAX,EDX

00401404  |.  5E           POP ESI

00401405  |.  81F6 53757A79 XOR ESI,797A7553

0040140B  \.  C3            RETN

当走到最后

再按一下F8,我们就走出00401328地址处的那个CALL了。现在我们回到了这里:

0040132D |. 3BC6 CMP EAX,ESI ;比较

0040132F|. 75 42 JNZ SHORT CrackHea.00401373 ; 不等则出错

看出来的时候是比较的EAX和ESI所以就看哪个里边是咱输入的哪个是正确的

由程序分析可知这是一个小的加密算法就是将咱输入的数字按照一定的规律给加密了整成咱不认识的了并放在了EAX中而ESI是之前的压栈后边进行了一个XOR运算     这种时候两者是看信息窗口ESI = 68AFCD59   EAX = 00BC6142

直接右击信息窗口的这两行选择修改寄存器此时就豁然开朗了

将得到的数字贴到编辑框中即可

一个简单的函数参考