该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
[原创]如何找到程序的main函数的入口. 2008-02-09 20:14 [原创文章]转载请说明出处. 我们在刚用OllyDbg的时候, 因为程序在运行前会进行一些准备工作,比如申请全局变量空间等等,所以一开始可能不知道如何定位到函数的main函数.这里我通过查资料和自己实验总结了一下找到main函数的方法. 一.对于windows下的窗口程序.
windows下的窗口程序都是以WinMain开始的,OllyDbg在默认情况下将程序中断在PE装载器开始处,而不是main函数的开始。一般情况下main函数位于GetCommandLineA函数调用后不远处,并且有明显的特征:在调用之前有3次连续的压栈操作,因为系统要给main传入默认的argc、argv等参数。找到main函数调用后,按F7单步跟入就可以看到真正的代码了。二.对于用Dev-cpp编译的dos程序.
其中找到main函数的方法是查找_cexit函数,在其上方最近的一个call则为main,代码如下:
004011CA |. 8B08 mov ecx, dword ptr [eax]
004011CC |. 894C24 08 mov dword ptr [esp+8], ecx
004011D0 |. 8B15 00404000 mov edx, dword ptr [404000]
004011D6 |. 895424 04 mov dword ptr [esp+4], edx
004011DA |. A1 04404000 mov eax, dword ptr [404004]
004011DF |. 890424 mov dword ptr [esp], eax
004011E2 |. E8 A9000000 call 00401290 ; 进入main函数的call
004011E7 |. 89C3 mov ebx, eax ; |
004011E9 |. E8 D2050000 call ; |[msvcrt._cexit 把这儿当作参考点
004011EE |. 891C24 mov dword ptr [esp], ebx ; |
004011F1 |. E8 8A060000 call ; \ExitProcess
004011F6 |> 894424 04 mov dword ptr [esp+4], eax ; |
004011FA |. 8B15 D0504000 mov edx, dword ptr [] ; |msvcrt._iob
00401200 |. 8B42 10 mov eax, dword ptr [edx+10] ; |
00401203 |. 890424 mov dword ptr [esp], eax ; |
00401206 |. E8 F5050000 call ; \_setmode
0040120B |. 8B15 D0504000 mov edx, dword ptr [] ; msvcrt._iob
00401211 \.^ E9 55FFFFFF jmp 0040116B
找到了这个表示,不太理解
本文介绍了在Windows下使用OllyDbg调试器定位程序main函数的两种方法:一是针对窗口程序,通过查找GetCommandLineA附近的调用来定位;二是针对Dev-C++编译的DOS程序,通过查找_cexit函数上方的call指令来定位main函数。
2073

被折叠的 条评论
为什么被折叠?



