《C++反汇编与逆向分析技术》讲解如何查找main函数:
OllyDbg默认情况下将程序中断在PE装载器开始处,不是在main函数开始处,因为需要手工识别main函数的位置。
识别main函数如同识别一个人。要识别一个人,首先观察外观,识别身体和外貌特征,把这些特征和自己认识的人匹配,从而判断这个人的身份。
main函数特征:
1、有3个参数,分别是argc、argv、环境变量信息,而且main函数是启动函数中唯一具有3个参数的函数。同理WinMain函数是启动函数中唯一具有4个参数的函数。
2、main函数返回需要调用exit函数,结束程序根据main函数调用特征,找到入口代码第一次调用exit函数处,离exit最近的且有3个参数的函数通常就是main函数。
老钱这里只讲到了识别main函数啊,没有讲怎么找到main函数。
F8大法好(借鉴下,这个比较容易)
文章参考:https://blog.csdn.net/qingshenxue/article/details/6209788
=====================
先声明下:这个和脱壳没关系,不是找壳里面的程序入口哦,只是程序本身的入口,个别朋友不要误会哈。
一般用OllyDBG打开程序的时候,并不是直接定位到程序入口,而是还要先进行一系列的初始化工作,但做这些工作的反汇编代码我们是不需要的,所以我们要快速跳过,直接到程序入口。
我先把方法写出来,然后再简单分析一下初始化的时候都干了什么。
1. 一路F8下去,分别步过下列两个函数:
call dword ptr ds:[<&KERNEL32.GetVersion>] ; kernel32.GetVersion
call dword ptr ds:[<&KERNEL32.GetCommandLineA>] ; kernel32.GetCommandLineA
2. GetCommandLineA下面会有好几个Call,从GetCommandLineA往下数(不包括GetCommandLineA本身),第5个Call一般就是程序入口点的Call,F7进去就可以了。
PS:如果是用IDA5反汇编的话,我们点一下“_main proc near”处,然后 Run to cursor(F4)一下基本会直接定位到入口处。
方法很简单,那来看看在进入程序入口之前,都干了些什么吧。
第一个Call是GetVersion,很好理解,就是获得Windows版本号。
看看我选定的0部分,其中有5个Call,最后一个就是我们前面所找的入口处,前面的四个Call的函数分别是:
__crtGetEnvironmentStringsA : 可能是GetEnvironmentStringsA()的宏定义名称( http://msdn.microsoft.com/en-us/library/ms683187(VS.85).aspx )
_setargv() : 处理命令行参数
_setenvp() :返回环境变量 (这两个函数的作用效果是把参数和环境变量保存到附近的可用“堆(heap)”里面,方便使用。)
_cinit() : 作用就是当检测到我们的参数覆盖了返回地址,能造成缓冲区溢出的时候报错并退出程序。平时我们遇到的讨厌的“遇到问题需要关闭”貌似就是这玩意搞的。
http://msdn.microsoft.com/en-us/library/ms924298.aspx
需要注意的是,很多反汇编代码里面,后面的这三个函数名都不会被直接显示出来,而是显示的函数地址。