Ida双开定位android so文件
Ida雙開定位的意思是先用ida靜態(tài)分析so文件,然后再開一個ida動態(tài)調(diào)試so文件。因為在動態(tài)調(diào)試中ida并不會對整個動態(tài)加載的so文件進行詳細的分析,所以很多函數(shù)并無法識別出來。比如靜態(tài)分析中有很多的sub_XXXX函數(shù):
但動態(tài)調(diào)試中的ida是沒有這些信息的。
所以我們需要雙開ida,然后通過ida靜態(tài)分析的內(nèi)容來定位ida動態(tài)調(diào)試的函數(shù)。當然很多時候我們也需要動態(tài)調(diào)試的信息來幫助理解靜態(tài)分析的函數(shù)。
在上一節(jié)中,我們提到.init.array中有個sub_2378(),但當ida動態(tài)加載so后我們并無法在module中找到這個函數(shù)。那該咋辦呢?這時候我們就要通過靜態(tài)分析的地址和so文件在內(nèi)存中的基址來定位目標函數(shù)。首先我們看到sub_2378()這個函數(shù)在靜態(tài)分析中的地址為.text:00002378。而在動態(tài)加載中這個so在內(nèi)存中的基址為:4004F000。
因此sub_2378()這個函數(shù)在內(nèi)存中真正的地址應該為4004F000 + 00002378 =40051378。下面我們在動態(tài)調(diào)試窗口輸入”g”,跳轉(zhuǎn)到40051378這個地址。然后發(fā)現(xiàn)全是亂碼的節(jié)奏:
不要擔心,這是因為ida認為這里是數(shù)據(jù)段。這時候我們只要按”P”或者選中部分數(shù)據(jù)按”c”,ida就會把這段數(shù)據(jù)當成匯編代碼進行分析了:
我們隨后還可以按”F5”,將匯編代碼反編譯為c語言。
是不是和靜態(tài)分析中的sub_2378()長的差不多?
我們隨后可以在這個位置加入斷點,再結(jié)合上一節(jié)提到的調(diào)試技巧就可以對init.array中的函數(shù)進行動態(tài)調(diào)試了。
我們接下來繼續(xù)分析自毀程序這道題,當我們在對init.array和JNI_OnLoad()進行調(diào)試的時候,發(fā)現(xiàn)程序在執(zhí)行完dowrd_400552B4()后就掛掉了。
于是我們在這里按”F7”進入函數(shù)看一下:
原來是libc.so的phread_create()函數(shù),估計是app本身開了一個新的線程進行反調(diào)試檢測了。
有意思的是在靜態(tài)分析中我們并不清楚dword_62B4這個函數(shù)是做什么的,因為這個函數(shù)的地址在.bss段還沒有被初始化:
但是當我們動態(tài)調(diào)試的時候,這個地址的值已經(jīng)修改為了phread_create()這個函數(shù)的地址了。:
所以說自毀程序密碼這個app會用pthread_create()開一個新的線程對app進行反調(diào)試檢測。線程會運行sub_16A4()這個函數(shù)。于是我們對這個函數(shù)進行分析,發(fā)現(xiàn)里面的內(nèi)容有大量的混淆,看起來十分吃力。這里我介紹個小trick:常見的反調(diào)試方法都會用fopen打開一些文件來檢測自己的進程是否被attach,比如說status這個文件中的tracerpid的值是否為0,如果為0說明沒有別的進程在調(diào)試這個進程,如果不為0說明有程序在調(diào)試。所以我們可以守株待兔,在libc.so中的fopen()處下一個斷點,然后我們在hex view窗口中設置數(shù)據(jù)與R0的值同步:
這樣的話,當函數(shù)在fopen處停住的時候我們就能看到程序打開了哪些文件。果不其然,程序打開了/proc/[pid]/status這個文件。我們”F8”繼續(xù)執(zhí)行fopen函數(shù),看看返回后的地址在哪。然后發(fā)現(xiàn)我們程序卡在了某個函數(shù)中間,PC上面都是數(shù)據(jù),PC下面才是匯編。這該咋辦呢?
解決辦法還是ida雙開,我們知道現(xiàn)在PC的地址為40050420,libcrackme.so文件的基址為4004F000。因此這段代碼在so中的位置應該是:40050420 - 4004F000 = 1420。因此我們回到ida靜態(tài)分析界面,就可以定位到我們其實是在sub_130C()這個函數(shù)中。于是我們猜測這個函數(shù)就是用來做反調(diào)試檢測的。
因此我們可以通過基址來定位sub_130C()這個函數(shù)在內(nèi)存中的地址:40050420 + 130C = 4005030C。然后我們在4005030C這個地址處按”P”, ida就可以正確的識別整個函數(shù)了。
所以說動態(tài)調(diào)試的時候可以幫我們了解到很多靜態(tài)分析很難獲取到的信息。這也就是ida雙開的意義所在:靜態(tài)幫助動態(tài)定位函數(shù)地址,動態(tài)幫助靜態(tài)獲取運行時信息。
?
轉(zhuǎn)載于:https://www.cnblogs.com/joey-hua/p/4702824.html
總結(jié)
以上是生活随笔為你收集整理的Ida双开定位android so文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1175 连连看
- 下一篇: js 调用后台代码(比较实用,好记)