看cydia substrate的时候了解了inline hook,其中arm模式下跳转使用 ldr pc,[pc-4]。好像是因为arm流水线的缘故,pc会指向后面第二条指令。但是自己用lldb调试的时候,箭头->指向的指令 和 p/x $pc 是一样的,执行ni会执行当前的指令,这时候pc不应该在下面8byte处吗?
不知道自己哪个地方理解错了,求教~
呃…再补充一个问题:如何实现自己的函数或者系统函数不会inline hook?
关于pc寄存器和lldb的一些疑问
B0B0
#1
Zhang
#2
超短。可以骗过某些连hook mg都不会的蠢货们。
或者自己检测:kissing_heart:自己检测的话对于c /C++ 函数而言方法得当菜鸡攻击者是很难找到/发现你的检测的
Enough said
jmpews
#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 请教张总, 还有遗漏姿势么?