3

我在使用 MobileSubstrate 的 MSHookFunction() 挂钩某些库函数调用时遇到问题。例如,挂钩 memcpy 和 memset 会导致应用程序启动时崩溃,但挂钩 memcmp 可以正常工作。

我认为这是因为挂钩代码本身使用了这些函数调用?

有什么方法可以在 iOS 上挂钩 memcpy 和 memset 吗?

4

3 回答 3

0

我也遇到过这个,我认为失败的原因是加载程序作为 memcpy 的 dlsym 返回的函数实际上不是真正的函数,而是它的存根。我已经转储了地址和字节,解除了 libsystem_c 的缓存,并验证了 dlsym(RTLD_DEFAULT, "memcpy") 将以下函数返回给我

; void *memcpy_0(void *, const void *, size_t)
__picsymbolstub4:3947B37C 导出 _memcpy_0
__picsymbolstub4:3947B37C _memcpy_0 ; 代码外部参考:_strlcpy+22p
__picsymbolstub4:3947B37C ; _strlcpy+32p ...
__picsymbolstub4:3947B37C LDR R12,=(_memcpy_ptr - 0x3947B388);j__memcpy
__picsymbolstub4:3947B380 添加 R12,PC,R12;_memcpy_ptr
__picsymbolstub4:3947B384 LDR PC,[R12];_memcpy
__picsymbolstub4:3947B384 ; 函数_memcpy_0结束
__picsymbolstub4:3947B388 off_3947B388 DCD _memcpy_ptr - 0x3947B388

如您所见,此代码与 PC 相关,这可能是 MSHook 失败的原因。如果您尝试挂钩真正的功能,这个存根调用的那个 - 它可以工作。

于 2014-01-06T15:23:09.823 回答
0

我对 memcpy 和 opendir 也有同样的情况。iPhone 5,iOS6.1.2

MSHookFunction 有时会返回奇数 (xxxx3) 地址作为原始例程的地址。对ARM来说是废话。

于 2013-04-30T07:10:26.577 回答
0

我从来没有深究这一点。我在想,也许 MobileSubstrate 调用了我试图挂钩的同一内存页面中的函数,因此内存保护变得一团糟。

我通过编写自己的挂钩函数解决了这个问题。

于 2012-03-05T10:34:57.457 回答