非越獄iPhone ipa注入測試

近期看到mac注入的一些文章,所以對逆向也有興趣,嘗試把別人的demo download下來試了一下,覺得有點意思.不過在mac app的注入過程中發(fā)現(xiàn),處于沙盒運行環(huán)境的app注入不成功,說明沙盒不僅限制了app的行為,從側面還保護了app的入侵.

沙盒不好破解,后來就轉向了iOS方面,在網(wǎng)上看了一些文章之后決定先從重簽開始.

重簽

重簽就是把ipa重新用新的證書和mobileprovision對app進行重新簽名.?

從developer.apple.com中心需要重簽的mobileprovision下載下來,保證你的mobileprovision的證書在本機是正常的.然后從網(wǎng)上下載一些重的工具,或者直接去github上clone代碼自己編譯運行.重簽的工具很多最頻繁的就是iReSign(github:https://github.com/maciekish/iReSign).

重簽的工具運行起來之后界面一般如下:


這里面除了entitlements.plist 其他的大家應該都很熟悉,這個文件可以直接通過mobileprovision文件來生成,你cd到mobileprovision的目錄下,然后執(zhí)行/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i 123.mobileprovision) > entitlements.plist

123.mobileprosion是你的文件名稱,執(zhí)行之后會自動在目錄生成entitlements.plist文件.然后點擊重新簽名,會自動在目錄中生成重新簽名的文件,然后通過xcode,或者ifunbox第三方工具都可以進行安裝,如果提示環(huán)境的安裝錯誤,說明你重簽的mobileprovision文件和下面選擇的證書不匹配.

注意問題:

1.重簽之前需要檢查ipa里面有沒有PlusIns的目錄,里面的插件也是獨立的組件,如果重簽也需要對他們進行重簽,iReSign沒有對PlusIns進行處理,如果需要重簽插件的同學可以自己修改iReSign的源代碼對插件進行重簽,插件也是獨立的主題也需要新的mobileprovision,所以要注意,如果想省事就直接刪除這個目錄,因為插件是獨立的,刪除后不受影響.

2.如果是重簽字通用類型的mobileprovision,比如你想簽別人家的app,比如QQ,淘寶,這些有名的app,這個大公司的app都有簽名驗證,比如QQ登錄的時候會驗證簽名,如果簽名不對就不提供服務,淘寶啟動的時候就檢查簽名,如果簽名不對直接退出app,這種app你不想改別人的bundle id 就可以用通用類型的mobileprovision文件,就是制造的帶*的文件,我每次重簽這些app的時候都會把entitlements.plist里面的bundle id 改一改.這樣就可以了.記住,重簽這些app之后如果需要安裝 需要先把本地的正版app刪除掉,在安裝否則安裝的過程中也會失敗.

注入

重簽是目的是啥,不會只是想看看手機多裝幾個QQ,多裝幾個微信,作為技術人員重簽肯定是想干點壞事,當然不是傷天害理的壞事,只是對app做點壞事,比如插一腳,把自己的代碼注入進去.下面介紹下注入動態(tài)庫.

如果你的app用了動態(tài)庫,編譯之后你會發(fā)現(xiàn)你的.app里面有一個Frameworks的目錄,里面就是放動態(tài)庫的,之前天真的以為把自己寫的動態(tài)庫放在這個目錄,運行的時候就可以自動加載了,后來發(fā)現(xiàn)這根本沒啥用,后來查閱資料之后發(fā)現(xiàn)其實動態(tài)庫的加載全部都在執(zhí)行文件里面存儲在.

用工具MachOView(github:https://github.com/gdbinit/MachOView),打開一個執(zhí)行文件

點擊Load Commands展開,這里面就是記錄app啟動之后的加載的一些命令


LC_LOAD_DYLIB:加載動態(tài)庫.LC_LOAD_WEAK_DYLIB這個可能是可選的加載,比如系統(tǒng)不支持的可以不加載,在xcode添加framework之后如果修改后面的選項為optional可能打包之后就是WEAK類型

隨便點擊一個動態(tài)庫,右邊會顯示響應的加載信息,比如選擇一個UIKit


右邊最下面就是加載的路徑,一般系統(tǒng)級別的動態(tài)庫都是在System/Library/Frameworks或usr.lib下,如果是自定義的看你的目錄編譯的時候是怎么處理的.在app里面@executable_path是當前執(zhí)行文件所在的目錄,如果你的動態(tài)庫是放在Frameworks下你寫入你的動態(tài)庫信息的時候路徑寫成@executable_path/Frameworks如果你自己定義的目錄 比如CustomFrameworks你就寫信息的時候把路徑寫成@executable_path/CustomFrameworks,這樣app啟動之后才能找到加載的動態(tài)庫,注意,如果你的動態(tài)庫是framework而非dylib那你的路徑還得深一層,指向xx.framework 里面的xx文件,那才是動態(tài)庫的文件.

好知道結構了,我們開始插入自己的動態(tài)庫.需要用到的工具yololib(github:https://github.com/KJCracks/yololib)

編譯之后,cd到y(tǒng)ololib目錄,把從.app里面拖出來的執(zhí)行文件放在這個目錄,在這個目錄也建一個Frameworks的目錄(當然你自定義也行),把你的動態(tài)庫放進去,執(zhí)行命令./yololib FileName Frameworks/Dylib.framework/Dylib .注意FileName是你的執(zhí)行文件的名字, DyLib是你的動態(tài)庫的名稱,如果你的動態(tài)庫是Dylib.dylib就Frameworks/Dylib.dylib然后回車.寫入成功之后可以用MachOView檢查一下是否寫成功,然后檢查一下路徑,把執(zhí)行文件和Frameworks的目錄一起拷到.app目錄,然后在外層Payload的文件夾打包成zip,修改擴展名,參考重簽的過程,這樣你的動態(tài)庫就可以注入成功了.

后記

動態(tài)庫可以寫功能強大一點,比如建立一個連接到你的mac上,比如可以參考JSPatch傳遞js代碼過去之后在app里面執(zhí)行.注入也成功了然后可以學習逆向,比如IDA分析代碼,如果不想那么麻煩可以用class-dump直接把執(zhí)行文件的所有頭文件都倒出來,然后參考運行的過程中的一些類的變化,窺探別人app的結構.當然剩下的事得你們自己去干了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容