逆向分析之寻找main函数
作者: 日月明
时间:2010-01-19
工具:ollydbg、IDA、peid
刚接触逆向分析,看到一行行的汇编代码,不时感到一阵阵头痛,不知道从何入手。思来想去,还是想看看我们在C语言中的main函数它在什么地方吧。。。。。。。。。。。
看看C语言的main函数吧
int main(int argc, char* argv[])
{
printf("Hello main!/n");
return 0;
}
当我们用ollydbg载入一个程序时,程序首先停留在程序入口点(通过peid可以看到)。如图:
按F8在ollydbg中单步调试,go,go。。。。。。。。。。。。。。。
当来到call dword ptr ds:[<&KERNEL32.GetCommandLineA>]指令后,就说明我们离main函数不远了。我们发现后面有许多call指令,请注意:我们要找的main函数就在其中的某个call中。
那主要函数所对应的是哪个call呢????
再按F8,当来到一个call指令,此时按F7跟入如图:
发现此函数调用了一些系统环境变量初始化的一些函数。显然,它不是我们所要找的main函数。
再按F8,来到call指令,依次跟进,重复上面的过程。当我们来到main函数的call时跟进发现如图:
此call是直接到了一个jmp指令,然后再由jmp所到的地址继续执行。Jmp跳转到如图指令
典型的几个压栈指令。可以看出,这就是我们的main函数入口了。。。。
注意:jmp所到的地址就是我们main函数地址!!!!
终于,我们的mian函数找到了吧。。。。。。
总结:
1. 载入程序来到GetCommandLineA指令处。(离main不远了,就在之后的某个call指令之后)。
2. 依次跟进后面的每个call指令,发现call指令来到jmp后又跳转到几个典型的压栈指令,说明这就是main函数。
以上寻找main函数的方法适用于控制台、win32 等,不适用于由MFC写的程序。
我们知道由MFC写的程序main函数是经过封装的,那我们如何寻找它的main函数呢???
好了,现在我再带大家一起来找一下MFC中的main函数吧。Let’s go ! 。。。。。。
首先,我们来看,进入main函数之前MFC的初始的东东比较多如图:
按F8单步,最后来到了
call dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA
些时,我们发现没有GetCommanLineA函数。也许是执行略有不同吧。来到此指令之后也意味着我们离main函数不远了,依次重复跟进后面的call指令。
跟入call指令之后发现后面还有好多call啊,吓了一跳。。不怕,不怕。我们发现有个call也要来到jmp指令,然后再跳转到一个指定的地址。(这不是和上面的类似了嘛!!)。
注意:jmp跳转到的地址就是我们的main函数。
Yeah,终于找着了吧。。。。
对于我们分析MFC程序来说,主要是寻找其中的关键地方,没有过多的关注MFC的main函数,所以这里对MFC的main函数就不再过多的讨论了。。