MobileSubstrate: пример MSHookFunction - PullRequest
4 голосов
/ 10 мая 2011

Я пытаюсь написать плагин MobileSubstrate, который подключается к C-методу. Я попытался отредактировать знаменитый "ExampleHook", просто написав демо-версию MSHook и подключив его к методу Initialize Это, вероятно, слишком оптимистично, и это не работает. Но я нигде не могу найти простой пример функции MSHookFunction (). В интернете почти нет информации об этом. Возможно, я неправильно понял всю концепцию MSHookFunction.

Пожалуйста, кто-нибудь может мне помочь с небольшим примером кода? Буду очень признателен за любую помощь.

С уважением, Марк Бэкс

1 Ответ

9 голосов
/ 06 августа 2012

Я понимаю, что вы нашли это, но я публикую этот ответ, чтобы помочь тому, кто еще может нуждаться в этом.

Простой пример можно найти на статье MobileSubstrate на iPhoneDev Wiki, и фактическим примером этого в проекте является с этим битом из User Agent Faker .

Но каков ответ без реального объяснения?Таким образом, здесь мы идем!

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. Передаем aуказатель на CFShow, функцию, из которой мы хотим изменить поведение по умолчанию в качестве параметра function.
  2. Передать указатель на функцию, которую мы только что создали, replaced_CFShow в качестве параметра replacement.То есть всякий раз, когда CFShow будет вызываться по умолчанию, вместо него будет вызываться replaced_CFShow.
  3. Мы передаем указатель на указатель на функцию original_CFShow в качестве параметра p_original.Поскольку мы по-прежнему хотим, чтобы все, что CFShow все еще выполняло внутри нашей функции замены, мы вызываем ее.
...