非越獄下 iOS程式碼注入&HOOK微信登入

小可長江發表於2019-02-12

 在之前這篇iOS應用指令碼重簽名中,我們對脫殼的微信安裝包進行重簽名,併成功在真機上執行起來,完成了iOS逆向的準備工作。這一篇我們將通過演示如何HOOK微信登入事件並獲取到使用者密碼,把iOS程式碼注入的幾種方式串起來做個簡單地概述。不管做逆向還是正向開發,這些都能為你提供一些在應用安全攻防方面的思路。
 當拿到別人的脫殼包,想要HOOK別人的方法做些小外掛,首先需要程式執行你寫的程式碼,你才有機會利用runtime的執行時機制去做自己的事情,關於方法混淆的注意事項請參考這一篇。讓程式執行我們寫的程式碼就需要修改MachO檔案,關於MachO我在這一篇裡詳細講解了,這篇主要講程式碼注入的事兒:

  1. Framework注入

    新增自己的Framework:
    非越獄下 iOS程式碼注入&HOOK微信登入
    寫好測試程式碼,在上一篇重簽名指令碼的基礎上加一行修改MachO載入路徑的程式碼:yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/SharonFramework.framework/SharonFramework",Framework檔名為你自己剛剛新增的。直接Run!
    非越獄下 iOS程式碼注入&HOOK微信登入
    大功告成。
  2. Dylib注入

    新增自己的Dylib:
    非越獄下 iOS程式碼注入&HOOK微信登入
     要注意的是這樣新增的MacOS的Dylib需要將BuildSetting-->Base SDK改為iOS,BuildSetting-->CODE SIGN IDENTITY改為iPhone Developer即可在iPhone上執行。
    另外,與Framework不同的是它需要手動新增關聯庫:
    非越獄下 iOS程式碼注入&HOOK微信登入
    同樣在重簽名指令碼中加一行修改MachO可執行檔案路徑的程式碼:yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libSharonLibrary.dylib",dylib檔名為你自己剛剛新增的。直接Run!
    非越獄下 iOS程式碼注入&HOOK微信登入

 至此我們已經完成了程式碼注入的第一步,讓別人的應用在執行時執行我們寫的程式碼,這個過程中你可能會碰到簽名不成功等各種各樣的奇葩問題,不要慌,靜下心分析,實在不行你可以留言^_^ ~,接下來我們要嘗試HOOK微信的登入按鈕事件。

 同步幾個共識:

  • +load 方法的呼叫發生在類或分類被 runtime 載入(編譯後的可執行檔案被裝載到記憶體中)時,只呼叫1次。
  • 子類的 +load 方法會在它的所有父類的 +load 方法之後執行,而分類的 +load 方法會在它的主類的 +load 方法之後執行。
  • 如果子類沒有實現 +load 方法,那麼當它被載入時 runtime 是不會去呼叫父類的 +load 方法的。同理,當一個類和它的分類都實現了 +load 方法時,兩個方法都會被呼叫。
  • 不同的類之間的 +load 方法的呼叫順序是不確定的。
  • 基於+load方法的上述特點,它是實現方法混淆的最佳入口。

通過viewDebug+標頭檔案分析目標Method

非越獄下 iOS程式碼注入&HOOK微信登入
如上圖所示,我們很快定位到登入按鈕的target為WCAccountLoginControlLogic,action為onFirstViewLogin,我們在通過標頭檔案分析一下,class-dump怎麼用相信你Google一下就搞得定,這裡就不贅述啦,拿到微信的所有標頭檔案丟到sublime裡全域性搜尋:
非越獄下 iOS程式碼注入&HOOK微信登入
果然,找到了目標檔案,點選進入標頭檔案檢視Method列表:
非越獄下 iOS程式碼注入&HOOK微信登入
驗證了我們的分析是正確的。 用同樣的方式我們定位賬號密碼輸入頁登入按鈕的target為WCAccountMainLoginViewController,action為onNext:
非越獄下 iOS程式碼注入&HOOK微信登入
我們將通過HOOK登入按鈕點選事件獲取密碼輸入框裡的內容。

MethodSwizzling的幾種姿勢

  1. class_replaceMethod

非越獄下 iOS程式碼注入&HOOK微信登入
class_replaceMethod本身會嘗試呼叫class_addMethod和method_setImplementation,所以直接呼叫class_replaceMethod就可以了。

  1. class_getInstanceMethod & method_setImplementation

非越獄下 iOS程式碼注入&HOOK微信登入

  1. method_exchangeImplementations

    心細的同學一定會發現,在這個場景下,如果直接寫個OC方法然後用method_exchangeImplementations交換新舊方法的實現有問題:
    非越獄下 iOS程式碼注入&HOOK微信登入
    因為my_next中的self是WCAccountMainLoginViewController,呼叫my_next會找不到方法。解決方案是手動為WCAccountMainLoginViewController新增my_next方法。
    非越獄下 iOS程式碼注入&HOOK微信登入
     由此我們也發現,method_exchangeImplementations在分類或子類中對主/父類過載的方法進行交換時更方便些,不會出現上述問題。所以在逆向中一般不直接使用method_exchangeImplementations,更傾向於前兩種方式。

相關文章