對於已越獄的設備,系統默認安裝了mobilesubstrate動態庫,提供一個系統級的入侵管道,所有的tweak都可以依賴它來進行開發。而對於沒有越獄的手機,我們需要向目標app注入libsubstrate.dylib動態庫,才能使程序在運行時加載我們編寫的動態庫。
訪問:http://www.jianshu.com/p/cd1f8ae46a3c獲得更好的閱讀體驗~
環境准備:
- [ios-app-signer:應用簽名打包工具(可選)](https://github.om/DanTheMan827/ios-app-- signer.git)
- class-dump:頭文件導出工具
- theos
sudo clone git://github.com/DHowett/theos.git /opt/theos
- libsubstrate.dylib下載到/opt/theos/lib/
- ldid簽名工具下載到/opt/theos/bin/
sudo chmod 777 /opt/theos/bin/ldid
- 配置dpkg-deb下載dm.pl,重命名為dpkg-deb后,放到/opt/theos/bin/
sudo chmod 777 /opt/theos/bin/dpkg-deb
編譯安裝 optool 工具,下載之后需要修改項目Build Setting中Base SDK項為當前系統sdk,否則可能編譯報錯:
# 因為 optool 添加了 submodule,因為需要使用 --recuresive 選項,將子模塊全部 clone 下來
git clone --recursive https://github.com/alexzielenski/optool.git
cd optool
xcodebuild -project optool.xcodeproj -configuration Release ARCHS="x86_64" build
#編譯完成后建議將生成二進制文件放到/usr/local/bin目錄下
實現部分:
1. 在tweak工程目錄下編譯代碼,生成目標庫:
make
可以在./.theos/obj/debug下找到生成的目標庫xxx.dylib
2.修改目標庫依賴文件的相對地址:
otool -L xxx.dylib
查看動態庫的依賴庫,圖中可以看到兩個架構的依賴庫,其中大部分都是系統庫,只有一個需要我們注入的庫。由於
/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
在實際設備上沒有對應的文件,我們需要修改其地址為相對地址:
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib xxx.dylib
如果系統顯示的是/usr/lib/libsubstrate.dylib而不是/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate的話,使用以下命令:(命令中只有依賴地址不同,@loader_path指明相對地址。)
install_name_tool -change/usr/lib/libsubstrate.dylib @loader_path/libsubstrate.dylib xxx.dylib
完成之后我們再次查看依賴庫:
可以看到,依賴庫加載地址已經成功被修改
3.注入xxx.dylib到目標應用中
拷貝libsubstrate.dylib和我們編寫的庫xxx.dylib到需要hook的應用的zzz.app目錄下,修改應用目錄下二進制文件的zzz的Load Commands段:
optool install -c load -p "@executable_path/xxx.dylib" -t ./zzz
#注:zzz為二進制文件名
4.重簽名和打包應用:
codesign -f -s ‘iPhone Developer: xxx(xxx)’ —entitlements xxx.entitlements zzz.app
此處也可以簡單的使用工具一步完成ios-app-signer生成ipa