c语言编写查看内存的程序,如何用c实现,查找某个程序的内存首地址?

本文介绍了在Windows下使用OllyDbg调试器定位程序main函数的两种方法:一是针对窗口程序,通过查找GetCommandLineA附近的调用来定位;二是针对Dev-C++编译的DOS程序,通过查找_cexit函数上方的call指令来定位main函数。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

[原创]如何找到程序的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

找到了这个表示,不太理解

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值