首页
社区
课程
招聘
[转]用ollydbg实现源码级调试
发表于: 2004-12-17 17:41 6574

[转]用ollydbg实现源码级调试

2004-12-17 17:41
6574
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期)

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 255
活跃值: (266)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
2
个人觉得:对于3环的源码级调试最好的工具就是IDE集成的调试器
那才叫真正的源码级调试。
2004-12-17 18:32
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在ollydbg中打开View-->Source files!我那只有EXAMPLE.CPP一个文件,怎么楼主有这么多库文件能看到的,请问应该怎样设置啊?
2004-12-17 21:19
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那对MASM32的程序怎么办啊
2004-12-17 22:25
0
游客
登录 | 注册 方可回帖
返回
//