我正在尝试编写一个挂钩到C方法的MobileSubstrate插件。我试着编写着名的“ExampleHook”,只需编写一个演示MSHook并将其挂钩在Initialize方法中。 这可能过于乐观,但不起作用。但我无法找到MSHookFunction()的简单示例。互联网上几乎没有关于此的信息。我可能会误解MSHookFunction的整个概念。
请问,任何人都可以通过一些示例代码帮助我吗?我非常感谢任何帮助。
祝你好运, Marc Backes
答案 0 :(得分:9)
我意识到你已经找到了这个,但我发布这个答案是为了帮助其他人可能需要这个。
一个简单的例子可以在iPhone Dev Wiki的the MobileSubstrate article找到,项目中的一个实际例子是 User Agent Faker 的at this bit。
但没有实际解释,答案是什么?所以,我们走了!
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
在我们的替换函数内部完成,我们称之为。