hook系统native函数后,代理函数只被调用了一次
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就没有进入代理函数了。
请先确实是否是把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 点的任何代理函数,而是会直接调用“真正的原函数”。
哦,谢谢