1、替换系统IMP
1.1、创建FrameWork
在framework中通过fishhook替换系统的IMP
MethodSwizzle
1、method_exchangeImplementations 交换两个IMP
2、class_replaceMethod 替换某个SEL的IMP(如果没有该方法,就添加。相当于替换掉该方法)
3、method_setImplementation、method_getImplementation 获取和设置某个方法的IMP(很多三方框架在使用)
fishhook
Facebook提供的一个工具,利用MachO文件的加载原理,动态修改懒加载两个符号表
原理:
共享缓存:iOS系统有一块特殊的位置,存放公用动态库。动态库共享缓存(dyld shared cache)
PIC技术:
1、由于外部的函数调用,在我们编译时刻是没法确定其内存地址的
2、苹果就采用PIC技术(位置无关代码)。外部函数存放在MachO文件DATA(需要可读可写)段,建立两张表,懒加载和非懒加载,里面存放指向外部函数的指针。
3、首次调用懒加载函数,会去找桩代码。首次执行会执行Binder函数
4、通过字符找到懒加载表:fishhook利用stringTable->Symbols->indirect Symbols->懒加载符号表之间的对应关系。通过重绑定修改指针的值
Cydia Substrate
一个强大的框架
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);
}
//指针!这个可以暴露给外接!我自己的工程使用!!
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(@"检测到了HOOK!");
}
@end
分别导出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、配置环境变量
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)、报错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)、报错2,安装成功,但是退出xcode重新打开xcode闪退问题解决方案
删除文件中/Applications/Xcode.app/Contents/PlugIns/IDEiOSSupportCore.ideplugin/Contents/Resources/Embedded-Device.xcspec连续两个<dict/><dict/>,保存文件即可
3)、报错3,library not found for -libstdc++
解决方案
4)、报错4,安装报错executable not found
解决方案:需要每次运行前,先clean
以上安装步骤均参照github,感谢stackoverflow,感谢github
2.2、MonkeyDev使用
1、安装成功后,在xcode可以看到创建MonkeyDev的入口
MonkeyDev
2、在文件目录下TargetApp下添加需要hook的app或者ipa
app
3、在工程目录下编写需要hook的类和方法 添加hook代码
网友评论