延伸
做過游戲外掛的人都知道,代碼注入通常是通過這工具去注入的進(jìn)行測試的【當(dāng)然還有劫持注入等等其他注入方式】
image.png
通常這種測試注入的方式有兩種
- 一種是直接注入?yún)R編代碼 【這種方式只能用在簡單測試。在iPhone中,我們可以通過LLDB、Cycript直接注入OC原生語言進(jìn)行測試,這種方式更加簡單粗暴。其實(shí)我們平時(shí)調(diào)試多多少少都會(huì)用過LLDB,或許你已經(jīng)會(huì)了不少】
- 一種是注入一個(gè).dll的動(dòng)態(tài)庫【這種是windows系統(tǒng)的動(dòng)態(tài)庫。在iphone中,動(dòng)態(tài)庫是Framework與dylib】
所以我們iOS逆向開發(fā)的時(shí)候,就是通過注入動(dòng)態(tài)庫,來實(shí)現(xiàn)代碼的注入的
動(dòng)態(tài)庫的注入【Framework】
第一步 【把之前重簽名的項(xiàng)目整理,優(yōu)化一下】
- 創(chuàng)建一個(gè)新的項(xiàng)目【05_Framework_Inject】
- 創(chuàng)建APP文件夾,把目標(biāo)APP【wechat】放進(jìn)去
image.png
- 創(chuàng)建一個(gè)編譯腳本
image.png
- 把之前【iOS逆向之旅(進(jìn)階篇) — 重簽名APP(二)】里面的腳本,寫到文件
AssignApp.sh
,并放到項(xiàng)目中 - 接著在運(yùn)行腳本的指令中,把
AssignApp.sh
的路徑寫上,運(yùn)行的時(shí)候Xcode就會(huì)自動(dòng)幫我們重簽名
image.png
第二步 【創(chuàng)建一個(gè)Framework】
- 新建一個(gè)Framework,名PFFramework
image.png
- 把Framework添加到工程中
image.png
image.png
這樣就把Framework注入到項(xiàng)目中了
- 添加注入代碼
image.png
- 運(yùn)行,查看結(jié)果
image.png
然而發(fā)現(xiàn)并沒注入成功,原因是由于微信中沒有用到我們的Framework,所以動(dòng)態(tài)庫不會(huì)被加載。
第三步 【修改Macho文件屬性】
這時(shí)我們需要去修改macho的文件屬性,讓微信會(huì)去加載我們的Framework
- 修改wechat可執(zhí)行文件的macho文件屬性
我們會(huì)使用到一個(gè)新的工具:yololib
這個(gè)工具的使用十分簡單
進(jìn)入.app,查看我們PFFrameWork的位置
image.png
進(jìn)入命令行模式,使用該工具,修改其Macho文件屬性
yololib WeChat Frameworks/PFFrameWork.framework/PFFrameWork
然后再重新打包這個(gè)APP
- 顯然這么做太麻煩了,我們可以利用跟簡單的方式【利用腳本的方式去使用該工具】
在原先腳本的末尾添加上
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/PFFramework.framework/PFFramework"
這樣我們的代碼就可以成功注入進(jìn)去了
- 看看結(jié)果
image.png
注:我發(fā)現(xiàn)項(xiàng)目中,有時(shí)會(huì)出現(xiàn)奔潰的現(xiàn)象。
原因是:
項(xiàng)目有時(shí)候PFFramework.framework
時(shí)有時(shí)無,導(dǎo)致了項(xiàng)目偶爾奔潰的現(xiàn)象
image.png
神奇的是項(xiàng)目clean后build肯定能成功,但我還是花了不少時(shí)間把問題定位出來
原來第二次編譯的時(shí)候,編譯器有時(shí)候會(huì)先把PFFramework.framework
放到.app中,然后我們執(zhí)行腳本rm -rf "$TARGET_APP_PATH"
,自然而然就把這個(gè)庫給刪了。
所以我把rm -rf "$TARGET_APP_PATH"
替換成一下這個(gè)函數(shù)
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
}
修改后,就再也不會(huì)出現(xiàn)BUG了
動(dòng)態(tài)庫的注入【dylib】
第一步 【把原理重簽名的項(xiàng)目整理,優(yōu)化一下】
與動(dòng)態(tài)庫的注入【Framework】的第一步一致,這里我就不重復(fù)闡述了
第二步 【創(chuàng)建一個(gè)dylib】
- 新建一個(gè)dylib,名PFLibrary
image.png
- 修改他的平臺(tái)信息,并把mac修改成iOS
image.png
- 修改簽名認(rèn)證把mac developer修改成iOS developer
image.png
- 把dylib添加到工程中
image.png
image.png
- 添加注入代碼
image.png
第三步 【修改Macho文件屬性】
與動(dòng)態(tài)庫的注入【Framework】的第三步大致相同,唯一不同的就是寫入 腳本的yololib不一樣,只要改成以下指令即可
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libPFLibrary.dylib"
查看結(jié)果
image.png
成功了 嘿嘿~~~
代碼晚點(diǎn)我會(huì)上傳到百度云,嘿嘿~