日期:2014-05-16  浏览次数:20671 次

OllyDBG 入门系列(三)-函数

在第一篇中已经介绍了领空的概念,如我这里调试这个程序时?OllyDBG?的标题栏显示的就是“[CPU?-?主线程,?模块?-?CrackHea]”,这表明我们当前在被调试程序的领空)。通过上面的操作后会弹出一个对话框,如图:
/UpLoads/images/sjkjc/20140516060348263314.gif
对于这样的编辑框中输注册码的程序我们要设断点首选的?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?函数上右击,在弹出菜单上选择“查找输入函数参考”(或者按回车键),将会出现下面的对话框:
/UpLoads/images/sjkjc/20140516060348837544.gif?
看上图,我们可以把两条都设上断点。这个程序只需在第一条指令设断点就可以了。好,我们现在按前面提到的第一条方法,就是“在每个参考上设置断点”,这样上图中的两条指令都会设上断点。断点设好后我们转到我们调试的程序上来,现在我们在被我们调试的程序上点击那个“Check?It”按钮,被?OllyDBG?断下:

00401323?|.?E8?4C010000?????????CALL?<JMP.&USER32.GetWindowTextA>???????????;?GetWindowTextA
00401328?|.?E8?A5000000?????????CALL?CrackHea.004013D2??????????????????????;?关键,要按F7键跟进去
0040132D?|.?3BC6????????????????CMP?EAX,ESI?????????????????????????????????;?比较
0040132F?|.?75?42???????????????JNZ?SHORT?CrackHea.00401373?????????????????;?不等则完蛋
00401331?|.?EB?2C???????????????JMP?SHORT?CrackHea.0040135F
00401333?|.?4E?6F?77?20?7>??????ASCII?"Now?write?a?keyg"
00401343?|.?65?6E?20?61?6>??????ASCII?"en?and?tut?and?y"
00401353?|.?6F?75?27?72?6>??????ASCII?"ou're?done.",0
0040135F?|>?6A?00???????????????PUSH?0??????????????????????????????????????;?Style?=?MB_OK|MB_APPLMODAL
00401361?|.?68?0F304000?????????PUSH?CrackHea.0040300F??????????????????????;?Title?=?"Crudd's?Crack?Head"
00401366?|.?68?33134000?????????PUSH?CrackHea.00401333??????????????????????;?Text?=?"Now?write?a?keygen?and?tut?and?you're?done."
0040136B?|.?FF75?08?????????????PUSH?DWORD?PTR?SS:[EBP+8]???????????????????;?hOwner
0040136E?|.?E8?19010000?????????CALL?<JMP.&USER32.MessageBoxA>??????????????;?MessageBoxA

从上面的代码,我们很容易看出?00401328?地址处的?CALL?CrackHea.004013D2?是关键,必须仔细跟踪。而注册成功则会显示一个对话框,标题是“Crudd's?Crack?Head”,对话框显示的内容是“Now?write?a?keygen?and?tut?and?you're?done.”现在我按一下?F8,准备步进到?00401328?地址处的那条?CALL?CrackHea.004013D2?指令后再按?F7?键跟进去。等等,怎么回事?怎么按一下?F8?键跑到这来了:

00401474?$-?FF25?2C204000??????JMP?DWORD?PTR?DS:[<&USER32.GetWindowText>????;?USER32.GetWindowTextA
0040147A?$-?FF25?30204000??????JMP?DWORD?PTR?DS:[<&USER32.LoadCursorA>]?????;?USER32.LoadCursorA
00401480?$-?FF25?1C204000??????JMP?DWORD?PTR?DS:[<&USER32.LoadIconA>]???????;?USER32.LoadIconA
00401486?$-?FF25?20204000??????JMP?DWORD?PTR?DS:[<&USER32.LoadMenuA>]???????;?USER32.LoadMenuA
0040148C?$-?FF25?24204000??????JMP?DWORD?PTR?DS:[<&USER32.MessageBoxA>]?????;?USER32.MessageBoxA

原来是跳到另一个断点了。这个断点我们不需要,按一下?F2?键删掉它吧。删掉?00401474?地址处的断点后,我再按?F8?键,呵,完了,跑到?User32.dll?的领空了。看一下?OllyDBG?的标题栏:“[CPU?-?主线程,?模块?-?USER32],跑到系统领空了,OllyDBG?反汇编窗口中显示代码是这样:

77D3213C?6A?0C?????????????????PUSH?0C
77D3213E?68?A021D377???????????PUSH?USER32.77D321A0
77D32143?E8?7864FEFF???????????CALL?USER32.77D185C0

怎么办?别急,我们按一下?ALT+F9?组合键,呵,回来了:

00401328?|.?E8?A5000000????????CALL?CrackHea.004013D2?????????????????????;?关键,要按F7键跟进去
0040132D?|.?3BC6???????????????CMP?EAX,ESI????????????????????????????????;?比较
0040132F?|.?75?42??????????????JNZ?SHORT?CrackHea.00401373????????????????;?不等则完蛋

光标停在?00401328?地址处的那条指令上。现在我们按?F7?键跟进:

004013D2?/$?56????????????????PUSH?ESI????????????????????????????????????;?ESI入栈
004013D3?|.?33C0??????????????XOR?EAX,EA