上一篇文章中我們已經可以將砸殼后的APP安裝到我們的手機上面了,這里我們將我們自己的代碼,注入到APP中,在APP運行的同時也執行我們自己的代碼。
- 首先我們要思考的是,我們的代碼以什么樣形式去注入到APP中?
1、別人的APP的源碼我們是拿不到的,那么去修改別人的代碼是無法做到的。
2、我們都知道,APP中會引用一些第三方的庫,APP在運行的時候會使用到三方庫的一些內容。既然三方庫可以在APP運行的時候被執行,那我們我們就寫一個三方庫,然后將庫文件注入到APP包里面,那么我們的代碼不就會被執行了嗎!!!
?? ???? :我們下面的操作是在9、應用重簽名原理中最后的使用shell腳本
的工程基礎上做的操作。
動態庫的注入
- 1、將動態庫拷貝到APP包里面
首先我們創建一個Framework
的動態庫,名字就叫JaxHook
:
創建Framework
然后我們在JaxHook
里面寫上這樣一段測試代碼:
測試代碼
然后我們編譯一下,并查看此時APP包里面的Frameworks
文件夾里面的內容:
JaxHook
可以看到我們自行創建的JaxHook.framework
已經被拷貝到APP包里面了。
這樣我們的第一步就完成,也就驗證了我們自己的動態庫確實可以注入到APP包里面。 - 2、使用
yololib
可執行文件,將我們的動態庫引入到APP中的可執行文件里面,這里引入的是地址。
$ ./yololib <可執行文件名> Frameworks/JaxHook.framework/JaxHook
?? 注意:在我們第二步執行完畢之后,需要將修改過的可執行文件從新拷貝到APP包里面去的。這里建議大家從新打包,替換之前的ipa包
(ipa包 -> 解壓 -> 將修改后的可行性文件進行替換 -> 替換之后從新打包
)
///打包指令
$ zip -ry xxx.ipa <解壓后的文件>
將從新打包后的ipa包
,替換之前的ipa包
,然后從新運行工程,運行結果如下:
運行結果
到這里,有一點大家要注意。第一不是為了搞清楚我們自己的動態庫到底能不能注入到APP里面。其實如果我們已經很明確動態庫的名稱和注入后的地址的話,直接操作第二步就可以了。因為動態庫的注入,是Xcode幫我們完成的。
- 使用
shell
腳本注入代碼
1、首先要將yololib可執行文件拷貝到我們的工程根目錄下面。
2、在上一篇文件腳本的基礎上,加上下面一句指令:
./yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/JaxHook.framework/JaxHook"
3、運行我們的工程就可以了。執行效果和上面的一樣。
yololib
是逆向的時候,使用到的一個工具,大家可以去Google一下。
修改APP中的方法執行
上面我們講到了怎么去在APP中注入代碼,但是僅僅是注入代碼是不夠了。下面我們一起來探討一下,如何去影響APP原有方法的執行。
這進行下面的探討的之前,大家要對一個知識點有所掌握,那就是Method Swizzle
。
利用OC的Runtime
特性,動態改變SEL(方法編號)
和IMP(方法實現)
的對應關系,達到OC方法調用流程改變的的目的。主要用于OC方法
方法交換
- 獲取APP中的方法信息(動態分析)
在知道怎么去影響APP的的方法執行之后,我們就需要去獲取APP的方法的相關信息。這個時候,我們可以利用Xcode自帶的ViewDebug
來查看一下,各個控件對應的信息。
可以看到,我們可以通過ViewDebug
查看到控件所在的類名,以及其對應的方法名。這個時候我們就可以通過Method Swizzle
去修改這個方法。讓APP去執行這個方法的時候,實際是在執行我們的方法。 - 獲取APP中的方法信息(靜態分析)
我們還可以利用工具來靜態分析可執行文件里面的函數。然后結合動態分析來快速的定位到我們要修改的部分。
這里推薦一款工具class-dump用于可執行文件的靜態分析,導出里面的方法名。
$ ./class-dump -H <可執行文件名> -o ./headers
/// 將可執行文件里面的函數名全部導出到執行的文件里面(此時指定的文件為`headers`)
yololib和class-dump這兩個工具這里就不為大家提供,大家可以在網上下載最新的版本使用。