聲明
本文僅僅是自己學(xué)習(xí)逆向的記錄,承諾不作任何危害社會(huì)的事情!
demo場(chǎng)景
創(chuàng)建自己的framework和測(cè)試App,將framework嵌入到目標(biāo)App中,然后測(cè)試App發(fā)送推送,目標(biāo)App收到推送。
使用場(chǎng)景
將代碼注入到任意App內(nèi)
代碼注入原理
眾所周知,iOS app 在打包的過(guò)程中將代碼全部轉(zhuǎn)換成了 可執(zhí)行文件 Mach - O 文件,所以我們直接改源碼是萬(wàn)萬(wàn)不可能的(除非你拿到的源碼,話說(shuō)你源碼都拿到了你還逆向個(gè)啥?)。那么我們可不可以以第三方lib的方式注入呢?必須可以?。?!
那么怎么才能將第三方的lib 注入目標(biāo)程序呢?這個(gè)我們要從二進(jìn)制文件的結(jié)構(gòu)說(shuō)起,Mach-O文件的數(shù)據(jù)主體可分為三大部分,分別是頭部(Header)、加載命令(Load commands)、和最終的數(shù)據(jù)(Data)。mobileloader會(huì)在目標(biāo)程序啟動(dòng)時(shí),會(huì)根據(jù)指定的規(guī)則檢查指定目錄是否存在第三方庫(kù),如果有,則會(huì)通過(guò)修改二進(jìn)制的loadCommands,來(lái)把自己注入進(jìn)所有的app當(dāng)中,然后加載第三方庫(kù)。
代碼注入思路
dyld會(huì)動(dòng)態(tài)加載ipa包內(nèi)Frameworks中所有的動(dòng)態(tài)庫(kù),那么在Frameworks中增加一個(gè)自己的動(dòng)態(tài)庫(kù)(framework),然后在自己動(dòng)態(tài)庫(kù)中寫(xiě)要注入的代碼。
準(zhǔn)備
1、yololib
下載地址:https://github.com/KJCracks/yololib?spm=a2c4e.11153940.blogcont63256.9.5126420eAJpqBD
下載成功后,運(yùn)行工程,把工程里面的yololib拷貝出來(lái)(下圖紅框內(nèi)文件),然后把yololib復(fù)制到/usr/local/bin,后面便可直接在終端用命令行使用

2、目標(biāo)ipa包
3、注入的代碼(framework)
開(kāi)始
1、解壓ipa包---->顯示包內(nèi)容---->替換包內(nèi)證書(shū)配置文件(embedded.mobileprovision)
2、將要注入的代碼(Hook.framework)拷貝到包內(nèi)的Frameworks文件夾中

3、使用yololib去添加動(dòng)態(tài)庫(kù)依賴(修改目標(biāo)App文件夾的ipa包中的MachO),將Hook.framework(添加到Frameworks文件夾內(nèi)的)加到ipa包中MachO文件
解壓ipa,找到MachO文件

cd到App所在文件夾下
使用命令
yololib TestApp Frameworks/Hook.framework/Hook
第一個(gè)參數(shù)指定被修改的mach-o文件的路徑,第二個(gè)參數(shù)指定動(dòng)態(tài)庫(kù)的路徑
主要,這邊的TestApp后面不要帶上.app,比如TestApp.app,只要寫(xiě)TestApp

看到complete! 說(shuō)明添加動(dòng)態(tài)庫(kù)依賴成功
接下來(lái)將Payload壓縮生成一個(gè)Payload.zip,接著將Payload.zip后綴名改成.ipa,生成Payload.ipa,并對(duì)Payload.ipa重簽名
重簽名成功后,將App安裝到手機(jī)上運(yùn)行

推送過(guò)來(lái)了,說(shuō)明代碼注入成功了!