在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指令。
6、出現異常,經常手動bypass, 可以採用下面方法,一勞永逸:
開啟IDA安裝目錄\cfg\exceptions.cfg,並在liunux條目下面按照如下方式修改:
7、如何定位到執行so檔案的init或init_array函式
1)從手機或虛擬機器中pull出來linker
2)搜尋字串” [ Calling %s
@ %p for '%s' ]”,見下圖:
3)查詢引用此字串的地址:
4)到sub_271C處,見下圖 :
8 如何定位到jni_load
1)直接在SO檔案中查詢jni_load設定斷點的弊端:
a) 如果SO檔案被處理了,可能是找不到的
b) 如果對應jni_onload被加密了,直接設定斷點,會引起解密失敗
2) 從手機或虛擬機器中pull出來libdvm.so
3) 查詢函式dvmLoadNativeCode
見下圖:
往下看,其中呼叫dlopen為載入so,返回時so已經載入,同時已經執行了init等初始化函式。
再往下看:
9 如何定位到RegisterNatives函式
1)從手機或虛擬機器中pull出來libdvm.so
2)搜尋字串“Registering
JNI native methods for class %s”見下圖
3)檢視引用“Registering JNI native methods
for class %s”地址
4)到sub_4D424函式看看如下圖:
sub_4D424即為RegisterNatives函式地址
10 如何定位載入到記憶體中的dex/jar等的地址
方法一:直接在IDA中按ctrl+S 從已載入中查詢,但是可能找不到(對應動態載入)。
方法二:直接在載入dex/jar的返回結構體中獲取
1) 當dex/jar載入時呼叫的libdvm.so中的函式openDexFileNative。此函式原始碼(android4.4)見下圖:
對於dex檔案呼叫dvmRawDexFileOpen(sourceName, outputName, &pRawDexFile, false),並將載入的資訊放入到pRawDexFile中。
對於jar檔案呼叫dvmJarFileOpen(sourceName, outputName, &pJarFile, false),並將載入後的資訊放入pJarFile中。
2) 定位openDexFileNative :搜尋字串“Refusing
to reopen boot DEX '%s'”檢視引用地址就可以定位,看下圖:
sub_64798即為函式openDexFileNative地址。
3)對於apk/jar等型別 在下圖位置下斷點。其中堆疊sp的內容對應的就是JarFile*
pJarFile
通過上面的結構,獲取DEX對應公式如下:Dex addr = [[[sp]+0x28]+4]
4)對於dex型別檔案斷在如下位置:
通過上面的結構,獲取DEX對應公式如下:Dex addr = [[[sp]+0x4]+4](此方面暫時沒找到dex測試,沒有驗證哦,不過大體方法類似)。
本文由看雪論壇 oooAooo 原創,轉載請註明來自看雪社群