linhanshi 2004-12-17, 17:41:15 by +immlep+ E-mail:immlep[at]126[dot]com 原文出处:http://www./User14/immlep/index.html 在论坛上经常看到有些人在问怎么样用ollydbg实现源码级调试! 以前我没常用ollydbg,所以自己也没有注意这些问题,现在用得比较惯,所以也就把它的各个功能看了, 发现用ollydbg来调试有源代码的程序还挺好用的,至少我觉得比vc什么的自带的调试器好用多了! 在此写出来和大家分享一下,其实这些都是很容易的,只不过之前没有多少人写出来, 至于我自己写出来也只是起到一个抛砖引玉的作用而已!没有什么技术性可言!而且中间可能有多个错误,那么其中涉及到的一些问题就需要你自己去解决了,我也希望如果你发现什么比较好的技巧的话,可以告诉我一声! 在本文中我测试的是用vc++以debug编译的程序(不能用Release方式编译,否则无法结合代码调试)!至于用其它编译器编译的软件我还没试过!你可以自己试一下! 首先我们新建debug example.cpp,代码如下: 以下内容为程序代码: #include "windows.h" void main() { MessageBox(NULL,"debug example for cpp\nwelcome to http://immlep.","Test",MB_OK); return; } 用vc++以debug方式编译程序,这时在你的工程目录下会生成debug目录,现在你就可以用ollydbg来调试了(就怎么简单)! 用ollydbg打开debug目录下的debug example.exe,这时你会发现,ollydbg显示的内容很详细! 入口点处的部分代码: 以下内容为程序代码: 004010B0 >/ 55 PUSH EBP 004010B1 |. 8BEC MOV EBP,ESP 004010B3 |. 6A FF PUSH -1 004010B5 |. 68 30F14100 PUSH debug_ex.0041F130 004010BA |. 68 A42B4000 PUSH debug_ex._except_handler3 ; SE handler installation 004010BF |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0] 004010C5 |. 50 PUSH EAX 004010C6 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP 004010CD |. 83C4 F0 ADD ESP,-10 004010D0 |. 53 PUSH EBX 004010D1 |. 56 PUSH ESI 004010D2 |. 57 PUSH EDI 004010D3 |. 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP 004010D6 |. FF15 88414200 CALL NEAR DWORD PTR DS:[<&KERNEL32.GetVersion>] ; KERNEL32.GetVersion 004010DC |. A3 E0254200 MOV DWORD PTR DS:[_osver],EAX 004010E1 |. A1 E0254200 MOV EAX,DWORD PTR DS:[_osver] 004010E6 |. C1E8 08 SHR EAX,8 004010E9 |. 25 FF000000 AND EAX,0FF 004010EE |. A3 EC254200 MOV DWORD PTR DS:[_winminor],EAX 004010F3 |. 8B0D E0254200 MOV ECX,DWORD PTR DS:[_osver] 004010F9 |. 81E1 FF000000 AND ECX,0FF 004010FF |. 890D E8254200 MOV DWORD PTR DS:[_winmajor],ECX 00401105 |. 8B15 E8254200 MOV EDX,DWORD PTR DS:[_winmajor] 0040110B |. C1E2 08 SHL EDX,8 0040110E |. 0315 EC254200 ADD EDX,DWORD PTR DS:[_winminor] 00401114 |. 8915 E4254200 MOV DWORD PTR DS:[_winver],EDX 0040111A |. A1 E0254200 MOV EAX,DWORD PTR DS:[_osver] 0040111F |. C1E8 10 SHR EAX,10 00401122 |. 25 FFFF0000 AND EAX,0FFFF 00401127 |. A3 E0254200 MOV DWORD PTR DS:[_osver],EAX 0040112C |. 6A 00 PUSH 0 ; /Arg1 = 00000000 0040112E |. E8 8D180000 CALL debug_ex._heap_init ; \_heap_init 00401133 |. 83C4 04 ADD ESP,4 00401136 |. 85C0 TEST EAX,EAX 00401138 |. 75 0A JNZ SHORT debug_ex.00401144 0040113A |. 6A 1C PUSH 1C 0040113C |. E8 CF000000 CALL debug_ex.00401210 00401141 |. 83C4 04 ADD ESP,4 00401144 |> C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 0040114B |. E8 00150000 CALL debug_ex._ioinit 现在我们就要进入重点了,在ollydbg中打开View-->Source files!这是你会发现这样的列表: Source files Module Source Source path debug_ex (Absent) G:\crack\zz\Debug\sbheap.c debug_ex (Absent) G:\crack\zz\Debug\dbgheap.c debug_ex (Absent) G:\crack\zz\Debug\osfinfo.c debug_ex (Absent) G:\crack\zz\Debug\mbctype.c debug_ex (Absent) G:\crack\zz\Debug\a_map.c debug_ex (Absent) G:\crack\zz\Debug\crt0msg.c debug_ex (Absent) G:\crack\zz\Debug\_flsbuf.c debug_ex (Absent) G:\crack\zz\Debug\dbgrpt.c debug_ex (Absent) G:\crack\zz\Debug\winsig.c debug_ex (Absent) G:\crack\zz\Debug\malloc.c debug_ex (Absent) G:\crack\zz\Debug\wctomb.c debug_ex (Absent) G:\crack\zz\Debug\xtoa.c debug_ex (Absent) G:\crack\zz\Debug\crt0dat.c debug_ex (Absent) G:\crack\zz\Debug\lseek.c debug_ex (Absent) G:\crack\zz\Debug\crtmbox.c debug_ex (Absent) intel\ullrem.asm debug_ex (Absent) G:\crack\zz\Debug\fclose.c debug_ex (Absent) G:\crack\zz\Debug\vsprintf.c debug_ex (Absent) G:\crack\zz\Debug\fflush.c debug_ex (Absent) G:\crack\zz\Debug\_file.c debug_ex (Absent) G:\crack\zz\Debug\isatty.c debug_ex (Absent) G:\crack\zz\Debug\a_env.c debug_ex (Absent) G:\crack\zz\Debug\heapchk.c debug_ex (Absent) G:\crack\zz\Debug\dbghook.c debug_ex (Absent) G:\crack\zz\Debug\write.c debug_ex (Absent) G:\crack\zz\Debug\_getbuf.c debug_ex DEBUG EXAMPLE.CPP G:\crack\zz\debug example.cpp debug_ex (Absent) G:\crack\zz\Debug\winxfltr.c debug_ex (Absent) G:\crack\zz\Debug\stdargv.c debug_ex (Absent) G:\crack\zz\Debug\output.c debug_ex (Absent) intel\chkstk.asm debug_ex (Absent) intel\memset.asm debug_ex (Absent) G:\crack\zz\Debug\_freebuf.c debug_ex (Absent) G:\crack\zz\Debug\crt0fp.c debug_ex (Absent) G:\crack\zz\Debug\handler.cpp debug_ex (Absent) intel\strlen.asm debug_ex (Absent) G:\crack\zz\Debug\a_str.c debug_ex (Absent) G:\crack\zz\Debug\heapinit.c debug_ex (Absent) G:\crack\zz\Debug\dosmap.c debug_ex (Absent) intel\ulldiv.asm debug_ex (Absent) G:\crack\zz\Debug\sprintf.c debug_ex (Absent) G:\crack\zz\Debug\commit.c debug_ex (Absent) Intel\MEMCPY.ASM debug_ex (Absent) G:\crack\zz\Debug\close.c debug_ex (Absent) G:\crack\zz\Debug\closeall.c debug_ex (Absent) intel\memcpy.asm debug_ex (Absent) G:\crack\zz\Debug\realloc.c debug_ex (Absent) G:\crack\zz\Debug\ioinit.c debug_ex (Absent) G:\crack\zz\Debug\expand.c debug_ex (Absent) G:\crack\zz\Debug\free.c debug_ex (Absent) G:\crack\zz\Debug\isctype.c debug_ex (Absent) G:\crack\zz\Debug\crt0.c debug_ex (Absent) intel\strcat.asm debug_ex (Absent) G:\crack\zz\Debug\stdenvp.c debug_ex (Absent) intel\strncpy.asm 看到了DEBUG EXAMPLE.CPP没有?!双击它,怎么样,是不是看到了: 在这里就可以查看代码了,而且还显示出了每行代码的行号!双击它就可以来到该代码对应的汇编代码处了,你也可以直接在源代码上下断点,到了这里是不是很熟悉了!我们这里先来试试! 以下内容为程序代码: 1.#include "windows.h" 2. 3.void main() 4.{ 5. 6. MessageBox(NULL,"debug example for cpp\nwelcome to http://immlep.","Test",MB_OK);//就用这一句开刀吧! 7. 8. return; 9.} 10. 11. 在第六行按F2下断点,双击来到了对应的汇编代码处: 以下内容为程序代码: 00401028 |. 8BF4 MOV ESI,ESP 0040102A |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 0040102C |. 68 38F04100 PUSH debug_ex.0041F038 ; |Title = "Test" 00401031 |. 68 5CFF4100 PUSH debug_ex.0041FF5C ; |Text = "debug example for cpp welcome to http://immlep." 00401036 |. 6A 00 PUSH 0 ; |hOwner = NULL 00401038 |. FF15 8C424200 CALL NEAR DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA 按F9执行一下看看!断在00401028处!在ollydbg里还可以看到: ESP=0012FF34 ESI=00000000 debug example.cpp:6. MessageBox(NULL,"debug example for cpp\nwelcome to http://immlep. ","Test",MB_OK); 怎么样,哪个文件,哪一行代码,连代码是什么都显示出来了!爽不爽!间不简单!? 当然用ollydbg调试不仅仅只有上面所说的功能,它还有其它的功能,这个你自己去看看就可以去了解! WiNrOOt 2004-12-17, 18:32:30 个人觉得:对于3环的源码级调试最好的工具就是IDE集成的调试器 那才叫真正的源码级调试。 ksgkgs 2004-12-17, 21:19:35 在ollydbg中打开View-->Source files!我那只有EXAMPLE.CPP一个文件,怎么楼主有这么多库文件能看到的,请问应该怎样设置啊? |
|