反编译odex文件

今天使用某加密加密应用之后,发现应用安装之后在/data/data/package/目录下有一个xxx(apk名).dex文件,好奇想看看加密之后到底什么效果,是不是还可以看到源码之类的,就把这个xxx.dex文件通过adb pull到本地了。
接着就想用dex2jar工具转换成jar文件,发现居然报错了:

1
2
3
com.googlecode.dex2jar.DexException: dex-translator not
support translate an odex file, please refere smali
http://code.google.com/p/smali/ to convert odex to dex

错误信息很明了,虽然这个文件后缀是.dex,但是这是一个odex文件,dex2jar工具不支持转换,需要先将odex转换成dex文件才行

根据提示到http://code.google.com/p/smali/下载对应的工具,以下是反编译odex文件的步骤:

  1. 下载smali工具(http://code.google.com/p/smali/)
    将下面列表中的四个文件都下载下来

  2. 新建一个目录
    我这里建的目录名叫做baksmali,将第一步下载的四个文件移到baksmali文件夹里面

  3. 在baksmali文件夹中再新建一个system文件夹

  4. 在system文件夹下再新建一个framework文件夹
    因为后面在运行baksmali反编译命令的时候需要比如core.jar,framework.jar,ext.jar,android.policy.jar等jar包的支持,这些jar包在apk安装对应的rom的/system/framework文件夹里面都有,所以我们在本地建一个对应的目录,然后通过adb pull命令讲这些jar包pull到本地的baksmali/system/framework目录下

当然3、4步并不是必须的,你完全可以选择将baksmali命令所需的jar包pull下来之后放到和baksmali工具同一个目录里面,这样也是完全可以的,支持比较混乱

建好之后的目录结构是这样的:

  1. 下载所需jar包
    切换到本地的baksmali/system/framework目录,执行:

    1
    adb pull /system/framework

    这样就把rom里面/system/framework目录下所有的jar包下载到本地framework目录了。

  2. 开始反编译odex文件
    切换到本地的baksmali目录下,执行如下命令:

    1
    java -jar baksmali-2.0.3.jar -d system/framework -x xxx.odex

    -d参数就是指定到那个目录下寻找那些所需的jar文件,如果所需的jar包就在当前目录,那么就不需要指定该目录了。
    命令执行完成之后就会在当前目录下生成一个out目录,该目录里面就是对应的smali文件

  3. 生成dex文件
    我们需要将生成的out目录转换成dex文件,执行如下命令:

    1
    java -jar smali-2.0.3.jar  -o classes.dex out

    该命令就是根据out目录生成一个dex文件,-o是指定生成的dex文件的别名,执行完成之后就会生成一个classes.dex的真正dex文件,接下来就轻松了

  4. 下载安装dex2jar工具,下载地址:https://github.com/pxb1988/dex2jar
    mac下直接执行如下命令即可

    1
    brew install dex2jar

    安装完成之后执行:

    1
    d2j-dex2jar classes.dex

    命令执行后会生成一个classes-dex2jar.jar文件

  5. 下载安装JD-GUI查看java代码,下载地址:http://jd.benow.ca/

就是这么简单,odex挡住了dex2jar,却没挡住baksmali,不过有些加密你会发现你反编译odex之后看到的也只是一个空壳而已,可能需要高级的内存dump工具来获取内存中的代码文件进行分析。