AndroidApk的反编译和加密
  这⼏天在上海出差,忙⾥偷闲学习了⼀下Apk的反编译⼯具的基本使⽤。下⾯就简单介绍⼀下如何将我们从⽹上下载的Apk⽂件进⾏反编译得到我们想要获得的资源⽂件和源码。
⼀、Apk⽂件组成
  Android的应⽤程序APK⽂件说到底也是⼀个压缩⽂件,那么可以通过解压缩得打⾥⾯的⽂件内容,不过很显然,当你去解压完去查看的时候,发现⾥⾯的很多东西和你想象中的不太⼀样。资源⽂件等xml⽂件基本打不开,即使打开了也都是乱码(⽽这正是Android进⾏加密过),有些应⽤会将图⽚资源等的也加密(如qq⾳乐)。
⽽既然直接解压⽆法看到正常的应⽤程序,那么就需要借助反编译软件来实现APK的反编译。
⼆、反编译必备⼯具及使⽤
  Android⼯程⽂件主要有资源⽂件和源代码组成。⽽为了查看资源⽂件需要借助⼀个⼯具,本⽂使⽤的是apktool⼯具进⾏反编译,经过编译后能够正确查看XML⽂件和其他的⾮XML的资源⽂件,这对于⽽⾔有着巨⼤的意义。⽽为了查看源码,则需要借助于dex2jar和jd-gui这两个⼯具,其中dex2jar⼯具负责将dex⽂件转化为jar⽂件,⽽jd-gui则⽤于查看jar⽂件。
1)apktool怎么看qq加密相册
⼀次失败的经历-----使⽤apktool时报错
原因:apktool的版本过低,⽆法解析当前版本的apk。
修正:
更新最新的apktool版本后正常,本⽂使⽤的最新apktool版本为2.2.2.
然后就可以发现资源⽂件等xml⽂件可以正常打开。
2)Dex2jar
接下来就需要对source code进⾏反编译。
需要借助⼯具Dex2jar和jd-gui。其中Dex2jar,顾名思义就是将dex⽂件反编译为jar⽂件。⽽jd-gui则⽤于直接查看jar包中的源代码。
具体步骤就是将apk⽂件解压,得到其中的classes.dex,它就是java⽂件经过编译⽽后通过dx⼯具打包⽽成的,⽽后解压下载的dex2jar,将classes.dex复制到dex2jar根⽬录下,在命令⾏下定位到该⽬录下,
运⾏d2j-dex2jar.bat classes.dex classes.dex
可以发现得到⼀个classes-dex2jar.jar⽂件。这个⽂件就是我们需要得到的source code。
3)jd-gui
接下来需要在jd-gui中浏览该⽂件,这个就是最终的结果
当然,你也发现了这些源码都是被混淆了的,即⽤⽆意义的字母来重命名类、成员变量、⽅法和属性以及删除没⽤的注释。
三、Apk的加密过程
  既然都提到了这⾥了,我们也顺便了解⼀下Android Apk的加密过程。
  由于Java字节码的特殊性,使得它⾮常容易被反编译,(正如刚才我们进⾏的那些操作,借助⼀下⼯具就反编译了⼀个QQ⾳乐的Apk),因此,显然我们会有⼀些保护措施,对编译好的Class⽂件进⾏⼀些保护。通常我们都会使⽤ProGuard来对Apk进⾏混淆处理,⽤⽆意义的字母俩重命名类、成员变量、⽅法和属性。(当然它能删除⼀些⽆⽤的类、成员变量、⽅法和属性以及删除没⽤的注释,最⼤程度优化字节码⽂件)
  ⽽现在我们⼀般都采⽤Android Studio作为开发平台,在该平台下可以很⽅便的使⽤ProGuard,在Gradle Script⽂件夹下,打开adle(Module:app)⽂件,显⽰如下:
这⾥的minifyEnable即为控制是否启动ProGuard的开关,设置为true则开启ProGuard进⾏混淆和优化。
⽽proguardFiles分为两部分,前半部分是⼀个系统默认的混淆⽂件,位于SDK⽬录下的tools/,⼀般情况下使⽤这个默认的⽂件即可,另⼀部分是项⽬中⾃定义的混淆⽂件,可以在项⽬中的App⽂件夹中到这个⽂件,在这个⽂件夹中可以定义引⼊的第三⽅依赖包的混淆规则。配置好ProGuard后,只要使⽤AS导出Apk,即可⽣成混淆后的字节码⽂件。