android-inline-hook icon indicating copy to clipboard operation
android-inline-hook copied to clipboard

hook系统native函数后,代理函数只被调用了一次

Open discoy opened this issue 3 months ago • 2 comments

ShadowHook Version

2.0.0

Android OS Version

12

Android ABIs

armeabi-v7a

Device Manufacturers and Models

xiaomi MIUI 13

Describe the Bug

按照demo中的代码,对系统函数binder.getCallingUid进行hook,代码如下: typedef jint (*android_runtime_func_getCallingUid)(void *);

// Proxy function jint android_runtime_func_getCallingUid_proxy(void *thiz) { // do something jint oriUid = ((android_runtime_func_getCallingUid)orig)(thiz); // do something jint retUid = 10001; LOGE("hook getCallingUid Success,ori = %d,ret =%d",oriUid,retUid); return retUid; }

void do_hook() { stub = shadowhook_hook_sym_name( "libbinder.so", "_ZNK7android14IPCThreadState13getCallingUidEv", (void *)android_runtime_func_getCallingUid_proxy, (void **)&orig);

if(stub == NULL)
{
    int err_num = shadowhook_get_errno();
    const char *err_msg = shadowhook_to_errmsg(err_num);
    LOGE("hook error %d - %s", err_num, err_msg);
}
else
{
    LOGE("hook success");
}

}

hook成功后,仅接着调用Binder.getCallingUid执行了代理函数,后面再调Binder.getCallingUid就没有进入代理函数了。

discoy avatar Nov 12 '25 03:11 discoy

请先确实是否是把shadowhook初始化成了默认的shared模式,如果是的话,请看shadowhook手册的如下部分:

https://github.com/bytedance/android-inline-hook/blob/main/doc/manual.zh-CN.md

不调用 SHADOWHOOK_POP_STACK 宏或 SHADOWHOOK_STACK_SCOPE 宏会怎么样?

这会导致:当执行到被 hook 函数时,代理函数只会被执行一次,下次再执行到被 hook 函数时,由于 hub 模块发现“当前 hook 点的代理函数调用状态”还在,于是判定会发生环形递归调用,这时 hub 模块不再会调用这个 hook 点的任何代理函数,而是会直接调用“真正的原函数”。

caikelun avatar Nov 12 '25 04:11 caikelun

哦,谢谢

discoy avatar Nov 28 '25 06:11 discoy