基于地址的C函数hook 可以在非越狱环境下实现吗?


#1

以下代码取自 http://www.alonemonkey.com/2018/02/03/unity-reverse-ios/
请问一下各位大大, 在非越狱的环境下, 这种基于地址的C函数hook, 可以实现吗? 如何实现?

#import <substrate.h>
#import <dlfcn.h>
#import <mach-o/dyld.h>

int (*old_clover_point_stock)(void);

int new_clover_point_stock(void)
{
    return 9999;
}

%ctor
{
    @autoreleasepool
    {
        unsigned long clover_point_stock = _dyld_get_image_vmaddr_slide(0) + 0x100093A2C;
        MSHookFunction((void *)clover_point_stock, (void *)&new_clover_point_stock, (void **)&old_clover_point_stock);
    }
}

#2

可以的,但是有局限而且目前没有完善的开源工具,自己做需要脑科手术般的操作精度。
拓展阅读: 我的博客 http://mayuyu.io/2017/04/04/Random-Thoughts-On-Hooking-Short-Functions/


#3

大大的神作, 拜读了, 可惜英文太烂, 没看明白.
非越狱环境不能hook, 是不是因为IOS底层不允许动态修改可执行代码段的内存?
既然是这样那有什么办法没想明白…
是不是修改二进制文件, 给准备hook的C函数增加一个符号, 再去hook这个符号?


#4

可以的,你找下 fishhook,facebook 开源的框架。


#5

他问的是inline hook


#6

给macho静态添加一个rx的段或者把现有的__TEXT __text调大,然后静态在新的这块地方写入asm,最后把对原来的地址的调用patch到自己的asm上


#7

就是hookzz的静态patch吧,期待中


#8

好久没写ios代码了.一上来就发现好东东


#9

超出能力范围了… 只能期待有好的工具或者框架…


#10

hookzz


#11

参见 HookZz 的ReadMe: https://github.com/jmpews/HookZz/blob/master/README_zh-cn.md
里面写了非越狱状态下不允许分配可以执行的内存, 但我硬是没看明白, 到底是这个坑HookZz 填好了, 还是没填好?

非越狱状态下不允许设置 rw- 为 r-x, 或者 设置 r-x 为 rx-. 具体解释请参考下方坑 [坑-rwx 与 codesigning].

rwx 与 codesigning

对于非越狱, 不能分配可执行内存, 不能进行 code patch.

两篇原理讲解 codesign 的原理

https://papers.put.as/papers/ios/2011/syscan11_breaking_ios_code_signing.pdf
http://www.newosxbook.com/articles/CodeSigning.pdf
以及源码分析如下:

crash 异常如下, 其中 0x0000000100714000 是 mmap 分配的页.

Exception Type: EXC_BAD_ACCESS (SIGKILL - CODESIGNING)
Exception Subtype: unknown at 0x0000000100714000
Termination Reason: Namespace CODESIGNING, Code 0x2
Triggered by Thread: 0
寻找对应的错误码


#12

你是群里的嘛? 如果是群里的我已经回复了. 如果不是请加一下 HookZz Feedback WechatGroup


#13

是的, 已经知道了, 谢谢大大


#14

请问这个问题解决了吗,如果解决是最后是什么方案呢


#15

没有解决.
静等大大出一键静态Patch方案