Cydia Substrate Android: MSHookFunction вылетает с фатальным сигналом 11

Я использую внешнюю библиотеку .so и пытаюсь заменить ее функцию на мою, используя MSHookFunction из Cydia Substrate.

Вот код:

void *handle = dlopen("libmylib.so", RTLD_LAZY);
void *sym = dlsym(mcpelibhandle, "_ZN5Level4tickEv");
__android_log_print(ANDROID_LOG_DEBUG, "test", "handle: %p dlsym: %p", handle, sym);
MSHookFunction(sym, (void*) tick_hook, (void**) tick_original);

MSHookFunction выдает эту ошибку:

Fatal signal 11 (SIGSEGV), code 2, fault addr 0xdfc849f0 in tid 7472

libmylib.so загружается перед загрузкой этого кода, дескриптор и символ не равны NULL, и я также проверил его наличие в библиотеке с помощью IDA, поэтому нет сомнений, что эта часть верна. Я буду признателен за любую помощь.

ОБНОВИТЬ

Он вылетает с той же ошибкой, если я вызываю его по собственной функции в том же файле, получая указатель:

MSHookFunction((void*) &func_to_hook, (void*) &func_hook, (void**) &func_real);

1

Решение

Кажется, я нашел решение.

MSHookFunction неправильно использует mprotect для предоставления себе доступа к адресу, его модификации. Я вызывал mprotect для страниц памяти до и после, и в обоих случаях он начал работать отлично.

Этот код прекрасно работает для меня:

bool hookLibFunction(void *origin, void *hook, void **result) {
int pagesize = sysconf(_SC_PAGESIZE);
int protectsize = pagesize * 4;
void *protectaddr = (void*) ((int) origin - ((int) origin % pagesize) - pagesize);

int protectresult = mprotect(protectaddr, protectsize, PROT_EXEC | PROT_READ | PROT_WRITE );

if (protectresult == 0) { // success
MSHookFunction(origin, hook, result);
__android_log_print(ANDROID_LOG_DEBUG, LOGGER_TAG, "function hook for address %p successed.");
return true;
}
else { // fail
__android_log_print(ANDROID_LOG_DEBUG, LOGGER_TAG, "function hook for address %p failed: mprotect=%i, err=%i", origin, protectresult, errno);
return false;
}
}
0

Другие решения

Других решений пока нет …