MobileSubstrate: MSHookFunction示例

4
我正在尝试编写一个MobileSubstrate插件,以钩取C方法。我试图通过编写演示MSHook并在Initialize方法中钩取它来编辑著名的“ExampleHook”。 这可能过于乐观了,它不起作用。但是我无法找到任何关于MSHookFunction()的简单示例。互联网上几乎没有关于此的信息。我可能误解了整个MSHookFunction的概念。 请问,有人能帮我提供一些示例代码吗?我非常感谢任何帮助。 最好的问候, Marc Backes

没事了,我想我明白了。 - Marc Backes
你能帮我编译这个类吗?我正在尝试在我的项目中使用以下类http://pastie.org/1882125,但当我编译它时,它显示MSHookfunction未找到。请帮帮我:( - zzzzz
1个回答

11
我意识到你已经找到了这个,但我发布这个答案是为了帮助其他需要的人。在iPhone Dev Wiki上可以找到一个简单的例子,the MobileSubstrate article,而这个项目中实际的例子是在User Agent Fakerat 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"));

在这里,我们:

  1. 将指向要更改默认行为的函数 CFShow 的指针作为 function 参数传递。
  2. 将指向我们刚创建的函数 replaced_CFShow 的指针作为 replacement 参数传递。也就是说,每当默认情况下调用 CFShow 时,就会调用替换函数 replaced_CFShow
  3. 将指向 original_CFShow 函数指针的指针作为 p_original 参数传递。既然我们仍然想让 CFShow 自己做的事情在我们的替换函数中完成,我们就需要调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接