[iOS逆向]10、HOOK防护&MonkeyDev

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连续两个,保存文件即可
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代码

你可能感兴趣的:([iOS逆向]10、HOOK防护&MonkeyDev)