Android x86 模拟器上用 cydia substrate 注入 arm so

2018-05-08 10:50:53 +08:00
 freeminder

在研究一个应用的 so hook,之前在 arm 真机上已经用 substrate 实现了,所以我判断注入相关代码没有问题。
在移植到模拟器环境中时,发现基于 x86 架构的模拟器在加载 App 内部的 arm 库时,使用了libhoudini。通过 hook libdvm 中 houdini 的 dlopen 方法拿到了 app arm so 的地址,并且通过MSFindSymbol找到了要 hook 的目标函数地址,但是使用MSHookFunction之后就会一直崩溃。log 里面显示的也是看不出来什么有用的信息。
核心代码如下

// target hook
void fake_target()
{
    // 这里只做简单的日志输出,logcat 没内容
}

// 原始的 houdini dlopen 句柄
void* (*_hookDlopen)(const char *filename, int flag, bool* useHoudini);

// houdini dlopen hook
void* fake_hookDlopen(const char *filename, int flag, bool* useHoudini){
    void* handle = _hookDlopen(filename, flag, useHoudini);
    if(strstr(filename, "libAppArm.so")){
        void * target = MSFindSymbol(handle, "target_function");
        if (target != NULL){
            MSHookFunction(target, (void*)&fake_target);
        }
    }
    return handle;
}
// 初始化过程
MSInitialize {
   MSImageRef image;
   image = MSGetImageByName("/system/lib/libdvm.so");
   if (image != NULL) {
     void * houdini = MSFindSymbol(image, "_ZN7houdini10hookDlopenEPKciPb");
     if (houdini != NULL){
         MSHookFunction(houdini, (void*)&fake_hookDlopen,(void **)&_hookDlopen);
     }
   }
 }

请各路 v 友指点一二……

6203 次点击
所在节点    Android
2 条回复
freeminder
2018-05-10 15:02:33 +08:00
自己解决了,思路就是 cydia module 只 hook libdvm 的 loadNativeCode, 在找到目标 lib 的时候 loadNativeCode 一个自己写好的 arm so。这个 arm so 的 JNI_ONLoad 包含了所有的 hook 逻辑,arm so 里面用的 cydia 和 findSymbol 来自 VirtualApp 的源码。module 编 x86 的,arm so 编 arm 的。就这样,收藏的回来点感谢吧。
cainiaoniao
2018-07-02 22:54:40 +08:00
您好,请问下我 hook loadNativeCode
```
char *armsopath = "/system/lib/libarmso.so";

bool MydvmLoadNativeCode(const char* pathName, void* classLoader,char** detail)
{
LOGI("MydvmLoadNativeCode %s",pathName);
//if(strstr(pathName,"libcubehawk.so")>0)
if(strstr(pathName,"libtestso.so")>0)
{
LOGI("load arm so %s",armsopath);
bool bret = pOldFunc(pathName,classLoader,detail);
pOldFunc(armsopath,classLoader,detail);
return bret;
}
return pOldFunc(pathName,classLoader,detail);
}
```
是这样的错误提示
D/houdini ( 127): [127] Open Native Library /system/lib/libarmso.so failed.

请问下这是怎么回事呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/453006

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX