MobileSubstrate:MSHookFunction示例

时间:2011-05-09 23:37:06

标签: iphone jailbreak

我正在尝试编写一个挂钩到C方法的MobileSubstrate插件。我试着编写着名的“ExampleHook”,只需编写一个演示MSHook并将其挂钩在Initialize方法中。 这可能过于乐观,但不起作用。但我无法找到MSHookFunction()的简单示例。互联网上几乎没有关于此的信息。我可能会误解MSHookFunction的整个概念。

请问,任何人都可以通过一些示例代码帮助我吗?我非常感谢任何帮助。

祝你好运, Marc Backes

1 个答案:

答案 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"));

在这里,我们:

  1. 将指针发送到CFShow,我们想要将默认行为更改为function参数。
  2. 将指针传递给我们刚刚创建的函数replaced_CFShow作为replacement参数。也就是说,默认情况下,只要调用CFShow,就会调用replaced_CFShow
  3. 我们将指向original_CFShow函数指针的指针作为p_original参数传递。由于我们仍然希望CFShow在我们的替换函数内部完成,我们称之为。