IDA除錯 Android so檔案的10個技巧

Editor發表於2017-10-20

IDA除錯 Android so檔案的10個技巧

在Android除錯過程中,經常會遇到一些小問題以及解決的方法分享給大家,拋磚引玉。

1、使用模擬器除錯可能經常遇到異常,然後就進行不下去了,最好換成手機。

2、即使用手機時,也可能會遇到異常造成單步或RUN卡死在一條指令上的問題。這樣可以手動的執行這條指令,然後將PC指標設定成為下一條指令位置,開始執行。

3、IDA多執行緒除錯方法

在IDA中如果已經啟動了多個執行緒,並且設定在多個執行緒設定斷點後,此時單步執行時,經常會執行緒亂跳,造成除錯非常不方便。可以採用的方法是比如當前從主執行緒跳到某個其他執行緒,在主執行緒下一條指令設定斷點,然後線上程視窗中將主執行緒supend,這時就不會再跳回到主執行緒了。如果想回到主執行緒,RUN後就會斷點之前設定的斷點。

4、IDA除錯介面配置儲存

配置好的除錯介面,可以通過如下方法儲存起來:點選windows—>save destop..,下次啟動後直接點選windows—>load

destop..即可。

5、arm指令集分為arm指令和thumb指令等,在IDA中對於一個函式或地址判斷是否是ARM還是thrumb看呼叫的地址是否為奇數,如果為奇數則為thrumb指令,如果是4位元組對齊則為ARM指令。

將程式碼設定為thumb指令方法如下,按alt+G,然後讓value=1 為thumb指令,= 0為arm指令。

IDA除錯 Android so檔案的10個技巧

6、出現異常,經常手動bypass, 可以採用下面方法,一勞永逸:

開啟IDA安裝目錄\cfg\exceptions.cfg,並在liunux條目下面按照如下方式修改:

IDA除錯 Android so檔案的10個技巧

7、如何定位到執行so檔案的init或init_array函式

1)從手機或虛擬機器中pull出來linker

2)搜尋字串” [ Calling %s

@ %p for '%s' ]”,見下圖:

IDA除錯 Android so檔案的10個技巧

3)查詢引用此字串的地址:

IDA除錯 Android so檔案的10個技巧

4)到sub_271C處,見下圖 :

IDA除錯 Android so檔案的10個技巧

8 如何定位到jni_load

1)直接在SO檔案中查詢jni_load設定斷點的弊端:

a) 如果SO檔案被處理了,可能是找不到的

b) 如果對應jni_onload被加密了,直接設定斷點,會引起解密失敗

2) 從手機或虛擬機器中pull出來libdvm.so

3) 查詢函式dvmLoadNativeCode

見下圖:

IDA除錯 Android so檔案的10個技巧

往下看,其中呼叫dlopen為載入so,返回時so已經載入,同時已經執行了init等初始化函式。

IDA除錯 Android so檔案的10個技巧

再往下看:

IDA除錯 Android so檔案的10個技巧

9 如何定位到RegisterNatives函式

1)從手機或虛擬機器中pull出來libdvm.so

2)搜尋字串“Registering

JNI native methods for class %s”見下圖

IDA除錯 Android so檔案的10個技巧

3)檢視引用“Registering JNI native methods

for class %s”地址

IDA除錯 Android so檔案的10個技巧

4)到sub_4D424函式看看如下圖:

IDA除錯 Android so檔案的10個技巧

sub_4D424即為RegisterNatives函式地址

10 如何定位載入到記憶體中的dex/jar等的地址

方法一:直接在IDA中按ctrl+S 從已載入中查詢,但是可能找不到(對應動態載入)。

方法二:直接在載入dex/jar的返回結構體中獲取

1) 當dex/jar載入時呼叫的libdvm.so中的函式openDexFileNative。此函式原始碼(android4.4)見下圖:

IDA除錯 Android so檔案的10個技巧

對於dex檔案呼叫dvmRawDexFileOpen(sourceName, outputName, &pRawDexFile, false),並將載入的資訊放入到pRawDexFile中。

對於jar檔案呼叫dvmJarFileOpen(sourceName, outputName, &pJarFile, false),並將載入後的資訊放入pJarFile中。

2) 定位openDexFileNative :搜尋字串“Refusing

to reopen boot DEX '%s'”檢視引用地址就可以定位,看下圖:

IDA除錯 Android so檔案的10個技巧

IDA除錯 Android so檔案的10個技巧

sub_64798即為函式openDexFileNative地址。

3)對於apk/jar等型別 在下圖位置下斷點。其中堆疊sp的內容對應的就是JarFile*

pJarFile

IDA除錯 Android so檔案的10個技巧

IDA除錯 Android so檔案的10個技巧

IDA除錯 Android so檔案的10個技巧

IDA除錯 Android so檔案的10個技巧

通過上面的結構,獲取DEX對應公式如下:Dex addr = [[[sp]+0x28]+4]

4)對於dex型別檔案斷在如下位置:

IDA除錯 Android so檔案的10個技巧

IDA除錯 Android so檔案的10個技巧

通過上面的結構,獲取DEX對應公式如下:Dex addr = [[[sp]+0x4]+4](此方面暫時沒找到dex測試,沒有驗證哦,不過大體方法類似)。

本文由看雪論壇 oooAooo  原創,轉載請註明來自看雪社群

相關文章