首页
社区
课程
招聘
[求助] x86 模拟器上用 cydia substrate 注入 arm so
发表于: 2018-5-8 11:35 11873

[求助] x86 模拟器上用 cydia substrate 注入 arm so

2018-5-8 11:35
11873

在研究一个应用的 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);
     }
   }
 }
  • 在找到要 hook 的函数之后,进行 MSHookFunction 的过程在 arm 上已经测试过,上面的代码被我简化了
  • 各种 NULL 和非 NULL 的分支都加了 log,也被我简化了,比较确定的是 MSHookFunction 一旦调用必然崩溃
  • 猜测 MSHookFunction 会对原始地址、替换地址进行某些指令集相关的操作,libAppArm 中 MSFindSymbol 的结果是一个 arm 相关的地址,我用本地的函数应该是 x86 的,MSHookFunction 在转换的过程中指针操作异常了
  • cydia substrate 在模拟器上只能 link x86 的so,所以我写的 module 也只能导出 x86 版本的 so。
  • 是不是关键在于把 hook 的某个环节变成 arm so,也用 libhoudini 加载就可以解决?这个路子完全没思路。

求各位大神帮忙


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
加载arm版本substrate
2018-5-8 12:13
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
重复回复,没有引用
最后于 2018-5-8 12:36 被Amow编辑 ,原因:
2018-5-8 12:36
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
rrrfff 加载arm版本substrate
多谢回复!加载arm版本substrate    说的是substrate    app    使用arm版本的?还是我自己编写的module只引入arm的libsubstrate?    前者我重打包了CydiaSubstrate,删除了x86支持,只保留了arm,安装完cydia之后提示没法link。后者我只引入arm版本的libsubstrate,cydia会输出log说我的module    elf不匹配。
2018-5-8 12:36
0
雪    币: 222
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我是hook  houdini  达到目的。
2018-5-8 14:16
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
IceExt 我是hook houdini 达到目的。
hook  houdini  拿到的arm  lib  函数可以直接hook吗?
2018-5-8 14:22
0
雪    币: 222
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
houdini翻译后指令,你可以hook翻译后的指令,但是这个不是完美的方法。
2018-5-8 14:25
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
IceExt houdini翻译后指令,你可以hook翻译后的指令,但是这个不是完美的方法。
大概明白了,但是感觉实践有点困难
2018-5-8 14:31
0
雪    币: 222
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
或者你在so运行之前就把钩子做好并注入自己的arm  库,让houdini一起翻译了你的钩子,你可以试试理论上应该可以。记得要清除code  cache,否则不会被重新翻译。
2018-5-8 14:35
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
IceExt 或者你在so运行之前就把钩子做好并注入自己的arm 库,让houdini一起翻译了你的钩子,你可以试试理论上应该可以。记得要清除code cache,否则不会被重新翻译。
感谢回复,这个思路我感觉实在是知识水平不够,实践不了。还是谢谢你
2018-5-8 14:51
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
rrrfff 加载arm版本substrate
感谢二位!最终解决了,思路就是hook  lib  dvm  的load  native  code,在找到目标lib的时候加载一个自己写好的arm  lib。自己写的arm  lib包含了substrate和findSymbol逻辑(来自VA),然后在自己写的arm  lib  中进行hook目标函数!
2018-5-10 13:55
0
雪    币:
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢!问题已经解决,思路见楼上,一层不能同时引用两个。@IceExt
最后于 2018-5-10 13:57 被Amow编辑 ,原因:
2018-5-10 13:56
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主的思路给了我很大的启发。之前做这个就是无法hook    模拟器上的arm  code,无奈才转到真机上。
2018-5-10 14:40
0
雪    币: 1432
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
讲真,我是真的老粉丝
2018-5-10 14:53
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
请教一下楼主是怎么调用dvmLoadNativeCode加载一个自己写好的arm  lib的?其中的classLoader和detail 参数应该怎么构造呢?
最后于 2018-5-15 14:32 被小高_918796编辑 ,原因:
2018-5-15 11:16
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
Amow 感谢二位!最终解决了,思路就是hook lib dvm 的load native code,在找到目标lib的时候加载一个自己写好的arm lib。自己写的arm lib包含了substrate和fi ...
楼主能够详细讲解下实现过程吗
2018-7-9 21:06
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
小高_918796 请教一下楼主是怎么调用dvmLoadNativeCode加载一个自己写好的arm  lib的?其中的classLoader和detail 参数应该怎么构造呢?
hook dvmLoadNativeCode 函数时,可以判断是否是目标函数。如果是目标函数,直接调用 dvmLoadNativeCode 载入arm so,classLoader和detail 参数就是hook dvmLoadNativeCode时,函数带的2个入参
2018-7-10 20:59
0
雪    币: 102
活跃值: (2055)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
Amow 感谢!问题已经解决,思路见楼上,一层不能同时引用两个。@IceExt
请问详细过程能讲解下吗?毕竟你问问题楼上那些人也都帮忙了,既然解决了,能麻烦您告知一下详细过程吗?另外你用的什么模拟器,能正常安装cydia substrate,我在夜神,itools模拟器上测试,都不能正常安装cydia substrate。
最后于 2018-7-23 01:53 被koflfy编辑 ,原因:
2018-7-23 00:41
0
雪    币: 102
活跃值: (2055)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
问题解决,cydia substrate只支持到安卓4.3,最后换成海马王模拟器,它是安卓4.2.2版本,所以可以正常安装 cydia substrate。
hook方法:
1、先编译一个arm版的用来对目标函数做hook的so。
2、然后再编译一个x86版本的hook libdvm.so里的dvmLoadNativeCode函数,当发现是要hook的目标函数的时候,加载第1步编译的arm so。
最后于 2018-7-28 15:47 被koflfy编辑 ,原因:
2018-7-25 22:16
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
IceExt 我是hook houdini 达到目的。

大佬们,出出视频讲解一下,带带弟弟,。

最后于 2022-6-17 20:07 被mb_pabsmtia编辑 ,原因:
2022-6-17 20:06
0
游客
登录 | 注册 方可回帖
返回
//