首页
社区
课程
招聘
[原创]硬件级Dalvik字节码粒度无痕HOOK及VMP取址码定位分析
发表于: 2025-8-10 23:28 4851

[原创]硬件级Dalvik字节码粒度无痕HOOK及VMP取址码定位分析

2025-8-10 23:28
4851

在安卓java层的dex的逆向分析中 类似以下的smali代码时常会被遇到:

为了逆向分析的继续推进 确定执行流在if-eqz的之后是走向xxx 还是 yyy就显得尤为重要。

然后遗憾的是 主流的hook框架 无论是xposed亦或是frida 在java层 都只能在函数调用级别进行拦截 且 极其容易被检测。

本文即将探讨的是 如何在硬件级别实现dalvik bytecode粒度的无痕拦截技术 并实现鼠标点击一键hook 指哪儿打哪儿 感受 button power 的强大魅力!

要追踪像引言中那样的smali的执行流 目前笔者已知且实现过的有以下方案:

修改AOSP源码 在art解释器相关位置插入打印日志。优点是简单 缺点是笨重 不灵活 适用面窄 不够优雅。 

idapro 逆向分析 libart.so 找到art解释器相关代码 inline hook之。优点是通用 缺点是实现难度较高。

直接解析指定方法的smali文件 对每行smali都附加smali打印日志 重新编译成dex 基于dex热修复技术注入 通过日志查看smali执行流。

 以上方式 要么要重编译系统 要么要基于xposed或frida 操作复杂 被检测面广 侵入性太强 皆不符合笔者的需求。

众所周知 dalvik字节码会被art解释器解释执行 。

解释器在解释执行前必会读取内存中的bytecode 。

因此只要对bytecode所在内存下硬件读写断点即可。

断点触发了意味着这条smali执行了 否则便没有执行。

具体思路如下:

借助于GDA对dex的强大解析能力 使用python脚本通过adb执行相关程序调用驱动 可将上述步骤自动化。 

原理很简单 py程序接受pid addr_base参数 并在后台监听系统剪切版 在GDA中复制最右端dalvik字节码偏移 python读取到后 相加即可获取到绝对地址 通过adb调用安卓端的bp可执行程序 其中连接arm64硬件读写驱动 下硬件只读断点 就可以了。只要当前smali指令被读取执行 就会被断下。结合这张图 很容易理解。


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2025-8-10 23:36 被万里星河编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 494
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2

用内核驱动来搞smali指令的hook还是很麻烦的吧,rwprocmem33应该就提供了setpc的接口,其他寄存器的写入好像没有接口

最后于 2025-8-10 23:48 被安卓逆向test编辑 ,原因:
2025-8-10 23:48
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
安卓逆向test 用内核驱动来搞smali指令的hook还是很麻烦的吧,rwprocmem33应该就提供了setpc的接口,其他寄存器的写入好像没有接口
鼠标点哪就hook哪 不麻烦的
2025-8-11 03:05
0
雪    币: 46
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
已经有hook框架支持指令粒度的hook哈
https://bbs.kanxue.com/thread-287777.htm
2025-8-11 12:32
1
雪    币: 3246
活跃值: (5702)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用的是rwProcMem33吗,脚本方便开源学习一下吗
2025-8-11 14:33
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mb_wpitiize 用的是rwProcMem33吗,脚本方便开源学习一下吗

是的 用的rwProcMem33 py脚本太简单了 总共不到10行代码 我都没好意思发 其实只要复制文中有关原理的那段话给AI 直接就有啦

最后于 2025-8-11 14:58 被万里星河编辑 ,原因:
2025-8-11 14:56
0
雪    币: 932
活跃值: (3759)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7

>  众所周知 dalvik字节码会被art解释器解释执行 。解释器在解释执行前必会读取内存中的bytecode 。


JIT:啊?
AOT:啊??

