在研究一个应用的 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 友指点一二……
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.