AntiHook

AntiFishHook

antiFishHook 是我今年早些写的一个反fishhook的一个反hook工具
根据mach-o的符号动态链接原理,让non-lazy/lazy symbol 指针重新指向对应的symbol stub代码位置,起到在runtime的反hook

那么如何找到符号指针对应的stub代码,其实可以先用MachOView静态的观察数据段的lazy symbol pointers指向的指令的特点。如下图,

每个指针的值减去0x100000000可以得到一个文件偏移的值,0x7E74,0x7E38 … 而文件偏移值指向的是代码段 stub helper的位置, 并且每个函数的指令格式都一样, 如下

1
2
3
ldr w16 #xxxx0
b xxxx1
xxxx0

xxxx0表示ldr w16 #xxxx0指令位置 + 8字节内存地址的数据
xxxx1表示dyld_ stub_binder代码的位置

每个不同的符号,xxxx0是不同的,但是xxxx1的位置是一样的
因此可以知道符号的信息在xxxx0中,那么xxxx0代表什么呢?

首先先来看看xxxx0的值都是些什么吧,xxxx0占用4个字节,某个符号的xxxx0数据如下

0x20,0x01,0x00,0x00, 机器读取的数据为0x0120, 那么这代表什么数据呢?

如果对mach-o比较熟悉的可能知道mach-o有一个Dynamic Loader Info段, 这里一共有四个区,分别是

Rebase Info: pointer rebase的信息
Binding Info: non-lazy symbol pointer绑定需要的信息
Lazy Binding Info: lazy symbol pointer绑定需要的信息
Export Info: 暴露给外部的符号的信息

其实在dyld源码里,dyld_ stub_bind最后会调用fastBindLazySymbol函数,这个函数的第二个参数是lazyBindingInfoOffset, 即0x0120是Binding Info或者Lazy Binding Info区起始开始到符号信息的偏移,而符号信息如下图

可以看到偏移+6 bytes是该符号名,根据这个信息,就可以筛选出stub helper模板指令对应的符号了,从而将non/lazy symbol pointer从新指向对应的stub helper区代码地址,起到anti-fishhook的功能

(其实+6有些HardCode了,之后我又看了下getLazyBindingInfo函数, 发现在BIND_ OPCODE_ SET_ SYMBOL_ TRAILING_ FLAGS_IMM这个字节之后就是symbol Name)

AntiMSHook

antiMSHook 是我最近学习MSHookFunction原理的时候想到一个anti-msHook方案,实现效果和anti-fishhook一样,让msHook在runtime失效。

anti-msHook包括两个hook check和anti-hook

hook check 比较简单,主要是检测函数入口的前面4个指令是否是MSHook的模板指令

anti-hook 则利用了MSHook将被hook的指令分配到新的内存区域(mmap),通过遍历进程的虚拟内存区域,查看可读可执行的区域开头几个指令是否存在下面指令,如果存在,则找到了被msHook的指令。直接jump到该内存区域,执行原来的函数逻辑

1
2
3
ldr x16 #8
br x16
bytes // bytes(pointer) => orig_address + 16

(最近写的,目前我在我的越狱5s上实验是OK的)

单指令Hook检测

在学习iOS inlinehook绕过反调试时产生的想法。
目前还只是想法

还是反调试那个例子

  1. 检查目的函数起始地址到10个(视情况定)指令内是否存在mov x16, #26(0xd2800350); svc #128(0xd4001001) 二进制(检测svc 没被patch)
  2. 参考金丝雀的思路,在写代码时,在目的函数执行前初始化1个变量如int a=0; 在svc指令后面对a++, 目的函数执行完判断a == 1(防止svc 之前patch ret)

(当然完整性校验或许更为简单)