延伸
做過遊戲外掛的人都知道,程式碼注入通常是通過這工具去注入的進行測試的【當然還有劫持注入等等其他注入方式】
通常這種測試注入的方式有兩種
- 一種是直接注入彙編程式碼 【這種方式只能用在簡單測試。在iPhone中,我們可以通過LLDB、Cycript直接注入OC原生語言進行測試,這種方式更加簡單粗暴。其實我們平時除錯多多少少都會用過LLDB,或許你已經會了不少】
- 一種是注入一個.dll的動態庫【這種是windows系統的動態庫。在iphone中,動態庫是Framework與dylib】
所以我們iOS逆向開發的時候,就是通過注入動態庫,來實現程式碼的注入的
動態庫的注入【Framework】
第一步 【把之前重簽名的專案整理,優化一下】
- 建立一個新的專案【05_Framework_Inject】
- 建立APP資料夾,把目標APP【wechat】放進去
- 建立一個編譯指令碼
- 把之前【iOS逆向之旅(進階篇) — 重簽名APP(二)】裡面的指令碼,寫到檔案
AssignApp.sh
,並放到專案中 - 接著在執行指令碼的指令中,把
AssignApp.sh
的路徑寫上,執行的時候Xcode就會自動幫我們重簽名
第二步 【建立一個Framework】
- 新建一個Framework,名PFFramework
- 把Framework新增到工程中
這樣就把Framework注入到專案中了
- 新增註入程式碼
- 執行,檢視結果
然而發現並沒注入成功,原因是由於微信中沒有用到我們的Framework,所以動態庫不會被載入。
第三步 【修改Macho檔案屬性】
這時我們需要去修改macho的檔案屬性,讓微信會去載入我們的Framework
- 修改wechat可執行檔案的macho檔案屬性
我們會使用到一個新的工具:yololib 這個工具的使用十分簡單 進入.app,檢視我們PFFrameWork的位置
進入命令列模式,使用該工具,修改其Macho檔案屬性yololib WeChat Frameworks/PFFrameWork.framework/PFFrameWork
然後再重新打包這個APP
- 顯然這麼做太麻煩了,我們可以利用跟簡單的方式【利用指令碼的方式去使用該工具】
在原先指令碼的末尾新增上
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/PFFramework.framework/PFFramework"
這樣我們的程式碼就可以成功注入進去了
- 看看結果
注:我發現專案中,有時會出現奔潰的現象。
原因是:
專案有時候PFFramework.framework
時有時無,導致了專案偶爾奔潰的現象
神奇的是專案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
- 修改他的平臺資訊,並把mac修改成iOS
- 修改簽名認證把mac developer修改成iOS developer
- 把dylib新增到工程中
- 新增註入程式碼
第三步 【修改Macho檔案屬性】
與動態庫的注入【Framework】的第三步大致相同,唯一不同的就是寫入 指令碼的yololib不一樣,只要改成以下指令即可
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libPFLibrary.dylib"
檢視結果
成功了 嘿嘿~~~
程式碼晚點我會上傳到百度雲,嘿嘿~