IDA如何找到二進制的main函數

main函數能夠反應程序的主要執行流程,在看源代碼的時候一般也會經過main函數了解程序的主要功能,那麼在看二進制文件的時候怎麼找到程序的「main」函數呢?html

通常狀況下,系統在編譯源代碼時,會在main函數以前加一些其它的信息,用於給main的執行準備一下環境之類的。二進制文件的入口通常就是_start,而後先執行一些指令,接着就會跳轉到main運行,因此能夠從_start中找到main函數的位置。函數

(1)IDA中打開目標二進制文件,通常會自動定位到_start,若是沒有的話,也能夠在側邊的Functions window中查找_start,而後雙擊定位。htm

(2)_start的所有以下圖所示,咱們能夠看到在最後一行經過B指令調用了__uClibc_main函數。blog

(3)一開始覺得這個函數就是main了吧,畢竟函數名裏邊都有main了,而後雙擊點進去看這個函數的具體實現。這確定不是main函數啊,看樣子應該是某個庫函數。get

(4)網上找了一下這個函數的定義,可是沒找到。根據一篇文章的啓發,推測它的某個參數就是main函數的地址,而後就把目光鎖定了最有可能的R0寄存器中的那個值sub_FCB0。點進去看一下,首先就是一大長串的變量,第六感感受像是main的樣子。文章指路:http://blog.sina.com.cn/s/blog_83f3c04c0102xfcb.html(其中還詳細介紹了_start的每條指令的含義,能夠對照看一下)io

(5)還能夠F5反彙編一下,返回值int,參數一個是int,一個是char*,徹底符合int main(int argc, char* argv)的格式,再往下看一看函數體,基本沒跑了。宣佈:當事函數sub_FCB0就是main!編譯

相關文章
相關標籤/搜索