iOS逆向安防从入门到秃头–InlineHook

小谷秃头合集

  • 目前主流的HOOK框架:OC的Method swizzlingfishHookInlineHookCydia Substrate

  • 关于MethodSwizzlingfishHook,兄弟们估计用的不少了。我就不在这里班门弄斧了~

  • 几天了解一波新秀 — InlineHook

1. Dobby框架

由于InlineHook出来不是针对于iOSMacOS工程的(是全平台的~),所以我们要用cmake编译它

1.1. Dobby框架的安装

  • 首先我们先clone下来(放到你想要放到的目录?)

git clone https://github.com/jmpews/Dobby.git --depth=1

  • 然后我们进入Dobby目录,创建build_for_ios_arm64文件夹(官方推荐目录名),然后进入创建的文件夹~

命令行~

cd Dobby && mkdir build_for_ios_arm64 && cd build_for_ios_arm64

  • 最后我们用cmake编译成xcode工程~ (这个时候在build_for_ios_arm64了)
cmake .. -G Xcode \
-DCMAKE_TOOLCHAIN_FILE=cmake/ios.toolchain.cmake \
-DPLATFORM=OS64 -DARCHS="arm64" -DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=1 -DDEPLOYMENT_TARGET=9.3 \
-DDynamicBinaryInstrument=ON -DNearBranch=ON -DPlugin.SymbolResolver=ON -DPlugin.Darwin.HideLibrary=ON -DPlugin.Darwin.ObjectiveC=ON
复制代码
  • 编译完成~如图所示

1.png

1.2. 生成framework

有了xcode工程了。兄得们,编译成framework还远吗?

  • 首先选择框架进行编译

2.png

  • 编译成功~

3.png

当使用时,可能会报bitcode错误。关上就行了

2. 使用及原理

我们最重要的总是实用性,有机会的话可以理解下的思想~

2.1. InlineHook 的使用

InlineHookfishhook的使用差不多,都比较方便(我首先在项目中举例使用,然后在实战纯地址)

  • 介绍下InlineHookhook函数
// replace function
/**
argv1:hook的函数地址
argv2:新函数的地址
argv3:原始函数指针
*/
int DobbyHook(void *address, void *replace_call, void **origin_call);
复制代码

很形象生动:替换函数

  • 搞起搞起~
// 1 导入framework

// 2 引入头文件

// 3使用

int sum(int a, int b){
    return a + b;
}

int (*sum_p)(int a, int b);

int sumReplace(int a, int b){
    NSLog(@"HOOK住了~");
    return a + b;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    DobbyHook(sum, sumReplace, (void *)&sum_p);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"click ~");
    sum(10, 20);
}
复制代码

就使用这个DobbyHook函数,注:在运行时调用的。不是编译阶段

2.2. 原理分析

兄弟们也可以自己看源码(我看了下源码。感觉有点不合适在博客里面写(C++,汇编啥太多了)),这里我们直接断点看汇编。看看他做了什么操作

  • 我先把DobbyHook函数注释掉,看看原始的汇编

4.png

汇编不太熟悉的兄得们,可以看看我之前的博客(注释超级详细了,哈哈)

  • 观察下DobbyHook函数调用之后的~

5.png

所以说:InlineHook实在运行时hook。然后通过寻找符号地址,改变执行的汇编代码,起到hook的目的

  • 兄弟们都会想到,这样直接改不就影响函数栈平衡了吗?

解释:

如果没有调用原始函数: 接下br x17下面的代码是不会执行了

如果调用了原始函数:首先会记住函数地址。在新函数中实现栈平衡然后在调回原始函数

3. HOOK纯地址

兄得们都清楚,InlineHook主要是用于我们逆向开发中。所以我们获取不到要hook的函数sum ,这个时候兄弟们有什么办法吗?(说实话,我刚开始有点上头的~,我非常自信的想用下某信举例,结果我好像搞不定它。?)

  • 首先我们模拟环境 — 脱符号

6.png

  • 然后我们查看要hook应用的MachO文件

7.png

  • 我们随机找个函数,然后模拟这个函数(我是不知道这个函数是什么的,所以我要通过汇编判断)

  • 我们知道参数为4个字节,初步判断为int型

int xxx(int a, int b){
    return a + b;
}
复制代码

我们判断函数为此(由于用的w0,w1所以判断不是OC方法),而且可以用过MachO获取偏移值为5DD0

#import "InjectTest.h"
#import <mach-o/dyld.h>
#import "DobbyX.framework/Headers/dobby.h"

@implementation InjectTest

//int xxx(int a, int b){
//return a + b;
//}

//原始地址的指针
int (*xxx_p)(int a, int b);

//新函数替代
void xxxReplace(int a, int b){
    NSLog(@"HOOK 到了~");
    xxx_p(a,b);
}

+ (void)load{
    //设置偏移地址
    uintptr_t offset = 0x100005DD0;
    //获取ASLR随机值
    uintptr_t alsr = _dyld_get_image_vmaddr_slide(0);
    //确定函数hook的地址
    offset += alsr;
    
    //HOOK 函数
    DobbyHook((void *)offset, xxxReplace, (void *)&xxx_p);
    
}

@end
复制代码

有一点需要记住。ASLR是不带PAGEZORE

  • 触发函数时,就会被hook住~

8.png

4. 总结

又到了总结的时候了

    1. 兄弟们,咱们离逆向开发又近了一步
    1. 辛亏有兄弟们的支持,我才能坚持学习写博客,必须感谢一波~
    1. 小谷希望和兄弟们在学习的道路上越走越远。只希望在学习的海洋不被落下~
    1. 我觉得HOOK这个东西只有实操才能感受它的优美~ ?
    1. 兄弟们。以后产出博客请多多指点~
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享