iOS--逆向

HOOK 简单防护

2018-07-25  本文已影响0人  Superman168

创建项目

创建一个项目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 成功

依然抵挡不住,

image.png

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

image.png

原理

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

那如何防的住呢???

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

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

主要修改如下:

核心部分

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

image.png

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

后记

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

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

上一篇 下一篇

猜你喜欢

热点阅读