HOOK 简单防护

创建项目

创建一个项目1,添加 fishhook.c 和 fishhook.h 拖两个按钮,测试一下,我们的目的是:按钮1 为我们项目自己内部的交换方法,按钮2 是测试 防止 外部对本项目进行 hook 。

创一个类:


#import "HookManager.h"
#import <objc/message.h>
#import "fishhook.h"

@implementation HookManager

+ (void)load
{
    // 项目内部用到的交换代码
    Method old_method = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btn1Click:));
    Method new_method = class_getInstanceMethod(self, @selector(clickHook:));
    // 交换
    method_exchangeImplementations(old_method, new_method);
    
    // 项目内部所有的 HOOk 代码 ...
    
    
    // 基本防护
    struct rebinding rebind;
    rebind.name = "method_exchangeImplementations";
    rebind.replacement = myExchanged;
    rebind.replaced = (void *)&exchangedP;
    
    struct rebinding rebinds[] = {rebind};
    rebind_symbols(rebinds, 1);
}

/** 保留原来的函数 */
static void (*exchangedP)(Method _Nonnull m1, Method _Nonnull m2);

/** 检测到 hook 的新方法 */
void myExchanged(Method _Nonnull m1, Method _Nonnull m2){
    NSLog(@"系统检测到HooK异常!!!!");
}

- (void)clickHook:(id)sender
{
    NSLog(@"原来 APP 的 Hook 保留!!!!!!");
}

接着创建项目2 ,重签名项目1,注入 Framework,这个过程之前的文章有详细过程,原始 APP 包拷贝 —> 打包为IPA 包 —> 拖入项目2 目标 APP 文件夹中即可。

打包

zip -ry 基本防护2.ipa Payload

运行:

image.png

你会发现外部依然可以 hook 本项目,交换成功,为什么呢?

修改原始项目,在各方法 添加打印语句,重复上述过程,结果如下:

image.png

可以看出加载的先后顺序,就明白为什么了!!!

加载顺序

继续修改原始代码,添加 反 Hook 的 Framework ,把需要防护的类拖入其中:

image.png

重复上面过程,结果如下:

image.png

可以看到这样就有效的防止了外界对项目的 Hook。

如果原始项目内部要继续 Hook 的话,就用:

/** 保留原来的函数 /
static void (
exchangedP)(Method _Nonnull m1, Method _Nonnull m2);

终极章

通过上面的测试,可以初步防护 APP ,防止被 Hook,但是之前介绍过有一个强大的工具,IOS - 逆向工具篇 MoneyDevCydia Substrate 工具,能不能防护抵挡住呢???

MoneyDev hook 成功

依然抵挡不住,

  • 注:Money 中 hook 的代码书写
image.png

开始就忘了修改类名了,一直失败:

image.png

原理

上面 MoneyDev 的这种方式就是用的 Cydia Substrate
MSHookMessageEx 主要作用于Objective-C方法

那如何防的住呢???

继续修改我们的原始项目1代码:

  • Runtime 通过以下方法,依然可以实现交换方法,

method_getImplementation(Method _Nonnull m)
method_setImplementation(Method _Nonnull m, IMP _Nonnull imp)

主要修改如下:

核心部分

然后继续上面的过程,运行:

image.png

可以看到,MoneyDev 也无可奈何,被拒之千里之外!!!

后记

针对这种情况,应该怎么着手 Hook 原始项目呢???修改原始项目的 hook 逻辑??? 删除 Framework ??? 修改 Mach-O 文件???

总之在原项目防护之前 防护 之前 Hook 是指定没错的!!!😁😁😁

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容