最后于 2025-8-11 15:41 被葫芦娃编辑 ,原因:
2025-8-11 15:40
1
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
葫芦娃 >  众所周知 dalvik字节码会被art解释器解释执行 。解释器在解释执行前必会读取内存中的bytecode 。JIT:啊?AOT:啊??
似乎都是有办法过掉的 不必啊?
2025-8-11 16:13
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
而且壳里的代码几乎都是解释执行
2025-8-11 16:16
0
雪    币: 6437
活跃值: (6027)
能力值: ( LV5,RANK:76 )
在线值:
发帖
回帖
粉丝
10
万里星河 而且壳里的代码几乎都是解释执行
某些加固的类抽取实现,有回填的跟偏移的,如果是偏移的话,那就不行了。那就变成,如何定位code_item不在dex范围的问题了
2025-8-11 16:53
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
陈可牛 某些加固的类抽取实现,有回填的跟偏移的,如果是偏移的话,那就不行了。那就变成,如何定位code_item不在dex范围的问题了
嗯 具体问题具体分析 文章提供的是通用的一般思路
2025-8-11 17:26
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
WanQing 已经有hook框架支持指令粒度的hook哈 https://bbs.kanxue.com/thread-287777.htm
static 
{
    System.loadLibrary("albatross_base");
    System.loadLibrary("native-lib");
}

Albatross.hookInstruction(onClick, 0, 10, new InstructionCallback() {
    @Override
    public void onEnter(Member member, Object self, int dexPc, InvocationContext invocationContext)
    {
        Log.d("Albatross","dex_Pc:" + dexPc);
    }
});

2025-08-11 18:20:19.748 11904-11904/? E/AndroidRuntime: FATAL EXCEPTION: main

    Process: me.stevenzack.langenius, PID: 11904

    java.lang.UnsatisfiedLinkError: No implementation found for long qing.albatross.core.InstructionListener.hookInstructionNative(java.lang.reflect.Member, int, int, java.lang.Object) (tried Java_qing_albatross_core_InstructionListener_hookInstructionNative and Java_qing_albatross_core_InstructionListener_hookInstructionNative__Ljava_lang_reflect_Member_2IILjava_lang_Object_2) - is the library loaded, e.g. System.loadLibrary?

        at qing.albatross.core.InstructionListener.hookInstructionNative(Native Method)

        at qing.albatross.core.Albatross.hookInstruction(Albatross.java:447)

        at qing.albatross.core.Albatross.hookInstruction(Albatross.java:434)


最后于 2025-8-11 18:26 被万里星河编辑 ,原因:
2025-8-11 17:29
0
雪    币: 932
活跃值: (3759)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
万里星河 似乎都是有办法过掉的 不必啊?
愿闻其详
2025-8-11 19:31
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
葫芦娃 愿闻其详
建议自己研究
2025-8-11 19:36
0
雪    币: 46
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
万里星河 WanQing 已经有hook框架支持指令粒度的hook哈 https://bbs.kanxue.com/thread-287777.h ...
需要提前初始化库的
2025-8-12 21:29
0
雪    币: 46
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
因为我不用这个功能,没有经过充分测试,抱歉啦,修复了,如果还有问题,可以把测试手机的libart邮件发给我。后续会加入代码追踪和内存读写的功能。加了壳的app不会所有的代码都走vmp,不然速度会特别慢。不过我一直好奇加固的怎么aot编译。如果只单纯依赖jit,那内存占用会比aot高,执行速度也会大打折扣。
2025-8-13 08:50
0
雪    币: 240
活跃值: (1941)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
WanQing 因为我不用这个功能,没有经过充分测试,抱歉啦,修复了,如果还有问题,可以把测试手机的libart邮件发给我。后续会加入代码追踪和内存读写的功能。加了壳的app不会所有的代码都走vmp,不然速度会特别慢 ...
加固的应该不能aot aot主要是在软件安装的时候进行的 但安装时壳保护的dex肯定还没解密 也就aot不了 不过由于安卓7之后的aot+jit混合编译模式 解释器会在运行时记录代码热度  在设备空闲时将热点代码编译为本地机器码 效率还是可以的
2025-8-13 12:00
0
游客
登录 | 注册 方可回帖
返回