为何需要反编译

作为一名Android开发者,很多的时候需要去学习别人优秀的代码,原本在GitHub上就有很多开源的项目代码,但有的时候在使用软件时候遇到自己想要的功能时,想要学习实现的代码时,这时候就需要使用到反编译这项技术了。

什么是反编译

总的来说反编译指两个部分的反编译,一个是代码的反编译(src),一个是资源的反编译(res)。

反编译的工具

这里同样分成两个部分,一个是代码的反编译工具,一个是资源的反编译工具。

代码反编译的工具:

  • dex2jarjd-gui:dex2jar将Android APK内的dex转化为jar文件,然后使用jd-gui可以查看,保存为java文件。

  • jadx:jadx是一个非常好用的反编译工具,可以原作者已经没有维护了。但也不妨成为一个经典工具。

反编译资源的工具:

  • APKTool:使用APKTool将布局图片等资源可以提取出来。

反编译的流程

在这里我用一个之前编写的一个简单软件来作为演示。

(Ⅰ). 首先需要拿到反编译的软件,拿到的软件一般是xxx.apk,但有的时候拿到的软件会是xxx.apk和xxx.odex,后者是平台优化过的产物,关于xxx.apk与xxx.odex的合并会在另一篇文章中讲到。拿到完整apk以后,手就可以着手反编译的工作了。

(Ⅱ). 反编译资源文件:

java -jar apktool_2.3.1.jar d -f KeyValueTest.apk -o KeyValueTest
  • 执行以上命令以后如下未报错则说明反编译成功:

  • 参数说明:
    • -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
    • -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
    • -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
    • -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)
  • 此时便在当前文件夹下生成了一个KeyValueTest文件夹

  • 在这个文件夹下面便是反编译出来的资源文件,我们只需要res目录和AndroidManifest.xml文件。



    对比layout:



    对比AndroidManifest.xml:

  • 通过对比发现,APKTool反编译出来的资源文件都可以直接使用了!

(Ⅲ). 反编译代码文件:

  • 将apk文件修改后缀为zip然后解压或者直接解压,得到以下文件目录如下:

  • 此处我们关注的是classes.dex文件,这个文件就是类似于Java中的字节码文件(.class),所以我们要先使用dex2jar将.dex文件反编译为jar文件。dex2jar文件目录结构如下,其中用到的为d2j-dex2jar.bat。

  • 将classes.dex放入该文件夹,当前文件路径下,命令行输入d2j-dex2jar.bat classes.dex

  • 然后生成相应jar文件:

  • 使用jd-gui打开,发现多了一个BuildConfig,这个是编译时候的配置文件不用管

  • 在MainActivity中,对比反编译得到的代码与源代码,基本无异。在资源的引用上,替换成了数字,这个数字可以通过在R中查找替换回去。





    R中查找到的资源ID

  • 通过jd-gui的保存功能(Save All Source)便可将代码保存下来

(Ⅳ). 可以使用dex2jar,也可以使用jadx对classes.dex进行反编译,相对于dex2jar,jadx更加方便快捷,打开bin文件中的jadx-gui.bat然后直接选择APK即可,虽然jadx也可反编译资源文件,但有时候并不准确。



(Ⅴ). 综上,反编译APK可以采用APKTool+JADX,也可以采用APKTool+dex2jar。推荐使用前者。有一个在线的反编译网站,采用的是JADX。

->由此去<-

(Ⅵ). 至此,可以得到结论在未加扰的情况下,基本可以得到和源代码一摸一样的代码,加扰的情况阅读起来会很费劲,在此不做演示。将得到的res和AndroidManifest.xml以及java文件整合在一起,便得到了一份内似于源代码的代码。

以上属于个人体验心得总结,若有不足之处,还望不吝赐教,欢迎批评指正,共同进步

Android 反编译技术流程的更多相关文章

  1. Android反编译技术总结

    一.Apk反编译工具及其使用方法 1.原理 学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的. 这里有两篇AndroidWeekly中推荐 ...

  2. 通过Android反编译技术研究国内陌生人社交即时通讯的技术方案

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/100 即时通讯IM类App分析 这两周对国内陌生人社交领域 ...

  3. android apk 防止反编译技术第四篇-对抗JD-GUI

    又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net ...

  4. 转: android apk 防止反编译技术(1~5连载)

    转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...

  5. android apk 防止反编译技术第一篇-加壳技术

    做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成 ...

  6. android apk 防止反编译技术第二篇-运行时修改字节码

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  7. android apk 防止反编译技术第三篇-加密

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  8. android apk 防止反编译技术第二篇-运行时修改Dalvik指令

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  9. Android 反编译

    Android 反编译 步骤:1.下载apktool 工具,这一步 主要是反编译 xml 文件. 步骤:2 把xx.smali 文件转为java 工具 (单个) 图形界面 下载dex2jar  和xj ...

随机推荐

  1. 改变某个对象的CSS样式时,不要使用JS直接添加样式,

    重绘: 使用js改变网页的背景颜色 浏览器会把整个网页的颜色重新在画一遍,导致性能降低 回流: 只要改变某个DOM对象的宽或者高,浏览器就会重新再计算网页结构,重新生成一次,导致性能严重降低. CSS ...

  2. sql server 子查询 和exists使用

    概述 子查询的概念: 当一个查询是另一个查询的条件时,称之为子查询.子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 外面的 ...

  3. MongoDB 查看集合是否分片

    MongoDB会把分片过的集合保存在config.collection集合中,若需要查看分片键,则需要根据该集合进行查找.官方的其他很多分片快捷命令也都处于config库 三种方式 1.去config ...

  4. 【luoguP4777】【模板】扩展中国剩余定理(EXCRT)

    (扩展)中国剩余定理 对于一组同余方程 \(x\equiv a_1(mod \quad n_1)\) \(x\equiv a_2(mod \quad n_2)\) \(x\equiv a_3(mod ...

  5. Tomcat 解决jvm中文乱码,控制台乱码

    解决方法 打开tomcat/conf/目录 修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8 这行 更 ...

  6. Echart-无需json文件的树状图(源码)超级简单,小白的福音

    源码: <!DOCTYPE html> <head> <meta charset="utf-8"> <script type=" ...

  7. vue-上拉加载、下拉刷新组件

    vue在移动端开发过程中,上拉加载.下拉刷新是页面的基本需求,现在给大家介绍一种基于touch事件封装的刷新组件. 组件支持传参.传递事件.请求成功异步回调.上拉与触底触发加载或刷新. 父子组件间的通 ...

  8. vue 页面间传值

    使用params传参 ,不能使用path 只能使用name 使用params传参,刷新参数会消失 router/index.js import Vue from 'vue' import Router ...

  9. Alpha项目冲刺! Day2-产出

    各个成员今日完成的任务 林恩:任务分工,博客撰写,设计设置等模块 杨长元:学习安卓本地数据库建立 李震:如何写登录界面登录页面,如何下载模板 胡彤:连接服务端 寇永明:提供页面 王浩:提供页面 李杰: ...

  10. python何时用list,dict,set

    从读取的角度来讲: 看是用来随机读取(查询)还是连续读取. list数组集中存放,连续读取效率高(具体还没测试,理论上应该如此). dict散列表,使用hash计算存放的位置,随机读取效率高. 随机读 ...