1、替換系統(tǒng)IMP
1.1屉来、創(chuàng)建FrameWork
在framework中通過fishhook替換系統(tǒng)的IMP
MethodSwizzle
1路翻、method_exchangeImplementations 交換兩個(gè)IMP
2、class_replaceMethod 替換某個(gè)SEL的IMP(如果沒有該方法茄靠,就添加茂契。相當(dāng)于替換掉該方法)
3、method_setImplementation慨绳、method_getImplementation 獲取和設(shè)置某個(gè)方法的IMP(很多三方框架在使用)
fishhook
Facebook提供的一個(gè)工具掉冶,利用MachO文件的加載原理真竖,動(dòng)態(tài)修改懶加載兩個(gè)符號(hào)表
原理:
共享緩存:iOS系統(tǒng)有一塊特殊的位置,存放公用動(dòng)態(tài)庫(kù)厌小。動(dòng)態(tài)庫(kù)共享緩存(dyld shared cache)
PIC技術(shù):
1恢共、由于外部的函數(shù)調(diào)用,在我們編譯時(shí)刻是沒法確定其內(nèi)存地址的
2璧亚、蘋果就采用PIC技術(shù)(位置無關(guān)代碼)讨韭。外部函數(shù)存放在MachO文件DATA(需要可讀可寫)段,建立兩張表癣蟋,懶加載和非懶加載透硝,里面存放指向外部函數(shù)的指針。
3疯搅、首次調(diào)用懶加載函數(shù)濒生,會(huì)去找樁代碼。首次執(zhí)行會(huì)執(zhí)行Binder函數(shù)
4幔欧、通過字符找到懶加載表:fishhook利用stringTable->Symbols->indirect Symbols->懶加載符號(hào)表之間的對(duì)應(yīng)關(guān)系罪治。通過重綁定修改指針的值
Cydia Substrate
一個(gè)強(qiáng)大的框架
AntiHookCode代碼
@implementation AntiHookCode
+(void)load {
//exchange
struct rebinding exchange;
exchange.name = "method_exchangeImplementations";
exchange.replacement = my_exchange;
exchange.replaced = (void *)&exchangeP;
//setIMP
struct rebinding setIMP;
setIMP.name = "method_setImplementation";
setIMP.replacement = my_exchange;
setIMP.replaced = (void *)&setIMP_p;
//getIMP
struct rebinding getIMP;
getIMP.name = "method_getImplementation";
getIMP.replacement = my_exchange;
getIMP.replaced = (void *)&getIMP_p;
struct rebinding bds[] = {exchange,setIMP,getIMP};
rebind_symbols(bds, 3);
}
//指針!這個(gè)可以暴露給外接!我自己的工程使用!!
void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
IMP _Nonnull (*setIMP_p)(Method _Nonnull m, IMP _Nonnull imp);
IMP _Nonnull (*getIMP_p)(Method _Nonnull m);
void my_exchange(Method _Nonnull m1, Method _Nonnull m2){
NSLog(@"檢測(cè)到了HOOK!");
}
@end
分別導(dǎo)出exchangeP、setIMP_p礁蔗、getIMP_p供外界使用
CF_EXPORT void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
CF_EXPORT IMP _Nonnull (*setIMP_p)(Method _Nonnull m, IMP _Nonnull imp);
CF_EXPORT IMP _Nonnull (*getIMP_p)(Method _Nonnull m);
2觉义、MonkeyDev
2.1、安裝步驟
1瘦麸、安裝theos
sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
2谁撼、配置環(huán)境變量
export PATH=$PATH:$/opt/theos/bin
3、安裝MonkeyDev(需要耐心滋饲,翻墻多試幾次)
sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"
1)厉碟、報(bào)錯(cuò)1
File /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Package Types.xcspec not found
解決方案
//建立軟鏈接
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications
2)、報(bào)錯(cuò)2屠缭,安裝成功箍鼓,但是退出xcode重新打開xcode閃退問題解決方案
刪除文件中/Applications/Xcode.app/Contents/PlugIns/IDEiOSSupportCore.ideplugin/Contents/Resources/Embedded-Device.xcspec連續(xù)兩個(gè)<dict/><dict/>,保存文件即可
3)呵曹、報(bào)錯(cuò)3款咖,library not found for -libstdc++
解決方案
4)、報(bào)錯(cuò)4奄喂,安裝報(bào)錯(cuò)executable not found
解決方案:需要每次運(yùn)行前铐殃,先clean
以上安裝步驟均參照github,感謝stackoverflow跨新,感謝github
2.2富腊、MonkeyDev使用
1、安裝成功后域帐,在xcode可以看到創(chuàng)建MonkeyDev的入口
2赘被、在文件目錄下TargetApp下添加需要hook的app或者ipa
3是整、在工程目錄下編寫需要hook的類和方法