我想转换/仪器Dex文件。转型的目标包括测量代码覆盖率。请注意,源文件不可用。因此,使用Dex是唯一的选择。
我想知道是否有任何现有的代码库,我可以将其作为示例来编写工具来实现我的目标。
我了解Smali项目以及以Smali为基础的许多其他项目。但是,这些项目都不是我的目的的好例子。
我正在寻找能够自动转换smali代码或dexlib表示的代码,从中生成smali。后一个选项对我来说是首选,因为可以避免生成smali的开销。
答案 0 :(得分:3)
这是很多代码,但是dx的DexMerger是一个转换dex文件的示例程序。由于它需要猜测输出的大小以使前向引用有效,因此它变得非常复杂。
您还需要创建基础结构来重写dalvik指令。 DexMerger的InstructionTransformer进行了浅层重写:它将偏移从一个映射调整到另一个映射。要测量代码覆盖率,您的指令重写可能需要更加复杂。
答案 1 :(得分:2)
最近可用的另一个选项是Dexpler。它是Soot的扩展,它是Java程序分析和检测的框架。 Dexpler读入.apk文件并转换为Jimple中间格式。然后可以任意检测Jimple代码,并最终将其转储到新的apk中。
答案 2 :(得分:1)
在某些情况下,smali本身会在重新组装dex文件时执行少量指令重写。如果目标超出范围,比如使用const-string / jumbo替换const-string,或者使用“更大”的goto指令替换。这涉及将指令列表中的指令替换为可能更大的指令,以及相应的补偿修正。
CodeItem.fixInstructions是负责此事的方法。
此外,还有asmdex library。我并不是很熟悉它,但听起来它可能与你想做的事情有关。
答案 3 :(得分:1)
(为了记录,我在这里回答我自己的问题)
最终我找不到符合我要求的工具。所以我最终基于DexLib构建了我自己的工具,名为Ella。开箱即用,它做了一些事情,如测量代码覆盖率,记录方法痕迹等。但它可以很容易地扩展到其他类型的转换。
答案 4 :(得分:0)
我知道这有点晚了,以防万一你仍然感兴趣或者对其他读者感兴趣。已经提到过ASMDEX。我认为,对于你想要实现的目标,这是你最好的选择。
至于添加新寄存器,请查看org.ow2.asmdex.util.RegisterShiftMethodAdapter类。这不完美!事实上,在添加寄存器时改变现有的4位指令是可怕的,这意味着某些寄存器最终会为0xF,不适合4位。
但这应该是一个好的开始。