在使用IDA靜態反匯編時,如果正在逆向的文件中有動態鏈接庫函數(比如調用了程序自定義so庫中的函數),IDA只會顯示一個地址,跟進去會發現是延遲綁定中關於plt的代碼,無法知道具體調用了哪個函數,對於逆向起來很是麻煩,本文介紹如何識別這樣的函數。
按道理講,雖然不能動態調試,靜態分析不能看到運行時綁定的地址,但是具體動態鏈接的過程一定也是根據文件中的信息,所以靜態也一定可以知道調用的是哪個函數,但是我沒有發現如何使用IDA自動確定(如有高手麻煩留言告訴我),於是通過查閱《程序員的自我修養》動態鏈接相關內容,找到了識別動態鏈接庫中函數的方法。需要識別的函數是sub_412160,如圖所示:
從匯編代碼點進去會發現是plt相關代碼,在ARM64中,@page是取頁440000(4kb整數),@PAGEOFF是取頁內偏移20,簡單來講這段應該是取出440020地址存儲的數據放X17,然后跳轉過去,到了got.plt中。
這里面存的全是一樣的地址,正如書中寫的那樣,都還沒綁定具體運行時的地址,再跟兩步發現到了地址是0的地方,就不理解了,可能是鏈接器的地址?
走了這么多彎路,跟完了延遲綁定的過程,下面來看如何識別出sub_412160。
ELF文件中存儲了導入的所有函數符號信息,在IDAi的mport窗口中可以看到,不過IDA沒有自動顯示出來這些函數的地址,但在Linux下使用
readelf -sD 文件名| grep 小寫地址
查看該文件可以看到地址動態符號的地址,grep查找一下就是所需要的識別的函數名。
ELF文件中還存儲了needed的動態鏈接庫,IDA中寫在了該文件的最開始,向上拉窗口可以看到,我們只要從這些so庫中找識別出的函數名即可。使用
grep -rn “函數名”
即可找到調用的哪個庫中的哪個函數。
此外,還有這種形式的動態鏈接調用,再次挖坑做以記錄碰到再研究。
https://reverseengineering.stackexchange.com/questions/9033/how-to-recognize-the-function-call-in-a-dynamic-lib
By Ascii0x03,轉載請注明出處:http://www.cnblogs.com/ascii0x03/p/8313451.html