Android反编译技术流程
为何需要反编译
作为⼀名Android开发者,很多的时候需要去学习别⼈优秀的代码,原本在GitHub上就有很多开源的项⽬代码,但有的时候在使⽤软件时候遇到⾃⼰想要的功能时,想要学习实现的代码时,这时候就需要使⽤到反编译这项技术了。
什么是反编译
总的来说反编译指两个部分的反编译,⼀个是代码的反编译(src),⼀个是资源的反编译(res)。
反编译的⼯具
这⾥同样分成两个部分,⼀个是代码的反编译⼯具,⼀个是资源的反编译⼯具。
代码反编译的⼯具:
与:dex2jar将Android APK内的dex转化为jar⽂件,然后使⽤jd-gui可以查看,保存为java⽂件。
:jadx是⼀个⾮常好⽤的反编译⼯具,可以原作者已经没有维护了。但也不妨成为⼀个经典⼯具。
反编译资源的⼯具:
:使⽤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⽬录和l⽂件。
对⽐layout:
对⽐l:
通过对⽐发现,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
(Ⅳ). 可以使⽤dex2jar,也可以使⽤jadx对classes.dex进⾏反编译,相对于dex2jar,jadx更加⽅便快捷,打开bin⽂件中的jadx-gui.bat然后直接选择APK即可,虽然jadx也可反编译
资源⽂件,但有时候并不准确。
网站源码在线
(Ⅴ). 综上,反编译APK可以采⽤APKTool+JADX,也可以采⽤APKTool+dex2jar。推荐使⽤前者。有⼀个在线的反编译⽹站,采⽤的是JADX。
-><-
(Ⅵ). ⾄此,可以得到结论在未加扰的情况下,基本可以得到和源代码⼀摸⼀样的代码,加扰的情况阅读起来会很费劲,在此不做演⽰。将得到的res和l以及java⽂件整合在⼀起,便得到了⼀份内似于源代码的代码。
以上属于个⼈体验⼼得总结,若有不⾜之处,还望不吝赐教,欢迎批评指正,共同进步

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。