Android Apk的反编译和加密
这几天在上海出差,忙里偷闲学习了一下Apk的反编译工具的基本使用。下面就简单介绍一下如何将我们从网上下载的Apk文件进行反编译得到我们想要获得的资源文件和源码。
Android的应用程序APK文件说到底也是一个压缩文件,那么可以通过解压缩得打里面的文件内容,不过很显然,当你去解压完去查看的时候,发现里面的很多东西和你想象中的不太一样。资源文件等xml文件基本打不开,即使打开了也都是乱码(而这正是Android进行加密过),有些应用会将图片资源等的也加密(如qq音乐)。


而既然直接解压无法看到正常的应用程序,那么就需要借助反编译软件来实现APK的反编译。
Android工程文件主要有资源文件和源代码组成。而为了查看资源文件需要借助一个工具,本文使用的是apktool工具进行反编译,经过编译后能够正确查看XML文件和其他的非XML的资源文件,这对于汉化而言有着巨大的意义。而为了查看源码,则需要借助于dex2jar和jd-gui这两个工具,其中dex2jar工具负责将dex文件转化为jar文件,而jd-gui则用于查看jar文件。
使用apktool时报错

原因:apktool的版本过低,无法解析当前版本的apk。
更新最新的apktool版本后正常,本文使用的最新apktool版本为2.2.2.
然后就可以发现资源文件等xml文件可以正常打开。



接下来就需要对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。

接下来需要在jd-gui中浏览该文件,这个就是最终的结果

当然,你也发现了这些源码都是被混淆了的,即用无意义的字母来重命名类、成员变量、方法和属性以及删除没用的注释。
既然都提到了这里了,我们也顺便了解一下Android Apk的加密过程。
由于Java字节码的特殊性,使得它非常容易被反编译,(正如刚才我们进行的那些操作,借助一下工具就反编译了一个QQ音乐的Apk),因此,显然我们会有一些保护措施,对编译好的Class文件进行一些保护。通常我们都会使用ProGuard来对Apk进行混淆处理,用无意义的字母俩重命名类、成员变量、方法和属性。(当然它能删除一些无用的类、成员变量、方法和属性以及删除没用的注释,最大程度优化字节码文件)
而现在我们一般都采用Android Studio作为开发平台,在该平台下可以很方便的使用ProGuard,在Gradle Script文件夹下,打开build.gradle(Module:app)文件,显示如下:

这里的minifyEnable即为控制是否启动ProGuard的开关,设置为true则开启ProGuard进行混淆和优化。
而proguardFiles分为两部分,前半部分是一个系统默认的混淆文件,位于SDK目录下的tools/proguard/proguard-android.txt,一般情况下使用这个默认的文件即可,另一部分是项目中自定义的混淆文件,可以在项目中的App文件夹中找到这个文件,在这个文件夹中可以定义引入的第三方依赖包的混淆规则。配置好ProGuard后,只要使用AS导出Apk,即可生成混淆后的字节码文件。
Android Apk的反编译和加密的更多相关文章
- android apk 防止反编译技术第三篇-加密
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第四篇-对抗JD-GUI
又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net ...
- 转: android apk 防止反编译技术(1~5连载)
转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...
- android apk 防止反编译技术第一篇-加壳技术
做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成 ...
- android apk 防止反编译技术第二篇-运行时修改字节码
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- Android Apk的反编译与代码混淆
一.反编译 1.获取工具: 既然是反编译,肯定要用到一些相关的工具,工具可以到这里下载,里面包含三个文件夹,用于反编译,查看反编译之后的代码: 其实这两工具都是google官方出的,也可在google ...
- android apk 文件反编译
最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar 获取源码工具 地 ...
- android apk简单反编译
1. 查看或者提取资源文件: 使用谷歌官方工具apktool,命令行如下: apktool d xxx.apk xxx_decode d代表反编译,xxx.apk为你要反编译的apk,xxx_ ...
随机推荐
- 感觉不止被Q了一下,还不知道被谁套了一个虚弱
最近身体出现了一些问题,导致博客无法正常更新,只能是看身体状态更新了,相信用不了半个月就会满血复活的,请谅解 Joker在这里提醒大家 身体是革命的本钱,不要透支,不要过度消耗
- User Browsing Model简介
搜索引擎的点击日志提供了很多有价值的query-doc相关性信息,但是这些信息是有偏的,因为对于用户没有点击过的doc,我们无法确定其是否真实地被用户浏览过.即日志中记录的展现信息与实际的展现信息之间 ...
- js中元素(图片)切换和隐藏显示问题
这个知识点其实也简单,(当然是在理清思路的情况下),在没预习的情况下听的还真是艰难,上课以来唯一的一次懵逼了一天,感觉乱乱的,全是新属性,所以今晚的我破天荒的熬夜敲代码,一定要弄懂! 现在就来梳理下头 ...
- Linux - 进程间通信 - 命名管道
1.命名管道的特点: (1)是管道,可用于非血缘关系的进程间的通信 (2)使用命名管道时,梁金成需要用路径表示通道. (3)命名管道以FIFO的文件形式存储于文件系统中.(FIFO:总是按照先进先出的 ...
- Vue 事件驱动和依赖追踪
之前关于 Vue 数据绑定原理的一点分析,最近需要回顾,就顺便发到随笔上了 在之前实现一个自己的Mvvm中,用 setter 来观测model,将界面上所有的 viewModel 绑定到 model ...
- 使用RandomAccessFile在两个java进程之间传递数据
大部分情况下,我们面对在两个java进程只见传递数据的问题时,第一个想到的就是开server,然后通过socket收发消息.这方面有大量的框架可用,就不细说了.但如果两个进程是在一台机器上,那么还可以 ...
- Spring Boot 学习笔记
参考资料 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ Spring Boot简介 Spring Boot使 ...
- spring security 配置多个AuthenticationProvider
前言 发现很少关于spring security的文章,基本都是入门级的,配个UserServiceDetails或者配个路由控制就完事了,而且很多还是xml配置,国内通病...so,本文里的配置都是 ...
- 转:修改Tomcat控制台标题
转自:http://blog.csdn.net/chanryma/article/details/46930729 背景:用控制台方式启动Tomcat,控制台的标题默认是"Tomcat&qu ...
- 转:Java compiler level does not match the version of the installed Java project facet
a.问题描述:eclipse加载新的项目后报一个错误,具体描述如下: Description Resource PathLocation Type Java compiler level does n ...