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_ ...
随机推荐
- 【算法】字符串匹配之Z算法
求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输 ...
- vim 字符串替换整理
公司项目测试,要在vi编辑其中进行多路径修改,这时候用到了字符串替换的知识,在这里我自己整理了一下. 一.基本内容替换,无特殊符号 :s/old/new/ 替换当前行第一个 old 为 new ...
- java.net.SocketException: Broken pipe 异常可能的原因
org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Broken pipe at org.apa ...
- 基于JS的问卷调查
主要工作 因为代码不好展示,也不好截长图,可以去看我的GitHub地址:https://github.com/14glwu/MyBlog/blob/master/questionnaire.html ...
- 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home
https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 ...
- SOA与基于CDIF的API的联动
几千年来,巴别塔的故事一直是人类面对的一个核心的困境.为了交流和沟通我们人类创造出语言,但沟通与交流仍然存在障碍……相同语言之间的沟通依语境的不同,尚且存在巨大的鸿沟,不同语言之间更是让人坐困愁城. ...
- javascript 中 with 的使用
1)简要说明 with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性.要给对象创建新的属性,必须明确地引用该对象. 2)语法格式 with(object ...
- Android ec环境配置
ec环境配置 1.0概述 鉴于很多同事,或者新从事android开发,虽然会做android的开发,但是会遇见一些最基本的环境搭建问题,本文仅作为(win7 64位系统)eclipse中集成andro ...
- C语言中,隐藏结构体的细节
我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装 ...
- 9、JcomboBox下拉框事件监听
9.JcomboBox下拉框事件监听 JComboBox()的事件监听类ItemListener.其范例代码如下: import java.awt.*; import java.awt.event.* ...