iqiyi / xHook

🔥 A PLT hook library for Android native ELF.
Other
4.08k stars 760 forks source link

Android4.4.3(arm)Hook libandroidfw.so中的函数失败。 #44

Closed gttiankai closed 5 years ago

gttiankai commented 5 years ago

使用了xhook 尝试去hook /frameworks/base/libs/androidfw/ZipFileRO.cpp中的inflateBuffer函数,在日志中显示成功。但是在调用该函数是,并没有打印相应的日志,也就是hook没有真正的起作用。请问这个怎么解决啊?

日志信息如下:

I/xhook: libxhook 1.1.9 (arm)
      hook: _ZN7android9ZipFileRO13inflateBufferEPvPKvjj @ /system/lib/libandroidfw.so, (0xa9c40259, 0xa9c48048)
I/xhook: init OK: /system/lib/libandroidfw.so (REL ELF_HASH PLT:1360 DYN:1904 ANDROID:0)
    hooking _ZN7android9ZipFileRO13inflateBufferEPvPKvjj in /system/lib/libandroidfw.so
    found _ZN7android9ZipFileRO13inflateBufferEPvPKvjj at symidx: 14 (ELF_HASH)
    map refreshed
D/xhook:   b6deb000 /system/lib/libandroidfw.so

hook的关键代码如下:

    xhook_enable_debug(1);
    xhook_register("/system/lib/libandroidfw.so",
                   "_ZN7android9ZipFileRO13inflateBufferEPvPKvjj",
                   (void *) inflateBufferFake,
                   (void **) &inflateBuffer);
    xhook_refresh(0);
typedef bool (*inflateBufferType)(void *outBuf, const void *inBuf,
                                  size_t uncompLen, size_t compLen);

inflateBufferType inflateBuffer = NULL;

bool inflateBufferFake(void *outBuf, const void *inBuf, size_t uncompLen, size_t compLen) {
    DEBUG("invoke inflateBuffer");
    if (inflateBuffer != NULL) {
        return inflateBuffer(outBuf, inBuf, uncompLen, compLen);   
    } else {
        EGIS_ERROR("get the inflateBuffer function failed!");
        return false;
    }
}
gttiankai commented 5 years ago

经过最近的测试进一步的发现了问题: 第一种模拟器:使用 google SDK 中的 Android4.4(Google APIs)的 image 创建的虚拟机,hook 是不成功的。 第二种模拟器:使用 google SDK 中的 Android4.4 (不是 Google APIs)的 image 创建的虚拟机,是可以 hook 成功的。 经过反汇编分析,发现两种 image 的 libandroidfw.so的导出表不一致。第一种模拟器是的libandroidfw.so 的导入表中是没有这个函数的。第二种模拟器中的libandroidfw.so的导入表中存在这个函数。

所以问题的根源就出在Google SDK 提供这两种模拟器的不同上。

有人知道这两种模拟器镜像有什么不同吗? images

caikelun commented 5 years ago

inflateBuffer是libandroidfw.so库的内部函数:http://androidxref.com/4.4.3_r1.1/xref/frameworks/base/include/androidfw/ZipFileRO.h#168

内部函数一般是不会通过PLT/GOT来调用的,所以用PLT hook的方式是无法hook到inflateBuffer函数的。

有些rom中的系统库为了能在调试时获取到更多的信息(符号,backtrace等),可能会将此类内部函数放到PLT/GOT中,代价是牺牲一些执行效率和flash空间。

gttiankai commented 5 years ago

@caikelun 对的 应该是这样子的,只能说 Android 系统这边情况比较乱。