我在使用MobileSubstrate的MSHookFunction()来挂钩某些库函数调用时遇到了麻烦。 例如,挂钩memcpy和memset导致应用程序启动时崩溃,但挂钩memcmp工作正常。
我认为这是因为挂钩代码本身使用那些函数调用?
有没有办法在iOS上挂钩memcpy和memset?
答案 0 :(得分:0)
我从来没有深究这一点。我在想,也许MobileSubstrate会在我试图挂钩的同一个内存页面中调用函数,因此内存保护会全部搞砸。
我通过编写自己的挂钩功能来解决这个问题。
答案 1 :(得分:0)
我对memcpy和opendir有同样的情况。 iPhone 5,iOS6.1.2
MSHookFunction有时会将奇数(xxxx3)地址作为原始例程的地址返回。这对ARM来说是无稽之谈。
答案 2 :(得分:0)
我也遇到过这个,我认为失败的原因是加载器作为memcpy的dlsym返回的函数实际上不是真正的函数,而是它的存根。我已经转储地址和字节,解析了libsystem_c并验证了dlsym(RTLD_DEFAULT,“memcpy”)将此后续函数返回给我
; void *memcpy_0(void *, const void *, size_t) __picsymbolstub4:3947B37C EXPORT _memcpy_0 __picsymbolstub4:3947B37C _memcpy_0 ; CODE XREF: _strlcpy+22p __picsymbolstub4:3947B37C ; _strlcpy+32p ... __picsymbolstub4:3947B37C LDR R12, =(_memcpy_ptr - 0x3947B388) ; j__memcpy __picsymbolstub4:3947B380 ADD R12, PC, R12 ; _memcpy_ptr __picsymbolstub4:3947B384 LDR PC, [R12] ; _memcpy __picsymbolstub4:3947B384 ; End of function _memcpy_0 __picsymbolstub4:3947B388 off_3947B388 DCD _memcpy_ptr - 0x3947B388
正如您所看到的,此代码与PC相关,这可能是MSHook失败的原因。 如果您尝试挂钩实际函数,那么这个存根调用的函数 - 它可以工作。