IDA如何找到二进制的main函数
main函数可以反应程序的主要执行流程,在看源代码的时候通常也会通过main函数了解程序的主要功能,那么在看二进制文件的时候怎么找到程序的“main”函数呢?
一般情况下,系统在编译源代码时,会在main函数之前加一些其它的信息,用于给main的执行准备一下环境之类的。二进制文件的入口一般就是_start,然后先执行一些指令,接着就会跳转到main运行,所以可以从_start中找到main函数的位置。
(1)IDA中打开目标二进制文件,一般会自动定位到_start,如果没有的话,也可以在侧边的Functions window中查找_start,然后双击定位。
(2)_start的全部如下图所示,我们可以看到在最后一行通过B指令调用了__uClibc_main函数。
(3)一开始以为这个函数就是main了吧,毕竟函数名里边都有main了,然后双击点进去看这个函数的具体实现。这肯定不是main函数啊,看样子应该是某个库函数。
(4)网上找了一下这个函数的定义,但是没找到。根据一篇文章的启发,推测它的某个参数就是main函数的地址,然后就把目光锁定了最有可能的R0寄存器中的那个值sub_FCB0。点进去看一下,首先就是一大长串的变量,第六感感觉像是main的样子。文章指路:http://blog.sina.com.cn/s/blog_83f3c04c0102xfcb.html(其中还详细介绍了_start的每条指令的含义,可以对照看一下)
(5)还可以F5反汇编一下,返回值int,参数一个是int,一个是char*,完全符合int main(int argc, char* argv)的格式,再往下看一看函数体,基本没跑了。宣布:当事函数sub_FCB0就是main!