iOS逆向之旅(進階篇) — 程式碼注入

洪呵呵發表於2018-10-26

延伸

做過遊戲外掛的人都知道,程式碼注入通常是通過這工具去注入的進行測試的【當然還有劫持注入等等其他注入方式】

image.png

通常這種測試注入的方式有兩種

  • 一種是直接注入彙編程式碼 【這種方式只能用在簡單測試。在iPhone中,我們可以通過LLDB、Cycript直接注入OC原生語言進行測試,這種方式更加簡單粗暴。其實我們平時除錯多多少少都會用過LLDB,或許你已經會了不少】
  • 一種是注入一個.dll的動態庫【這種是windows系統的動態庫。在iphone中,動態庫是Framework與dylib】

所以我們iOS逆向開發的時候,就是通過注入動態庫,來實現程式碼的注入的

動態庫的注入【Framework】

第一步 【把之前重簽名的專案整理,優化一下】

  • 建立一個新的專案【05_Framework_Inject】
  • 建立APP資料夾,把目標APP【wechat】放進去

image.png

  • 建立一個編譯指令碼

image.png

  • 把之前【iOS逆向之旅(進階篇) — 重簽名APP(二)】裡面的指令碼,寫到檔案AssignApp.sh,並放到專案中
  • 接著在執行指令碼的指令中,把AssignApp.sh的路徑寫上,執行的時候Xcode就會自動幫我們重簽名

image.png

第二步 【建立一個Framework】

  • 新建一個Framework,名PFFramework

image.png

  • 把Framework新增到工程中

image.png
image.png
這樣就把Framework注入到專案中了

  • 新增註入程式碼

image.png

  • 執行,檢視結果

image.png
然而發現並沒注入成功,原因是由於微信中沒有用到我們的Framework,所以動態庫不會被載入。

第三步 【修改Macho檔案屬性】

這時我們需要去修改macho的檔案屬性,讓微信會去載入我們的Framework

  • 修改wechat可執行檔案的macho檔案屬性

我們會使用到一個新的工具:yololib 這個工具的使用十分簡單 進入.app,檢視我們PFFrameWork的位置

image.png
進入命令列模式,使用該工具,修改其Macho檔案屬性 yololib WeChat Frameworks/PFFrameWork.framework/PFFrameWork 然後再重新打包這個APP

  • 顯然這麼做太麻煩了,我們可以利用跟簡單的方式【利用指令碼的方式去使用該工具】

在原先指令碼的末尾新增上 yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/PFFramework.framework/PFFramework" 這樣我們的程式碼就可以成功注入進去了

  • 看看結果

image.png

注:我發現專案中,有時會出現奔潰的現象。

原因是: 專案有時候PFFramework.framework時有時無,導致了專案偶爾奔潰的現象

image.png

神奇的是專案clean後build肯定能成功,但我還是花了不少時間把問題定位出來 原來第二次編譯的時候,編譯器有時候會先把PFFramework.framework放到.app中,然後我們執行指令碼rm -rf "$TARGET_APP_PATH",自然而然就把這個庫給刪了。 所以我把rm -rf "$TARGET_APP_PATH"替換成一下這個函式

function rmFilterFramework(){
    for element in `ls $1`
    do
        if  test "$element" == "Frameworks" || test "$element" == "*.framewrok"; then
            echo $element
            else
            rm -rf $1"/"$element
        fi
    done
}
複製程式碼

修改後,就再也不會出現BUG了

動態庫的注入【dylib】

第一步 【把原理重簽名的專案整理,優化一下】

與動態庫的注入【Framework】的第一步一致,這裡我就不重複闡述了

第二步 【建立一個dylib】

  • 新建一個dylib,名PFLibrary

image.png

  • 修改他的平臺資訊,並把mac修改成iOS

image.png

  • 修改簽名認證把mac developer修改成iOS developer

image.png

  • 把dylib新增到工程中

image.png
image.png

  • 新增註入程式碼

image.png

第三步 【修改Macho檔案屬性】

與動態庫的注入【Framework】的第三步大致相同,唯一不同的就是寫入 指令碼的yololib不一樣,只要改成以下指令即可 yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libPFLibrary.dylib"

檢視結果

image.png
成功了 嘿嘿~~~

程式碼晚點我會上傳到百度雲,嘿嘿~

相關文章