如何对被hook的方法实现反hook


#1

需求: 最近在研究一个被Hook的OC方法怎么反Hook,遇到个问题一直没想明白。

用logos(实际就是Mobile Substrate的封装)编写tweak,实现了一个OC方法的hook,调试通过dladdr()查看符号信息,发现执行被Hook的OC方法实际上是去执行一个C函数。如:Hook NSString的 componentsSeparatedByString方法,最后执行的是_ZL62_logos_method$_ungrouped$NSString$componentsSeparatedByString$P8NSStringP13objc_selectorS0_函数。这个应该是MSHookMessage内部实现的。

问题:
1、MSHookMessage是怎么实现Hook OC方法转变成C函数的?应该不是runtime的method_exchangeImplementations,否则最后执行的应该还是OC方法。如果是fishhook替换符号表的思路,是用在C函数的,难道MSHookMessage Hook的是objc_msgSend函数?

2、知道自己的方法被Hook了,怎么反Hook?


#2

method_exchangeImplementations 可以直接是一个函数地址,不管是OC还是C


#3

所有的OC函数都是IMP类型。IMP就是个c函数指针。。。。


#4

感谢大佬们指点


#5

这个能否在compiler-rt https://compiler-rt.llvm.org/ 上做”文章“?撸一个AntiHook的Sanitizer之类的 :slight_smile:


#6

我目前的实现不是这样。不过感谢思路


#7

主要很多东西还是要放在我刚开始学的CG Pass,后端我了解的太少了。


#8

后端得有人带,现在是Alex Bradbury 导师在带我维护RISCV 不过最近大家的注意力一下子就被Speculative Execution 抓走了 https://www.leetcode.cn/2018/01/workaround-for-speculative-execution-vulnerabilities.html 这浮躁的社会。。。


#9

主要是后端文档太少了。唉


#10

因为牵扯到芯片细节 :slight_smile: 深圳华强北你懂的,而且LLVM许可证允许不开源,肯定有实现的更好的RegAllocGraphColoring用于某GPU芯片,肯定有实现的更好的ISP流水线优化,源代码一旦开源就可以被逆向猜测硬件设计,这方面GCC后端文档和代码都是开源的,但GCC的体积实在是太大了,我做DragonEgg的时候就在里面迷路好几回,幸好GCC开发者带出来了 :slight_smile: