by +immlep+
E-mail:immlep[at]126[dot]com
原文出处:
http://www.blogcn.com/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.y11.net","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.y11.net","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.y11.net"
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.y11.net ","Test",MB_OK);
怎么样,哪个文件,哪一行代码,连代码是什么都显示出来了!爽不爽!间不简单!?
当然用ollydbg调试不仅仅只有上面所说的功能,它还有其它的功能,这个你自己去看看就可以去了解!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)