Всех приветствую.
На днях пришла идея пореверсить один известный CRMP-мобайл проект, чем я собственно и занялся.
Но, какую бы я функцию не пробовал хукать, итог один - краш. Сидеть рандомно искать ошибку я не хотел, поэтому написал простенький краш хандлер:
Однако, к большому сожалению, код не завелся, хотя на предыдущих приложениях, что я реверсил, все было четко.
Тогда в голову пришла идея - что, если хандлер резервируется процессом игры и из-за этого мой хандлер не получает информации?
Чтобы проверить догадку, понадобилось секунд 10, и вот оно:
Тогда я подумал, что если при старте попробовать загрузить туда свою структуру? В принципе, может сработать, так что почему бы и нет?
Однако, чуда не произошло, на этот раз я получил краш при попытке вызова функции INT123_catchsignal.
Подскажите, пожалуйста, в чем моя ошибка?
На днях пришла идея пореверсить один известный CRMP-мобайл проект, чем я собственно и занялся.
Но, какую бы я функцию не пробовал хукать, итог один - краш. Сидеть рандомно искать ошибку я не хотел, поэтому написал простенький краш хандлер:
C++:
void crash_handler(int signum, siginfo_t *info, void* contextPtr) {
ucontext* context = (ucontext_t*)contextPtr;
if (info->si_signo == SIGSEGV) {
uintptr_t pc, lr;
#if defined(__arm__)
pc = context->uc_mcontext.arm_pc;
lr = context->uc_mcontext.arm_lr;
#endif
__android_log_print(ANDROID_LOG_ERROR, "CrashHandler", "Segmentation fault at address 0x%x, return address: 0x%x", pc, lr);
exit(EXIT_FAILURE);
}
}
__attribute__((constructor))
void lib_main() {
struct sigaction act;
act.sa_sigaction = crash_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &act, 0);
}
Однако, к большому сожалению, код не завелся, хотя на предыдущих приложениях, что я реверсил, все было четко.
Тогда в голову пришла идея - что, если хандлер резервируется процессом игры и из-за этого мой хандлер не получает информации?
Чтобы проверить догадку, понадобилось секунд 10, и вот оно:
C++:
unsigned int __fastcall INT123_catchsignal(int a1, int a2)
{
int v3; // r1
unsigned int result; // r0
unsigned int v5; // [sp+4h] [bp-2Ch] BYREF
int v6; // [sp+14h] [bp-1Ch] BYREF
_DWORD v7[3]; // [sp+18h] [bp-18h] BYREF
v6 = a2;
sigemptyset((sigset_t *)v7);
v7[1] = 0;
v3 = sigaction(a1, (const struct sigaction *)&v6, (struct sigaction *)&v5);
result = v5;
if ( v3 == -0x1 )
return -0x1;
return result;
}
Тогда я подумал, что если при старте попробовать загрузить туда свою структуру? В принципе, может сработать, так что почему бы и нет?
C++:
void install_crash_handler();
void SetupHooks() {
do {
sleep(1);
} while (!findLibrary(targetLibName));
LOG(ANDROID_LOG_INFO, format_char("Target lib address is 0x%X", findLibrary(targetLibName)).get());
install_crash_handler();
}
void install_crash_handler() {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = crash_handler;
int result = ((int(*)(int code, int func))getAbsoluteAddress(targetLibName, 0x391604))(14, (int)&sa);
__android_log_print(ANDROID_LOG_INFO, "CrashHandler", "Install crash handler func returned %d.", result);
}
Однако, чуда не произошло, на этот раз я получил краш при попытке вызова функции INT123_catchsignal.
Подскажите, пожалуйста, в чем моя ошибка?