typedef int (*JNI_OnLoadFunc)(JavaVM *vm, void *reserved);
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
shadowhook_init(SHADOWHOOK_MODE_UNIQUE, (bool)1);
if (stub_dlopen == NULL)
{
int err_num = shadowhook_get_errno();
const char *err_msg = shadowhook_to_errmsg(err_num);
LOG("hook dlopen error %d - %s", err_num, err_msg);
}
else
{
LOG("hook dlopen success!");
}
libdexhelper_handle = dlopen("libDexHelper1.so", RTLD_NOW);
if (libdexhelper_handle == NULL)
{
LOG(" [!] Could not dlopen file! (%s)\n", dlerror());
return -1;
}
LOG(" [+] Library Loaded!\n");
JNI_OnLoadFunc onLoadFunc = (int (*)(JavaVM * vm, void *reserved)) dlsym(libdexhelper_handle, "JNI_OnLoad");
if (onLoadFunc == NULL)
{
LOG(" [!] No JNI_OnLoad found!\n");
return -1;
}
LOG(" [+] Found JNI_OnLoad: %p\n", onLoadFunc);
libdexhelper_base = (unsigned long)onLoadFunc - 0x00026468;
LOG("libdexhelper_base: %lx", libdexhelper_base);
void * libSdkHelper_Sin_handle = dlopen("libSdkHelper_Sin1.so", RTLD_NOW);
if (libSdkHelper_Sin_handle == NULL)
{
LOG(" [!] Could not dlopen libSdkHelper_Sin1.so ! (%s)\n", dlerror());
return -1;
}
LOG(" [+] Library Loaded: libSdkHelper_Sin1.so \n");
JNI_OnLoadFunc sdkhelper_onLoadFunc = (int (*)(JavaVM * vm, void *reserved)) dlsym(libSdkHelper_Sin_handle, "JNI_OnLoad");
if (sdkhelper_onLoadFunc == NULL)
{
LOG(" [!] No JNI_OnLoad found!\n");
return -1;
}
LOG(" [+] Found JNI_OnLoad: %p\n", sdkhelper_onLoadFunc);
libSdkHelper_Sin_base = (unsigned long)sdkhelper_onLoadFunc - 0x00012C30;
LOG("libSdkHelper_Sin_base: %lx", libSdkHelper_Sin_base);
pthread_create_stub = shadowhook_hook_sym_name("libc.so", "pthread_create", (void *)proxy_pthread_create, (void **)&orig_pthread_create);
if(pthread_create_stub == NULL)
{
int err_num = shadowhook_get_errno();
const char *err_msg = shadowhook_to_errmsg(err_num);
LOG("hook pthread_create error %d - %s", err_num, err_msg);
}
else{
LOG("hook pthread_create success!");
}
unsigned char * address_of_kill = (unsigned char *)dlsym(libdexhelper_handle, "pDD13E0C66A8F8BF92E99643C59C3B809");
LOG("pDD13E0C66A8F8BF92E99643C59C3B809 address_of_kill: %p", address_of_kill);
address_of_kill[8] = 0x00;
address_of_kill[9] = 0x00;
address_of_kill[10] = 0xa0;
address_of_kill[11] = 0xe3;
LOG("pDD13E0C66A8F8BF92E99643C59C3B809 patched");
LOG("start patch 0x005B6E8...");
unsigned char * address_of_5B6E8 = address_of_kill-0x5ed4;
LOG("address_of_5B6E8 : %p", address_of_5B6E8);
address_of_5B6E8[0] = 0xbd;
address_of_5B6E8[1] = 0xe8;
address_of_5B6E8[2] = 0xf0;
address_of_5B6E8[3] = 0x8f;
LOG("function 5B6E8 patched");
LOG(" [!] dlopen libfrida...\n");
void * libfrida_handle = dlopen("libmiui_sec.so", RTLD_NOW);
if (libfrida_handle == NULL)
{
LOG(" [!] Could not dlopen libfrida! (%s)\n", dlerror());
return -1;
}
for (int x = 10; x > 0; --x) {
LOG("wait for frida: %d", x);
usleep(990000);
}
LOG(" [+] Calling JNI_OnLoad\n");
onLoadFunc(vm, NULL);
LOG("JNI_OnLoad succeeded!");
return SYSTEST_JNI_VERSION;
}