前言

前几章中我们分别介绍asm、asmdex以及smali/baksmali这三个开源库,它们各有其特色之处,这一章我们来对比一下它们的优劣,以便更好地选择方案进行开发。

ASM

asm修改的是class文件,所以无法直接修改android应用,不过幸运的是,我们可以通过dex2jar进行转换。但这样一来,就相当于同时依赖asm和dex2jar了。这样我们开发过程中就需要对asm和dex2jar都保持怀疑的态度,以免由于asm或dex2jar的Bug而影响到开发的效率。

幸运的是,asm5.0版非常地成熟,到目前还没发现Bug,而dex2jar0.95版有一点Bug,但更新到2.0版后,至今也没发现有严重的Bug。不过dex2jar有个小问题,就是不支持保留行号和调试信息。

下面总结一下asm的优劣:

  • 优势:
    开发简单,调试相对比较容易,框架都相对比较成熟。
  • 劣势:
    dex2jar不支持保留行号和调试信息,程序出Bug后无法进行堆栈还原。

ASMDEX

asmdex修改的是dex文件,因而可以直接处理android应用,不需要依赖其它工具,这一点使得asmdex使用起来更方便。

在介绍asmdex中我曾经提到一些asmdex的问题,像增加新的临时变量的问题、asmdex在支持JNI上存在问题等等,具体请参照2.4章。

下面总结下asmdex的优劣:

  • 优势:
    可直接处理dex文件,支持保留行号等,使用起来非常方便。
  • 劣势:
    如果开发时要新增临时变量的话,开发难度非常高,另外asmdex框架自身的bug很多。

smali/baksmali

我们知道,smali库支持dex文件与smali文件互转。smali文件类似于java源文件,它们都是文本文件,里面包含了类、属性、方法的定义及相关代码等等。

一般破解android应用的作法都是通过baksmali反汇编dex产生对应的smali文件,修改完成后再通过smali汇编成dex。因此我们也可以通过编写自动化工具来模拟这个过程,不过这样一来,就需要写解释器之类的,显然会有些复杂。

smali/baksmali虽然开源,但其实际是一套工具,因而并不像asm和asmdex那样提供对外的API接口。不过正因为它是开源的,就自然有办法通过改它的代码来实现我们想要的功能,具体请查看2.5章。

下面总结下smali/baksmali的优劣:

  • 优势:
    android自带工具,比较成熟可靠,使用起来非常简单。
  • 劣势:
    开发成本比较高。

总结

我们可以看到,三个库都各有优劣,不过对比下劣势,asmdex的劣势比较明显,暂时不适合混淆工具的开发。

而asm的劣势主要在于dex2jar的问题,这问题在之后版本的dex2jar或许会修复,且混淆本来就是增加破解难度的目的,因而行号和调试信息保留的意义相对不大。当然一般成熟的应用都会有相应的crash上报,也就是说行号也是有一定的必要性的。

smali库除了开发成本高以外,没什么其它问题,因此对于有强烈需要保留行号的,可使用smali,否则使用asm,当然自己改下dex2jar保留行号,也是可以的。

有人觉得奇怪,既然asmdex都不适合开发混淆工具,那为啥要介绍它呢?原因有二,其一是多介绍一款工具,提供更多的方案选择,同时更有对比性。其二是asmdex的问题在于修改dex时会有很多困难,但如果有只读取不修改的需求的话,那么asmdex是最好的选择,在第三章中我们将能看到它的身影。