APK修改神器:插桩工具 DexInjector

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文介绍了一个针对Dex进行插桩的工具,讲解了一下直接修改Dalvik字节码和Dex文件时遇到的问题和解决方法

作者:字节跳动终端技术—— 李言

背景

线下场景中,我们经常需要在APK中插入一些检测代码,来实现一些记录方法调用耗时,或者增加一些打印日志的功能。目前的常规做法都是在编译期修改class字节码达到,例如byteX提供了方便的修改class框架。

但是,编译期修改灵活性不足,对于已经编译好的apk则无能为力,无法插桩或修改。导致很多业务方都要配置独立的jenkins打包后,才能触发进步一步的测试。一次自动化测试任务有将近一半的时间都消耗在打包过程中。

为了解决这个痛点,我们开发了一套直接针对APK(dex)插桩的工具,DexInjector。主要用来做一些日志、性能方面的数据采集和注入一些第三方工具,避免业务方二次打包,节省测试时间。

该方案已经用在日志旁路、网络数据抓取、第三方库注入,用户信息注入、日常调试等。

工具目前可以实现:

  • 方法前插桩

  • 方法后插桩

  • 初始化插桩

技术方案调研

调研了一下市面上现有的字节码修改方案。

smali

可以通过smali 和baksmali 工具将dex文件转换成可方便阅读的smali语法文件,但是smali的工具对smali字节码的解析是通过语法解析,如果要插入一个新的代码进去对寄存器等操作没有办法实现结构化操作。

redex

redex 支持通过配置在方法前进行插桩,可以通过实现pass来完成自己的插桩功能。但是功能实现有限,使用起来比较复杂,而且在执行之后插入了一些fb自定义的代码,但Redex 提供了一套强大的字节码修改能力,后续的版本会基于redex的字节码修改能力进行完善。

dexter

dexter 工具是google开发的一个类似dexdump的工具,但其内部实现了对dex文件结构和字节码指令的一套完整的操作api,轻量简洁,对字节码的操作可以达到ASM的体验。

综合,选用dexter对dex进行操作。

方案设计

需求

根据性能防劣化和流量统计的需求,都是在一个方法的方法体内部前后插入对其他方法的调用。以网络流量统计为例,需要在 okhttp3.RealCall.getResponseWithInterceptorChain 的方法内部开头插入一个方法来获取request请求的详细数据。

Response getResponseWithInterceptorChain() throws IOException {

    com.netflow.inject.hookRealCall(this);//插入的方法

    List<Interceptor> interceptors = new ArrayList<>();

    interceptors.addAll(client.interceptors());

          //.....省略部分代码

    return chain.proceed(originalRequest);

  }

Dex 插桩

基本流程

1. Dex文件分析

先要分析Dex文件格式,将其序列化成各种数据结构,Dex文件的结构可以参照官方文档(见参考文献)

2. 字节码解析

在code 段将二进制的字节码解析成可处理的数据结构

3. 字节码构造

按照字节码规范构造字节码指令,并插入到现有字节码的序列中即可完成字节码的插入。

4. 字节码序列化

将修改后的Dex结构重新计算Index,然后将各个数据Section序列化为Dex的文件格式。

功能需求

插桩支持两种能力,在一个方法的方法体前面和后面插入一个静态方法调用。

1. 方法体前面插桩

如果被插入的方法为实例方法,则方法的第一参数为 this,随后的参数和被插入的方法一致 ,如果方法是静态方法则插入的方法定义需要和被插入的方法参数类型和个数一致,举例:

public class Tracer{

        //被插入的方法,为实例方法

        private void MethodA(int a,int b){

        }


        //被插入的方法,为静态方法

        private static void MethodB(int a,int b){

        }

}


public class Hooker{

        //插入的方法

        private static void TestHookA(Tracer this_,int a,int b){

        }


