bytedance / bhook

:fire: ByteHook is an Android PLT hook library which supports armeabi-v7a, arm64-v8a, x86 and x86_64.
https://github.com/bytedance/bhook/tree/main/doc#readme
MIT License
2.05k stars 315 forks source link

hook so库的open函数在访问/apex/com.android.runtime/lib64/bionic/libc.so出现崩溃 #34

Closed tyrionchen closed 2 years ago

tyrionchen commented 2 years ago

bytehook Version

1.0.4

Android OS Version

13

Android ABIs

arm64-v8a

Device Manufacturers and Models

Google Pixel 5(Android 13)

Describe the Bug

问题描述:

你好! 我新建了一个空的Unity工程(版本: 2018.4.36f1),导出了Android工程,导出的工程中有三个so,我需要hook libunity.so的所有open函数从而修改文件路径。我发现在Google Pixel 5手机上,我hook以后会出现崩溃,如果我不hook就不会崩溃,其他手机(包括小米8、小米max2、HUAWEI nova7、HUAWEI Mate 10等)没有出现这个问题。

代码片段:

因为open函数有多个,我在代理函数中用可变参数来调用,不知道是否正确。

image

崩溃堆栈:

image

附件是详细的日志和我的工程,解压AndroidUnity2018EmptyFor50.zip导入Android studio可以复现问题。 crash.log

AndroidUnity2018EmptyFor50.zip

caikelun commented 2 years ago

你好~

可以改成这样试试:

int unity_new_open(const char *path, int flags, mode_t modes) {
    BYTEHOOK_STACK_SCOPE();
    VERBOSE("unity_new_open() path=%s", path);

    int result = BYTEHOOK_CALL_PREV(unity_new_open, path, flags, modes);
    VERBOSE("unity_new_open() ret=%d", result);

    return result;
}

可变参数分两种情况:

  1. 可变部分的参数个数上限已知:比如 open(具体可以看下 aosp 中 open 的实现)。这种情况可以按照最大的参数个数情况来定义 proxy 函数。
  2. 可变部分的参数个数上限未知:比如 snprintf。这种情况一般都会有对应的 va_list 类型的函数,比如 vsnprintf,因此可以在 proxy 函数中提取 va_list 然后调用 vsnprintf

另外,PLT 方式 hook open一共需要 hook 三处:open__open_real__open_2。供参考。

tyrionchen commented 2 years ago

你好~

可以改成这样试试:

int unity_new_open(const char *path, int flags, mode_t modes) {
    BYTEHOOK_STACK_SCOPE();
    VERBOSE("unity_new_open() path=%s", path);

    int result = BYTEHOOK_CALL_PREV(unity_new_open, path, flags, modes);
    VERBOSE("unity_new_open() ret=%d", result);

    return result;
}

可变参数分两种情况:

  1. 可变部分的参数个数上限已知:比如 open(具体可以看下 aosp 中 open 的实现)。这种情况可以按照最大的参数个数情况来定义 proxy 函数。
  2. 可变部分的参数个数上限未知:比如 snprintf。这种情况一般都会有对应的 va_list 类型的函数,比如 vsnprintf,因此可以在 proxy 函数中提取 va_list 然后调用 vsnprintf

另外,PLT 方式 hook open一共需要 hook 三处:open__open_real__open_2。供参考。

感谢解答! 修改后确实就不崩了