php

插桩的三种方法:AspectJ、ASM、ReDex

2019-09-30  本文已影响0人  修塔寻千里

插桩,顾名思义,就是在代码编译期间修改已有的代码获证生成新代码。


基础知识

1、使用插桩的场景

2、字节码

对于Java平台,Java虚拟机运行的是class文件,内部对应的是Java字节码。而针对Android的字节码是Google专门为其设计的一种Dalvik字节码,虽然增加了指令长度但却缩减了指令数量,执行更会快速。
它们的主要区别有:

编译插桩的三种方法

AspectJ和ASM框架的输入和输出都是Class文件,他们是我们最常使用的java字节码处理框架。


1、AspectJ

AspectJ是Java中流行的AOP编程扩展框架,从底层实现上来看,AspectJ内部使用的是BCEL框架来完成,在使用上来看,AspectJ框架有自己的一定优势:

2、ASM

ASM的功能非常强大,它可以满足100%的场景,其主要特点有:

每一条 Java 虚拟机线程都有自己私有的 Java 虚拟机栈,这个栈与线程同时创建,用于存储栈帧(Stack Frame)。
所以在多线程应用中多个线程就会有多个栈,每个栈都有自己的栈帧。



如下图所示,我们可以简单的认为栈帧包含3个重要的内容:本地变量表(Local Variable Array)、操作数栈(Operand Stack)和常量池引用(Constant Pool Reference)。


ReDex

ReDex不仅只是作为一款Dex优化工具,它也提供了很多的小工具和功能,比如在ReDex里提供了一个简单的Method Tracing和Block Tracing工具,这个工具可以在所有方法或者指定方法前插入一跟踪代码。
ReDex的这个功能并不是完整的AOP工具,但它提供了一系列指令生成API和Opcode插入API,我们可以参照这个功能实现自己的字节码注入工具,这个功能的代码在Instrument.cpp中。
由于Dalvik字节码发展时间尚端,而且因为Dex格式更加紧凑,修改起来往往牵一发而动全身,并且Dalvik字节码的处理相比Java字节码会更加复杂一些,所以直接操作Dalivk字节码的工具并不是很多。
市面上大部分需要直接修改Dex的情况是逆向的,很多同学都采用手动书写Smail代码然后编译回去,总结一下Dex字节码库:
-ASMDEX,开发者是ASM库的作者,但很久未更新了

上一篇下一篇

猜你喜欢

热点阅读