逆向分析之寻找main函数

来源:互联网 发布:centos 最小安装 编辑:程序博客网 时间:2024/04/30 05:28

逆向分析之寻找main函数

作者: 日月明

时间:2010-01-19

 

工具:ollydbgIDApeid

 

   刚接触逆向分析,看到一行行的汇编代码,不时感到一阵阵头痛,不知道从何入手。思来想去,还是想看看我们在C语言中的main函数它在什么地方吧。。。。。。。。。。。

看看C语言的main函数吧

 int main(int argc, char* argv[])
{
  printf("Hello main!/n");
  return 0;
}

 

   当我们用ollydbg载入一个程序时,程序首先停留在程序入口点(通过peid可以看到)。如图:

 

  

F8ollydbg中单步调试,gogo。。。。。。。。。。。。。。。

 

 

当来到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程序来说,主要是寻找其中的关键地方,没有过多的关注MFCmain函数,所以这里对MFCmain函数就不再过多的讨论了。。

 

 

 

 

原创粉丝点击