斷點的設置,本質上就是動態調試時,在大量代碼中快速找到關鍵代碼的過程。
在 Android 逆向過程中,設置斷點有兩個思路:
一)。順流程思路
拿登錄流程來說,必定有用戶名及密碼輸入框以及登錄按鈕!
順流程思路的關鍵,就是找到登錄按鈕點擊事件的處理函數!(或者回車鍵盤處理函數)
然後一級級分析函數的下層調用關係,直到向服務器發送請求數據部分爲止
數據加密、封裝請求包,一定是在這個過程中進行的!
(注:加密、封包等操作不一定是在同一線程中進行,要分析的目標程序有可能會另外開新線程來做這些操作)
還是拿登錄流程來說,當輸入錯誤的密碼並點擊登錄按鈕後,
服務器端必定返回登錄失敗的代碼,然後客戶端也必定會提示密碼錯誤!
提示密碼錯誤,就是顯示字符串的過程,所以,逆流程的關鍵是:
找到顯示這個字符串的函數,然後從這個函數開始,逐層分析上層調用者,直到接收服務器數據的網絡請求部分!
數據解密、解封響應包,一定是在這個過程中進行的!
(注:有可能開新線程)
如何找到登錄按鈕點擊事件的處理函數?
第1步:使用android sdk 的 "UI Automator Viewer" 工具找到登錄按鈕的資源ID:
(這個工具在 android sdk 目錄中, 如:D:\Android\sdk\tools\uiautomatorviewer.bat )
第二步:使用 adb shell dumpsys activity | findstr "mFocusedActivity" 指令取當前界面所屬的包名及界面的類名
得到的類名像這樣:com.lenovo.testApp/.ui.LoginUI
上面兩步得到了 登錄按鈕的資源ID 和 界面的類名
這時,只要在分析反編譯出來的代碼中分析這個界面類,查找這個資源相關的代碼,即可以找到登錄按鈕的 onclick 函數
但很多時候,資源ID不是一個數字的時候,則說明這個資源ID被做了映射或轉化
遇到這種情況也不難找出真正的資源ID
步驟如下:
a). 使用 xsearch 等文件內容搜索工具,在反編譯出來的源碼目錄中搜索type="id" name="從界面找到的那個按鈕的資源ID"
<public type="id" name="bd4" id="0x7f100b3a" />
然後再用 xsearch 搜索 7f100b3a, 得到一個變量名: ceo
然後使用 JEB2 定位到 R$h.smali 類, 經 JEB2 反編譯後的代碼, 這個類名應該變成 R 了
查找 ceo (JAVA 區分大小寫)的交叉引用函數,找到如下的代碼:
雙擊找到的交叉引用函數,定位到這個函數體代碼
將按鈕重命名爲 btnLogin 後,找其 onclic 函數也就是掃一眼LoginUI類代碼的事。。。
如何找到顯示密碼錯誤字符串的函數?
一般的, 在打包 apk 的時候,字符串也被編譯成資源, 也一樣有資源ID
找人方法跟上面差不多, xsearch 全目錄搜索錯誤提示信息,如:帳號或密碼,請重新輸入。。。。
跟找按鈕資源ID過程的惟一的區別是:
type="id" name="=:> type="string" name="字符串ID"
秀一下成功下斷的截圖:
以上,就是在反編譯代碼中,定位到關鍵類和關鍵函數的具體步驟!
記個筆記,免得以後忘了。