首页
社区
课程
招聘
[求助]x86模拟器注入so进行hook的问题
2022-5-9 19:01 13808

[求助]x86模拟器注入so进行hook的问题

2022-5-9 19:01
13808

环境: 模拟器是x86架构雷电模拟器, android系统是5.1, app只支持v7a架构, app在模拟器上正常运行
需求: 现在自己写了一个so, 想要注入app进行hook, 但是一直没办法注入

 

ptrace注入方式

  1. x86的注入器, x86的so, 注入似乎是成功的, maps文件能看到自己的so的路径, 但是因为app是v7a, 所以可能不行
  2. x86的注入器, v7a的so, 注入在调用dlopen时, 提示has unexpected e_machine: 40, 百度说是elf文件
  3. v7a的注入器, v7a的so, 注入的时候, 调用函数没有报错, 但是在执行后调用ptrace(PTRACE_SETREGS, nPid, nullptr, pRegs)时总是说Device or resource busy

请问有什么办法可以在模拟器上注入自己的so, 或者有什么框架可以做到这个操作, 听朋友说有些外挂通过Xposed可以做到这些, 是否要去学习Xposed框架

 

代码流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//ptrace(PTRACE_ATTACH)附加到app
//执行mmap获取返回值, 写入dlopen需要的参数
//执行dlopen函数加载自己的so
//调用函数的方法如下
int ptraceCall(int nPid, uint32_t unAddr, long arrParams[], int nParamNum, pt_regs *pRegs)
{
#if defined(__i386__)
    //写入参数到堆栈
    pRegs->esp -= (long) (nParamNum * sizeof(long));
    ptraceWriteData(nPid, (uint8_t *) pRegs->esp, (uint8_t *) arrParams,
                    (int) (nParamNum * sizeof(long)));
 
    //不知道为什么写入这个
    long unTmp = 0x00;
    pRegs->esp -= sizeof(long);
    ptraceWriteData(nPid, (uint8_t *) pRegs->esp, (uint8_t *) &unTmp, sizeof(unTmp));
 
    pRegs->eip = (long) unAddr;
#elif defined(__arm__)
    //写入参数
    for (int i = 0; i < nParamNum; ++i)
    {
        //写入参数到堆栈
        if (i >= 4)
        {
            pRegs->ARM_sp -= (long)((nParamNum - i) * sizeof(long));
            break;
        }
        //写入参数到寄存器
        pRegs->uregs[i] = arrParams[i];
    }
 
    pRegs->ARM_pc = (long)unAddr;
    if (pRegs->ARM_pc & 1)
    {
        pRegs->ARM_pc &= (long)(~1u);
        pRegs->ARM_cpsr |= CPSR_T_MASK;
    }
    else
    {
        pRegs->ARM_cpsr &= ~CPSR_T_MASK;
    }
#endif
 
    //设置参数并运行
    if (ptraceSetRegs(nPid, pRegs) == -1 || ptraceContinue(nPid) == -1)
    {
        perror("设置寄存器出错或继续运行出错");
        return -1;
    }
 
    int nStat = 0;
    waitpid(nPid, &nStat, WUNTRACED);
    while (nStat != 0xB7F)
    {
        if (ptraceContinue(nPid) == -1)
        {
            perror("继续运行出错");
            return -1;
        }
        waitpid(nPid, &nStat, WUNTRACED);
    }
 
    return 0;
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2022-5-9 19:04 被Migration编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (24)
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-5-9 20:28
2
0
注入x86作为bridge调用houdini加载arm的so完成hack
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-5-9 20:31
3
0
当然直接远程调用houdini注入arm的库进行hack也行
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Migration 2022-5-10 07:31
4
0
不吃早饭 注入x86作为bridge调用houdini加载arm的so完成hack
感谢回复, 没能在网上找到太多的相关资料, 有相关的代码参考吗
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-5-10 10:29
5
0
Migration 感谢回复, 没能在网上找到太多的相关资料, 有相关的代码参考吗
看aosp里libnativebridge部分代码,那是官方调用houdini的方法
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-5-10 10:32
6
0
Migration 感谢回复, 没能在网上找到太多的相关资料, 有相关的代码参考吗
https://cs.android.com/android/platform/superproject/+/master:art/libnativebridge/native_bridge.cc;l=563
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Migration 2022-5-10 12:06
7
0
十分感谢, 我去参考一下
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Migration 2022-5-10 12:06
8
0
十分感谢, 我去参考一下
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Migration 2022-5-10 12:07
9
0
不吃早饭 https://cs.android.com/android/platform/superproject/+/master:art/libnativebridge/native_bridge.cc;l ...
十分感谢, 我去参考一下
雪    币: 160
活跃值: (2288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Yecate 2022-5-10 13:17
10
0

可以替换掉libnb.so 

native_bridge2_loadLibrary 加载arm的so

static void *native_bridge2_loadLibrary(const char *libpath, int flag) {    
ALOGV("enter native_bridge2_loadLibrary %s", libpath);    
NativeBridgeCallbacks *cb = get_callbacks();     
if (strstr(libpath, "xxx.so")) {    
ALOGV("load xxx.so");  
// 加载我们自己的so文件  
void *handle = cb->loadLibrary("/data/local/tmp/libhackclient.so", flag);    
ALOGV("load libhackclient = %p", handle);    
}    
return cb ? cb->loadLibrary(libpath, flag) : nullptr;    
}

https://github.com/openthos/device-generic-common/blob/marshmallow-openthos/nativebridge/src/libnb.cpp

最后于 2022-5-10 13:19 被Yecate编辑 ,原因:
雪    币: 196
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Migration 2022-5-10 17:16
11
0
Yecate 可以替换掉libnb.so&nbsp;native_bridge2_loadLibrary 加载arm的sostatic&nbsp;void&nbsp;*native_brid ...
十分感谢, 我试试
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_pabsmtia 2022-6-17 20:06
12
0
大佬们,出出视频讲解一下,带带弟弟,。
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_阿诺 2022-7-4 00:41
13
0
大佬最后有解决了吗
雪    币: 195
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
快乐的萌小萌 2022-7-7 10:22
14
0
  大佬能给个联系方式吗  学习一下
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
lbwnb_nblbw 2022-7-7 21:45
15
0
x86加载armv7的动态库可以参考java层System.load方法,或者直接java层注入就可以了。
雪    币: 40
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyZore 2022-7-17 23:01
16
0
Yecate 可以替换掉libnb.so&nbsp;native_bridge2_loadLibrary 加载arm的sostatic&nbsp;void&nbsp;*native_brid ...
大佬请问:  libnb 这个该如何才能编译  他的nativebridge目录下 只有android.mk 和 nativebridge.mk 没有application.mk  这种情况该如何才能编译
雪    币: 160
活跃值: (2288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Yecate 2022-7-19 08:31
17
0
happyZore 大佬请问: libnb 这个该如何才能编译 他的nativebridge目录下 只有android.mk 和 nativebridge.mk 没有application.mk 这种情况该如何才能 ...

Android.mk

LOCAL_PATH := $(call my-dir)    
include $(CLEAR_VARS)    
LOCAL_MODULE    := nb    
LOCAL_SRC_FILES := ../libnb.cpp    
LOCAL_LDLIBS    :=  -llog    
include $(BUILD_SHARED_LIBRARY)


Application.mk

APP_ABI   := x86    
APP_PLATFORM := android-21    
APP_STL      := c++_static


雪    币: 180
活跃值: (606)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_小薛_256 2022-8-20 01:03
18
0
还是用感染注入好了 这些编译的方式好麻烦
雪    币: 941
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
U3D_Modder 2022-9-4 01:28
19
0
wx_小薛_256 还是用感染注入好了 这些编译的方式好麻烦
我想买这个
添加我的 QQ2491045843
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
梅雨个个 2024-3-8 16:54
20
0
大佬,你解决了吗
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
龙乎 2024-3-8 17:27
21
0
梅雨个个 大佬,你解决了吗
很多人实现不了应该是不懂如何处理houdini,那玩意确实很坑,网上资料不会很多
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
梅雨个个 2024-3-8 18:25
22
0
龙乎 很多人实现不了应该是不懂如何处理houdini,那玩意确实很坑,网上资料不会很多
我看了一个https://bbs.kanxue.com/thread-271478.htm
这个链接里有其他解决方法。但我没怎么看懂
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
龙乎 2024-3-8 19:40
23
1
梅雨个个 我看了一个https://bbs.kanxue.com/thread-271478.htm 这个链接里有其他解决方法。但我没怎么看懂
看下这篇文章就可以了https://www.perfare.net/archives/1897,我也是从这得到灵感,调试了半个多月跑通了模拟器全架构的注入
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
梅雨个个 2024-3-9 00:07
24
0
龙乎 看下这篇文章就可以了https://www.perfare.net/archives/1897,我也是从这得到灵感,调试了半个多月跑通了模拟器全架构的注入
这么牛逼..感谢 我去看看,
但这个好像是用面具来注入修改的吧。可以不用面具直接有shell root权限注入嘛?
雪    币: 198
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
x96dbg 2024-4-25 01:42
25
0
龙乎 看下这篇文章就可以了https://www.perfare.net/archives/1897,我也是从这得到灵感,调试了半个多月跑通了模拟器全架构的注入
感谢大佬无私馈赠,天不生龙乎大哥,逆向万古如长夜~
游客
登录 | 注册 方可回帖
返回