我正在尝试编写一个MobileSubstrate插件,以钩取C方法。我试图通过编写演示MSHook并在Initialize方法中钩取它来编辑著名的“ExampleHook”。
这可能过于乐观了,它不起作用。但是我无法找到任何关于MSHookFunction()的简单示例。互联网上几乎没有关于此的信息。我可能误解了整个MSHookFunction的概念。
请问,有人能帮我提供一些示例代码吗?我非常感谢任何帮助。
最好的问候,
Marc Backes
void MSHookFunction(void* function, void* replacement, void** p_original);
是MSHookFunction
的函数定义,这个神奇的函数会使您的函数X()
被Y()
所代替,例如。X()
时,调用将被重定向到Y()
。这基本上是关于函数插入的基本解释。function
是指向你想要插入的函数的函数指针。在我们的简单解释中,这将是指向 X()
的函数指针。replacement
是指向你想要用来替换 function
的函数的函数指针。在我们的快速解释中,这将是指向 Y()
的函数指针。p_original
是一个指向函数指针的指针,从现在开始将指向 function
以前的内容。
这个存在的原因很简单:如果你想修改行为但不想抑制它,你仍然需要调用 X()
的原始内容。但是一个普通的对 X()
的调用将不能按预期工作,因为它将会调用 Y()
而不是默认的 function
。
因此,你需要一个函数指针来调用 X()
,就好像它没有被插入一样。
现在,解释 devwiki 的示例:
static void (*original_CFShow)(CFTypeRef obj); // a function pointer to store the original CFShow().
void replaced_CFShow(CFTypeRef obj) { // our replacement of CFShow().
printf("Calling original CFShow(%p)...", obj);
original_CFShow(obj); // calls the original CFShow.
printf(" done.\n");
}
...
// hook CFShow to our own implementation.
MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);
// From now on any call to CFShow will pass through replaced_CFShow first.
...
CFShow(CFSTR("test"));
在这里,我们:
CFShow
的指针作为 function
参数传递。replaced_CFShow
的指针作为 replacement
参数传递。也就是说,每当默认情况下调用 CFShow
时,就会调用替换函数 replaced_CFShow
。original_CFShow
函数指针的指针作为 p_original
参数传递。既然我们仍然想让 CFShow
自己做的事情在我们的替换函数中完成,我们就需要调用它。