        private static void TestHookB(int a,int b){

        }
如何通过代码的方式在任何apk添加自己的逻辑代码 通过安卓修改大师可以很轻松的在任何apk中添加新的代码逻辑,实现额外添加的功能,本次教程通过对一款名为“VMware Horizon”的软件进行反编译,实现在登录界面添加自动登录功能(该登录界面之前已经有自动登录功能,但是未实现相应的逻辑,且自动登录功能按钮在代码中自动隐藏掉了)。 为了方便大家学习,文中用到的apk和java代码请点击后面的连接... 阅读详情

相关推荐

android第三方注入dex,进阶Frida--Android逆向之Hook动态加载dex(三)(上篇)

前言:前段时间看到有朋友在问在怎么使用frida去hook动态加载的dex之类的问题,确实关于如何hook动态加载的dex,网上的资料很少,更不用说怎么使用frida去hook动态加载的dex了。(frida的官方文档已经无力吐槽…)后来偶然的情况下发现了一道CTF题目可以作为很好的案例,所以花了很多心思将文章写下来分享给大家,涉及的内容比较多,我打算用上下篇将frida hook动态加载的dex...

weixin_42298778的博客 796

D3Edit-CN2.0.zip

暗黑3修改器 D3Edit-CN2.0 汉化版。暗黑3修改器 D3Edit-CN2.0 汉化版

Android修改实战教程(乐影软件)

一、 准备工作: 这次我们来学习一个简单的修改练习 1.MT管理器 2.未修改的安装包:链接:https://pan.baidu.com/s/1zXaF_w9_4SVqAM9_5buw-Q 提取码:p69v 未修改前: 二、下面教程开始 1.打开mt找到安装包然后点击查看,然后点击dex结尾的文件这些文件是安卓开发应用的java文件,选择Dex 编辑器++。 2.进行搜索:搜索内容isvip类型为代码 这都是常规操作了,通过搜索代码来寻找要修改的类。 3.点击UserInfo下那行代码,然后查看

qq_48996375的博客 2414

dex-tool工具:高效文件管理与编辑助手

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在Android应用开发中,Dex文件是一种特殊的二进制格式,它包含了应用程序的字节码,是Dalvik虚拟机或者ART运行时执行程序的基础。dex-tools是一个强大的命令行工具集,用于处理和分析Dex文件,它在Android SDK的build-tools目录下可以找到。这个工具的版本为2.1,提供了多种功能,帮助开发者进行调试、优化和理解APK的结构。 dx:这是最核心的工具,用于将Java字节码转换成Dex格式。在编译Android应用时,开发者通常会用到dx来将.jar或.dex文件打包成单一的.dex文件,以满足Dalvik或ART运行时的要求。dx支持多种输入格式,并且可以通过命令行参数进行各种配置,如优化级别、是否生成多DEX文件等。 dexdump:此工具用于打印出 Dex 文件的详细信息,包括类、方法、字段的定义以及常量池等。这对于理解Dex文件的内部结构和分析代码非常有帮助。通过输出的信息,开发者可以查看类和方法的元数据,检查是否存在混淆问题,或者进行性能优化。 dex2jar(非官方,但经常与dex-tools一起使用):虽然不是官方提供的工具,但dex2jar是将.dex文件转换为Java字节码的.jar文件的常用工具。这在逆向工程或代码分析场景中非常有用,因为它可以让开发者在Java环境中查看和操作原始的类文件。 dexopt:此工具用于对.dex文件进行优化,使其更适合Dalvik或ART运行时。优化可能包括预编译、常量合并等,以提升应用的启动速度和运行效率。在发布应用之前,通常会用到dexopt对APK进行优化。 apksigner:虽然不是直接处理.dex文件的工具,但它是签名APK的重要工具。在Android系统中,每个安装的APK都需要正确的签名才

Android修改实战教程(漫放软件)

一、 准备工作: 1.MT管理器 2.脱壳后的安装包:https://975420.lanzous.com/iOq3Oef56pa(我不会脱壳) 我们来看看修改前的功能 : 二、下面教程开始 1.打开mt找到安装包然后点击查看,会看到 AndroidManifest.xml、classes.dex、resources.arsc三种文件。AndroidManifest.xml是清单文件,学过安卓的都知道这个。classes.dex, 安卓代码文件,在开发安卓应用时,开发者编写的 Java 代码会先编译成 N

qq_48996375的博客 3918

2024最新版Android逆向教程——第2天:dex反编译工具的安装和使用

学习了 dex 反编译工具的安装和使用,利用此一类工具,我们可以非常方便地反编译 apk 文件,还原出原始的 Java 代码,从而找到我们想要的核心逻辑。

XAMO Lab|代码、调试与复盘笔记 6万+

APK修改神器工具 DexInjector,2024年最新一次面试经历的分享

在制作入Dex的时候使用Dex工具的按包名提取类的功能,将需要的类裁剪出来做成dex,这个时候就可以将一些与APK重复的类剔除出去,入进去的Dex使用APK自身的库,这个时候需要将入的Dex按照mapping进行混淆才能够正常进行调用。举例一个方法会用到v0,v1,p0,p1,p2这五个寄存器,v0和v1表示局部变量寄存器,如果是实例方法的话,p0表示的是被传入的this对象的引用,p1和p2分别表示两个传入的参数。要想成为架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。

2401_84159783的博客 1435

APK修改神器工具 DexInjector(1),2024年最新面试阿里国际站运营一般会问什么

在制作入Dex的时候使用Dex工具的按包名提取类的功能,将需要的类裁剪出来做成dex,这个时候就可以将一些与APK重复的类剔除出去,入进去的Dex使用APK自身的库,这个时候需要将入的Dex按照mapping进行混淆才能够正常进行调用。举例一个方法会用到v0,v1,p0,p1,p2这五个寄存器,v0和v1表示局部变量寄存器,如果是实例方法的话,p0表示的是被传入的this对象的引用,p1和p2分别表示两个传入的参数。方法调用的代码一般不会打包到apk中,需要将代码merge到apk中。

2401_84159783的博客 626

Dex-Editor-Android:一款强大的 Android DEX 文件编辑器

Dex-Editor-Android:一款强大的 Android DEX 文件编辑器 在 Android 应用开发与逆向工程领域,DEX 文件编辑器是一个不可或缺的工具。今天,我要向大家推荐一款名为 Dex-Editor-Android 的开源项目,它为开发者提供了一个多功能且先进的 Android DEX 文件编辑解决方案。 项目介绍 Dex-Editor-Android 是一款正在开发中的 A...

gitblog_00927的博客 1609

探索安卓逆向的利器:Dexter

探索安卓逆向的利器:Dexter 在当今的技术世界中,对于Android应用的深入理解和分析变得越来越重要。而对于开发者、安全研究人员或是对安卓系统充满好奇的探索者来说,一款强大的DEX编辑工具无疑是开启安卓内部奥秘的钥匙。今天,我们要向大家隆重介绍——Dexter。 项目介绍 Dexter是一款尚在积极开发中的Android DEX文件编辑器,它巧妙地利用了smali和dexlib2,旨在提供一...

gitblog_00047的博客 1229

Smali相关的基础知识点

通过本篇博客的学习,相信你可以无压力的读懂Smali语言文件,并可以将Smali还原成java!!! 其实Smali语言并不是很难,如果你有一些汇编指令的基础,学习Smali就更加简单了,有兴趣的可以接着往下看,这里就不多说了!!!

朱玉强的博客 1万+

安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识

对于一个apk文件使用压缩软件7zip打开可以查看到文件组成。使用反编译软件编译后的文件是不同的,这个取决于你使用的反编译软件的功能。不同的反编译软件反编译后的文件略有不同。请区别对待.

小马哥的专栏 1万+

Android Dex编译器汇总

标题重点内容 下一代 Dex 编译器现已进入预览阶段 标题

ThePromonkeyOf_HeLuo的博客 2298

Android逆向之旅---解析编译之后的classes.dex文件格式

一、前言 新的一年又开始了,大家是否还记得去年年末的时候,我们还有一件事没有做,那就是解析Android中编译之后的classes.dex文件格式,我们在去年的时候已经介绍了: 如何解析编译之后的xml文件格式: http://blog.csdn.net/jiangwei0910410003/article/details/50568487 如何解析编译之后的resource.arsc文件

wtq1993的博客 1万+

Android 件化入门 (原理)

文章目录方式实现件化 方式实现件化 项目机构如下:app为宿主application ,pluginstand为中间连接作用,负责定义主app和件之间组件传递规则。shop用来打包apk。 主app和shop同时依赖 pluginstand 为了模拟实现网络下载件这里采用文件拷贝的方式将apk存储到内存卡,拷贝到/data/data/目录下。 app 中,首先定义 Plu...

Lud的博客 1390

安卓dex反编译工具

http://dl.dbank.com/c0ud4xxc4j

maikforever 的专栏 1666
上一篇: 让工程师拥有一台“超级”计算机——字节跳动客户端编译加速方案
下一篇: Python3 cpython优化 实现解释器并行
字节跳动终端技术
博客等级 码龄7年 206粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值