Ubuntu反编译ROM Apk教程

作者: 七号大蒜 | 来源:发表于2016-12-05 19:39 被阅读644次

    [TOC]
    今日需参考ROM厂商部分APK,故查阅走坑以做记录

    工具

    除了参考资源有时候需要参考别人的代码,此时需要做以下准备工具
    自备梯子找最新版本,懒人请进20170401愚人节更新

    工具 作用 下载地址
    ApkTool Goolge官方提供的APK反编译工具十分强大, 是以下几个工具的综合体 https://ibotpeaches.github.io/Apktool/install/
    dex2jar 将dex文件转为jar包及.class文件 https://github.com/pxb1988/dex2jar
    baksmali.jar 将Odex文件转为Dex文件 https://bitbucket.org/JesusFreke/smali/downloads
    smali.jar 将.smali文件重新打包转为Dex文件 https://bitbucket.org/JesusFreke/smali/downloads
    JD-GUI jar\dex.smali源码查看工具(收费及30天试用 http://jd-gui-for-linux.apponic.com/download/
    JAVA 环境 null

    以上工具ApkTool分ubuntu及windows版本请区别下载,其余无差。工具的安装配置及环境不作赘述,ubuntu的话注意某些权限配置就行。

    反编译资源文件

    如参考图片、布局之类,可以直接将APK解压出来的目录结构如下:

    ├── AndroidManifest.xml
    ├── META-INF
    │   ├── CERT.RSA
    │   ├── CERT.SF
    │   └── MANIFEST.MF
    ├── res
    │   ├── anim
    │   ├── animator
    │   ├── color
    │   ├── drawable
    │   ├── layout
    │   └── xml
    └── resources.arsc
    

    直接解压获取到res目录如果是加壳了的,得到的xml文件内容会乱码,图片可用。此时用ApkTool处理apktool d -f flyme-res_temp.apk, 然后会在同级目录生成同名文件夹,xml资源全暴露包括Manifest。

    反编译源码文件

    有兴趣者可以直接使用ApkTool来反编译,对照下最后的结果瞅瞅 =。=

    1.拿到dex文件####

    • 普通apk
      直接解压或者使用ApkTool工具反编译得到如下目录, 没错就是那个classes.dex文件
    ├── AndroidManifest.xml
    ├── assets
    ├── classes.dex
    ├── META-INF
    │   ├── CERT.RSA
    │   ├── CERT.SF
    │   └── MANIFEST.MF
    ├── res
    └── resources.arsc
    
    • 厂商预置apk
      以下以系统预置的SystemUI.apk为例
    adb root
    adb remount
    adb pull /system/priv-app/XXX /某个目录
    //获取到如下目录
    SystemUI
    ├── lib
    │   └── arm64
    │       └── libnative_glrenderer.so
    ├── oat
    │   └── arm64
    │       └── SystemUI.odex
    └── SystemUI.apk
    

    这里需要把SystemUI目录导出来不止是apk文件,原因是由于厂商预置的apk资源和代码文件是分开的,即资源是放到.apk文件中,代码是放到对应.odex文件中。另外,由于系统apk或是预置apk会有依赖ROM的framework.jar和framework-res.apk及其他jar包,所以需要将这几个包也导出来,为避免遗漏,可将整个目录导出来adb pull /system/framework /某个目录。获取到预置或者系统的apk后,最后我们想要得到的是.odex文件。但是odex文件和dex文件是有区别的,详请自查。所以我们需要将odex文件转为dex文件。

    • .odex to .smali
      将依赖的odex包、jar包、oat文件放到同一个目录下执行java -jar baksmali.jar x XXX.odex,此时将会在同级目录下生产out目录省略如下
    ├── android
    │   └── support
    │       ├── annotation
    │       │   ├── CallSuper.smali
        ~
    │       │   └── StringDef.smali
    │       ├── v4
    │       │   ├── app
    │       │   │   ├── BackStackState$1.smali
                   ~
    │       │   │   └── FragmentTabHost$SavedState.smali
    │       │   ├── graphics
    │       │   │   └── ColorUtils.smali
    │       │   ├── media
    │       │   │   ├── MediaDescriptionCompat$1.smali
                   ~
    │       │   ├── os
    │       │   ├── util
    │       │   ├── view│            
    │       │   └── widget
    │       └── v7
    ~
    

    可以看到反编译解析出来的都是.smali文件,其实对于高手smali文件就可以看出很多东西了,具体请移步googlesmali语法

    • .smali to .dex
      此时需要将.smali文件重新打包成jar或是dex,执行java -jar smali.jar as out/,该指令是讲将out目录下的smali文件重新打包回dex文件,会生成名为out.dex的文件

    2.将dex文件转为jar####

    将dex2jar-2.0解压得到如下目录

    ├── d2j-baksmali.bat
    ├── d2j-baksmali.sh
    ├── d2j-dex2jar.bat
    ├── d2j-dex2jar.sh
    ├── d2j-dex2smali.bat
    ├── d2j-dex2smali.sh
    ├── d2j-dex-recompute-checksum.bat
    ├── d2j-dex-recompute-checksum.sh
    ├── d2j_invoke.bat
    ├── d2j_invoke.sh
    ├── d2j-jar2dex.bat
    ├── d2j-jar2dex.sh
    ├── d2j-jar2jasmin.bat
    ├── d2j-jar2jasmin.sh
    ├── d2j-jasmin2jar.bat
    ├── d2j-jasmin2jar.sh
    ├── d2j-smali.bat
    ├── d2j-smali.sh
    ├── d2j-std-apk.bat
    ├── d2j-std-apk.sh
    ├── lib
    │   ├── antlr-runtime-3.5.jar
    │   ├── asm-debug-all-4.1.jar
    │   ├── d2j-base-cmd-2.0.jar
    │   ├── d2j-jasmin-2.0.jar
    │   ├── d2j-smali-2.0.jar
    │   ├── dex-ir-2.0.jar
    │   ├── dex-reader-2.0.jar
    │   ├── dex-reader-api-2.0.jar
    │   ├── dex-tools-2.0.jar
    │   ├── dex-translator-2.0.jar
    │   ├── dex-writer-2.0.jar
    │   └── dx-1.7.jar
    └──out.dex 我们源dex文件
    

    .bat为windows命令格式,.sh为linux格式。此时需要将必要的几个文件赋权限

    sudo chmod +x d2j_invoke.sh
    sudo chmod +x out.dex
    sudo chmod +x d2j-dex2jar.sh
    

    若无权限会报错./d2j-dex2jar.sh: 36: ./d2j-dex2jar.sh: ./d2j_invoke.sh: Permission denied
    然后执行./d2j-dex2jar.sh out.dex就会在当前目录生成dex2jar out.dex -> ./out-dex2jar.jar即得到我们需要的jar包

    3.JD-GUI导入jar查看源码####

    JD-GUI导入jar

    更新:2016.12.15
    以上.
    写文不易 转载注明 http://www.jianshu.com/users/b98475c0edcf/latest_articles
    qqq

    相关文章

      网友评论

        本文标题:Ubuntu反编译ROM Apk教程

        本文链接:https://www.haomeiwen.com/subject/moklmttx.html