Android的自动转换';s-dex码

Android的自动转换';s-dex码,android,dalvik,dex,smali,Android,Dalvik,Dex,Smali,我想转换/instrument Dex文件。转换的目标包括测量代码覆盖率。请注意,源文件不可用。因此,检测Dex是唯一的选择 我想知道是否有任何现有的代码库可以作为示例来编写工具以实现我的目标 我知道Smali项目和许多其他基于Smali的项目。然而,对于我来说,这些项目都不是很好的例子 我正在寻找自动转换smali代码或生成smali的dexlib表示的代码。出于我的目的,我更喜欢后面的选项,因为可以避免生成smali的开销。代码很多,但dx是转换dex文件的示例程序。它需要猜测输出的大小,以

我想转换/instrument Dex文件。转换的目标包括测量代码覆盖率。请注意,源文件不可用。因此,检测Dex是唯一的选择

我想知道是否有任何现有的代码库可以作为示例来编写工具以实现我的目标

我知道Smali项目和许多其他基于Smali的项目。然而,对于我来说,这些项目都不是很好的例子


我正在寻找自动转换smali代码或生成smali的dexlib表示的代码。出于我的目的,我更喜欢后面的选项,因为可以避免生成smali的开销。

代码很多,但dx是转换dex文件的示例程序。它需要猜测输出的大小,以便使前向引用工作,这一事实使它变得非常复杂


您还需要创建基础设施来重写dalvik指令。DexMerge进行浅层重写:它调整从一个映射到另一个映射的偏移量。要测量代码覆盖率,指令重写可能需要更加复杂。

在某些情况下,smali本身在重新组装dex文件时会进行少量指令重写。例如,如果目标超出范围,则使用const string/jumbo替换const string,或者使用“更大”的goto指令替换goto指令。这涉及到用可能更大的指令替换指令列表中的指令,以及相应的偏移量修复

方法是否对此负责



此外,还有一个问题。我对它不太熟悉,但听起来它可能与你想做的事情有关。

我知道有点晚了,但只是以防万一,你仍然感兴趣,或者可能对其他读者感兴趣。ASMDEX已经提到过了。我认为这是你目前想要实现的目标的最佳选择

关于添加新寄存器,请查看org.ow2.asmdex.util.RegisterShiftMethodAdapter类。这并不完美!事实上,如果在添加寄存器时更改现有的4位指令,将意味着某些寄存器将最终为0xF,并且不适合4位,这是非常可怕的


但这应该是一个良好的开端。

最近出现的另一个选择是。它是So烟灰的扩展,So烟灰是用于分析和检测Java程序的框架。Dexpler读入.apk文件并转换为Jimple中间格式。然后,Jimple代码可以被任意检测,并最终转储到新的apk中

(为了记录在案,我在这里回答我自己的问题)


最终我没有找到任何适合我要求的工具。因此,我最终基于DexLib构建了自己的工具,名为。开箱即用,它可以做一些事情,如测量代码覆盖率、记录方法跟踪等,但它可以轻松扩展到其他类型的转换。

感谢指向dexmmerge的指针!正如您所猜测的,为了实现代码覆盖率,我需要在每个方法中插入新的指令。因此,我需要修复与不同类型指令中的跳转目标相对应的代码偏移量值。我正在寻找需要进行类似转换的示例。Dexmmerge似乎不需要这些。您是否尝试过使用dex2jar+emma+dx?我不确定这会有多好,但可能值得一试。我的目标是在自动动态分析的背景下,构建一个可以在任意apk上工作的工具。到目前为止,我的经验是,dex2jar或任何其他dex-to-java字节码转换器都不能用于任意APK。我觉得基于smali/dexlib的解决方案将是最健壮的。我倾向于同意:)非常感谢!对于我来说,这本说明书的确是一个很好的例子。再次感谢!asmdex看起来非常有希望成为dex精密仪器的工具。然而,显然它还不支持odex格式。我想知道在普通应用商店中是否有很多apk都有odex代码。odex文件是特定于设备的——odex文件仅在为其构建的设备上工作。smali是否必须向dex方法添加新的寄存器?我正在寻找如何做到这一点的例子。对于我的指令插入,我需要添加一个新寄存器来保存int值,并将该寄存器用作外部方法的参数。amsdex目前没有提供一种简单/可靠的方法来添加新寄存器。不,不是直接添加。使用smali代码非常简单,因为所有参数寄存器都使用单独的p0样式的寄存器,所以您所要做的就是修改.registers/.locals指令,然后您可以自由使用“new”最后一个非参数寄存器,这保证不会被使用。但是,如果您使用的是dexlib,那么您必须搜索参数寄存器的任何用法,并将它们增加一个。很有趣!我没有见过dexpler yetYeah,我注意到他们的资料中有dexlib的东西:)