9.5.3 Android Apk 反编译 & 9.5.4 Android Apk 加密
首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到apk文件的这个过程,我们称之为“编译”;“反编译”的话,顾名思义,粗略地说就是与“编译”相反的过程咯,也就是从apk文件开始,经过一系列工具解压最后得到源码的过程。当然,顺逆之言,说的只是起始点的逆反置换,个中具体的过程还是不尽相同的。
接着再说一下apk文件。Android的应用程序Apk文件(即app安装文件,Android系统会自动识别后缀为apk的文件,并将之认为是app安装文件,可以选着进行安装)是一个压缩文件,可以通过普通解压工具(如WinRAR、360解压等)获得里面的文件内容。
我们找来一个Apk文件
(可以下载一个软件的安装包来做实验,或者自行用Android studio通过签名生成apk文件(对签名生成apk不了解的同学,可以戳一下这里详细了解一下);这里用的就是撰写本文时用Android studio通过签名生成的apk文件app-release.apk),
然后使用普通解压工具(如WinRAR、360解压等)直接解压app-release.apk,可以得到文件夹app-release,工作目录如下:
进入文件夹app-release,目录如下,可以看到许多相对于Android开发者很熟悉的东西,类似于Android开发的时候所使用的工作目录和对应的文件夹、文件等等,
像图中——用来放置代码、音像图片等各种资源的的res目录以及可以配置应用程序和各个组件等信息的AndroidManifest.xml文件等:
但是当你试图去打开查看这些文件时,你会发现资源文件等xml文件基本无法打开,即使能打开也是如下图的乱码,这些乱码就是Android加密过的文件:(如下图的AndroidManifest.xml)
既然使用普通解压工具直接解压Apk文件是无法获得正常的应用程序,那么来看看如何使用正确的方法反编译应用程序。
首先请出三个重量级的工具,如下:
这三个工具分别负责反编译不同的部分、不同的过程。
必须说的是,现在市场上厂家生产的app基本上都是有自己很成熟的混淆规则和加密体系,所以要解析这些apk文件便需要更高超的反编译技术了,当然这种行为也是不可取的,侵犯了厂家的知识产权!所以本文讲的反编译主要是比较理想的apk条件环境,即面向开源的没有添加负责混淆规则的apk文件。让大家对反编译有一个基础的了解。
9.5.3.1 apktool
首先来反编译apk中的XML文件,利用apktool_2.3.3.jar。打开cmd命令行窗口,在命令行里边使用cd命令进入工具目录(放置所要解压的apk文件的目录),执行命令:
java -jar apktool_2.3.3.jar d -f app-release.apk
执行完毕后,可以得到对应的输出文件:
打开这个文件夹:
这时候打开res目录中的xml文件(如下图的AndroidManifest.xml):
此时可以正确地查看这些XML文件而不是之前的乱码了。这个工具在汉化软件的时候非常有用,可以提取资源文件并进行汉化,然后执行如下命令重新打包回去(这里的打包便是顺编译的没有加密的过程了)即可:
java -jar apktool_2.3.3.jar b app-release
重新打包的命令与解码的命令相似,只是将d改为b,并选择前面解码生成的文件夹。执行该命令后,在文件夹下就会生成两个新的文件夹,如下图所示dist和build文件夹,重新打包的APK就在dist目录下:
下一步,解决Source Code。
9.5.3.2 Dex2jar、jd-gui
先回到刚刚用解压缩工具apktool解压apk后、重新打包后得出来的那个build文件夹,文件夹中有一个非常重要的文件,如下图的classes.dex文件:
这个文件就是源代码打包后的文件,将它复制到第二个解压工具dex2jar-0.0.9.15的根目录下,然后在cmd窗口使用cd命令进入工具dex2jar-0.0.9.15的目录并执行下面的代码:
d2j-apk-sign.bat classes.dex
cmd上会开始分析,分析完毕后,在工具dex2jar-0.0.9.15的目录目录下生成了一个jar文件:
到这里,打开第三个工具jd-gui.exe;
选择file-open file,并选择刚刚生成的classes-dex2jar.jar文件,即可查看相关源代码:
总结思路:
使用apktool将apk反编译成文件夹,
再重新打包生成build和dist目录以及相关文件(包括classes.dex),
使用Dex2jar将classes.dex分析生成jar文件,
对jar文件使用jd-gui即可查看相关的源代码。
9.5.4 Android Apk 加密
由于Java字节码的特殊性,使得它非常容易被反编译。因此,为了能够对编译好的Java Class文件进行一些保护,通常会使用ProGuard来对Apk进行混淆处理,用无意义的字母来重命名类、字段、方法和属性。当然,ProGuard不仅仅可以用来混淆代码,还可以删除无用的类、字段、方法和属性,以及删除没用的注释,最大限度地优化字节码文件。
在Android Studio中,打开app目录下的build.gradle文件:
**这里的minifyEnabled属性就是控制ProGuard的开关,将即设置为true,即可开启混淆功能,在使用AS导出apk时,即可生成混淆。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android绘制(二):来用Path绘出想要的图形吧!
Android绘制(一):来用shape绘出想要的图形吧! 目录 前言 绘制线 绘制图形 绘制弧 绘制文字 组合 贝塞尔曲线 最后 前言 之前有一篇用shape进行绘制的, 但是那个偏向静态, path结合属性动画可以动起来哦~ path是什么? 来看看官方的介绍: The Path class encapsulates compound (multiple contour) geometric paths consisting of straight line segments, quadratic curves, and cubic curves. It can be drawn with canvas.drawPath(path, paint), either filled or stroked (based on the paint's Style), or it can be used for clipping or to draw text on a path. 咕果翻译一下就是: Path类封装了由直线段,二次曲线和三次曲线组成的复合(多个轮廓)几何路径。 它可以使用ca...
- 下一篇
Android中的设计模式之工厂方法模式
参考 《设计模式:可复用面向对象软件的基础 》3.3 Factory method 对象创建型模式 《Android源码设计模式解析与实战》第5章 应用最广泛的模式--工厂方法模式 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类 别名 虚构造器 适用性 当一个类不知道它所必须创建的对象的类的时候 当一个类希望由它的子类来指定它所创建的对象的时候 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 结构 结构 角色 Product 定义工厂方法所创建的对象的接口 ConcreteProduct 实现Product接口 Factory 声明工厂方法,该方法返回一个Product类型的对象,也可以定义一个默认实现,返回一个默认的ConcreteProduct对象 ConcreteFactory 重定义工厂方法以返回一个ConcreteProduct对象 协作 Factory依赖于它的子类来实现工厂方法,所以它返回一个合适的ConcreteProduct实例。 简单代码...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路