关于pc寄存器和lldb的一些疑问


#1

看cydia substrate的时候了解了inline hook,其中arm模式下跳转使用 ldr pc,[pc-4]。好像是因为arm流水线的缘故,pc会指向后面第二条指令。但是自己用lldb调试的时候,箭头->指向的指令 和 p/x $pc 是一样的,执行ni会执行当前的指令,这时候pc不应该在下面8byte处吗?
不知道自己哪个地方理解错了,求教~
呃…再补充一个问题:如何实现自己的函数或者系统函数不会inline hook?


#2

超短。可以骗过某些连hook mg都不会的蠢货们。

或者自己检测:kissing_heart:自己检测的话对于c /C++ 函数而言方法得当菜鸡攻击者是很难找到/发现你的检测的

:confused:Enough said


#3

谢谢张总的耐心解答~我也有想到用dladdr之类的去检测,但要是攻击者hook了dladdr那又咋整?是不是除了“超短”没有万全之策?


#4

很多方法哦,除了dladdr
是可以做到不依赖外部API来实现检测的


#5

求张总明示,如何不依赖外部API实现检测~或者给个方向我自己去学习一下


#6

没有太多需要学习的,你只需要想想。你具备所有的知识你只是缺乏创造性的合并这些知识来达成需求的能力


#7

0. 禁止 DYLD_INSERT_LIBRARIES 注入

防御:

使用 __RESTRICT/__restrict

绕过:

修改文件, 去掉该 section

1. 检测 libsubstrate.dylib 是否加载

这里是针对 Cydia Substrate 而言.

uint32_t count =_dyld_image_count();
for(uint32_t i =0; i < count; i++)
{
  //Name of image (includes full path)
  constchar*dyld =_dyld_get_image_name(i);
}

绕过:

直接 hook, 因为 Cydia Substrate 加载时间早.

2. 检测特殊函数名

这里是针对 Cydia Substrate 而言, 比如 MSHookFunction.

3. 检测关键函数的前几条指令内容

一般来说使用 inlinehook 进行 hook 函数, 修改函数的前几条指令为跳转指令.

可以通过这个进行校验.

4. 函数完整性校验

类似迅雷

简单整理下, 我是按照 Cydia Substrate 的 hook 原理的每一步来想的, 不知道全不全

@Aimer 请教张总, 还有遗漏姿势么?


#8

检测函数地址。人在外面想到别的再回你


#9

__RESTRICT可以通过在里面放资源的方式绕过暴力修改。RESTRICT也可以用syscall在运行时Trigger,虽然意义不大