iOS逆向安全之代碼注入

在我們通過將代碼重新簽名(如果對第三方app重簽名不太熟悉的,請參考iOS逆向安全之代碼重簽名)能夠讓我們在本地通過Xcode進(jìn)行代碼調(diào)試后,我們一般會進(jìn)行我們想要進(jìn)行的操作,比如對對方APP包進(jìn)行動態(tài)分析,或者進(jìn)行篡改.這個時候我們?nèi)绻獙Φ谌絘pp進(jìn)行我們自己的修改,我們就會考慮將代碼注入到第三方app中.此時我們就要進(jìn)行代碼注入了.

代碼注入:

在iOS中一般通行的注入手段是通過Framework注入或者dylib注入.

Framework注入:

1.添加framework.?

首先我們在已經(jīng)重簽名的項目中添加一個我們用于注入的framework.并在該framework中添加我們的注入類.

添加一個用于注入的framework

2.編寫注入代碼.

在能夠確保執(zhí)行的接口中編寫我們需要注入的代碼進(jìn)行自己想要的操作.一般為了保證我們注入的代碼能夠執(zhí)行,我們通常是在load方法中編寫.該方法會在我們的注入類被加載的時候調(diào)起.

這里我是將微信的注冊接口進(jìn)行篡改

3.將framework注入到MachO.

此時進(jìn)行運行,framework會被我們的Xcode進(jìn)行打包到App的framework文件夾中,但是依舊不會被加載運行,因為決定一個framework是否被加載,是dyld根據(jù)MachO文件load_commands下的LC_load_dylib字段中是否包含這個framework而定.所以我們需要將這個framework注冊到第三方app的MachO文件里.

dyld會根據(jù)LC_LOAD_DYLIB來加載framework

3.1 我們通過yololib(這個工具可以修改MachO文件)進(jìn)行framework的注入操作.先將yololib放到/user/local/bin路徑下.然后解壓咱們需要注入的app包.(注意一定要確保app是原始的app包!否則會被每次運行時候的重簽名操作給覆蓋!)

我們要修改的app包是原始的app包
來到包內(nèi)的Framework文件夾,我們將會把這個目錄下我們添加的framework注冊到MatchO中

3.2 在終端中通過命令yololib(空格)MachO文件路徑(空格)庫路徑 來將MachO文件里添加我們的framework.

在終端中通過yololib去修改MachO

此時我們就會在MachO中發(fā)現(xiàn)LC_LOAD_DYLIB中多出了我們的framework.具體可以自行用MachOView查看.

3.3 重新打包已經(jīng)更改后的app成ipa包.

生成新的ipa包

4.用新的ipa包進(jìn)行運行調(diào)試,確定是否注入成功.

將新的ipa包放入APP文件夾中并重新進(jìn)行簽名運行

此時我們就可以用新的ipa包進(jìn)行重簽名并運行查看注入效果了.

注入成功的效果

跳坑感受:

才開始做注入時候,一直在簽名那里報錯,最典型的一個坑是簽名失效的錯誤,卡了我?guī)滋?錯誤樣式如下:

簽名失效報錯

我曾經(jīng)一度以為是我在簽名時候的Shell腳本寫錯了,或者是我的證書過期,或者是我用于簽名的權(quán)限文件沒有給app包打上.在一系列的排查,甚至去手動配置項目的framework上面的簽名信息(一般是直接勾選簽名自動管理automaticlly manage signing).結(jié)果還是沒用.后來最終才發(fā)現(xiàn),原來是framework在引入到我們的項目時候,它的開發(fā)版本是最新的,但是我們的設(shè)備版本卻一般比較低,一般開發(fā)人員只會在target那里設(shè)置低開發(fā)版本,framework不會在引入的時候自動匹配你的target版本.(實在是郁悶...),這也是導(dǎo)致簽名失效的原因.所以我們千萬不要忘了將framework在引入的時候手動將其調(diào)整到與target保持一致(低于設(shè)備的系統(tǒng)版本)

DyLib注入:

1.添加一個Dylib.

dylib是在MacOS中

1.1修改它的環(huán)境屬性.

由于dylib是mac環(huán)境下的,所以無法用于在iOS環(huán)境下,需要修改lib的BaseSDK.將其由macOS改為iOS.

修改BaseSDK值為ios

再將其的簽名識別修改為iOSDeveloper.

修改它的sign identity

2.為dylib設(shè)置依賴

由于dylib是Xcode在早期時候引入的,舊版本的Xcode在將文件打包遷移時需要設(shè)置依賴,dylib也是如此.需要我們手動設(shè)置依賴,以確保,我們的dylib為打包進(jìn)app包的framework文件夾中

添加一個依賴

2.1配置依賴

將我們的dylib添加進(jìn)依賴中,并告訴Xcode文件打包的路徑為Framework

3.在dylib中編寫我們的注入代碼.

編寫我們的注入代碼

4.使用yololib將dylib注冊進(jìn)MatchO中.

值得注意的是,dylib直接就是一個文件,并非一個文件夾,所以路徑到dylib包為止并不需要再指向它內(nèi)部的可執(zhí)行文件中.

使用yololib更改MatchO

下面的步驟跟上面的Framework一致,最終運行查看結(jié)果即可.

查看注入結(jié)果

跳坑感受:

最初在做dylib進(jìn)行注入時候,總是報image refrence from的錯誤,dyld在加載時候在路徑下找不到我們的dylib,通過查看app路徑下的framework中確實這個dylib沒有被打包進(jìn)framework文件夾中.我反復(fù)檢查了我的步驟似乎沒有什么問題,不知道是否是因為我的項目framework和dylib同時都引進(jìn)去的原因互相影響還是什么關(guān)系,說一下我的解決方案:我當(dāng)時是直接舍棄Xcode打包操作.將文件的引用關(guān)系給干掉

將這里的CopyFile給干掉

這樣Xcode就不會將我們的包給打進(jìn)Framework里,然后在編譯路徑下,運行編譯后的lib和framework給直接拷貝進(jìn)我們目標(biāo)App的framework中.

將我們Debug中的lib和framework拷貝到我們的目標(biāo)app的framework文件夾中

然后我們再重新將這個app打包成ipa,按照正常的編譯,yololib進(jìn)行注入MatchO,直接運行,這樣編譯器就不會找不到我們的lib以及framework的路徑了.

但是這個解決方案有個致命的弊端就是雖然能夠解決這個問題,但是每次我們修改了我們的注入庫代碼,要重新運行的時候又得重新拷貝編譯結(jié)果,重新打包運行.所以很麻煩,當(dāng)然逆向的工程本來就坑點重重,不管如何解決,只要能解決就成,哈哈哈.

MonkeyDev工具注入:

其實,最好用的注入方式還是使用MonkeyDev工具.將可以省卻從簽名,到配置注入前期的所有事情,MokeyDev的安裝請參考官方文檔:MonkeyDev-WiKi

按照好MonkeyDev后,我們只需要創(chuàng)建一個MonkeyApp就可以了,如果在創(chuàng)建工程時候沒有顯示圖中最后一行的代表MonkeyDev插件沒有安裝成功.

創(chuàng)建MonkeyApp工程

通過MonkeyDev創(chuàng)建工具進(jìn)行重簽非常簡單,只需要在項目工程目錄里的TargetApp中放入需要重簽的ipa或者app包(當(dāng)然所有這些ipa包和app包都需要已經(jīng)砸殼過的)然后直接運行項目就可以了.

在這個文件夾里放入需要重簽的ipa或者app包

MonkeyApp集成了很多Hook的工具類例如常用的fishHook,Cydia substract等.也支持用Logos語法.使用者可以直接用它所提供的已經(jīng)注入的dylib進(jìn)行注入.具體使用方法直接參考上面提供的官方文檔就可以了.

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容