Android代码混淆技术
代码混淆技术的目的简而言之,由于Java程序比较容易被反编译,为了防止别人反编译源代码,窃取应用程序中的核心技术,或者说是为了增加反编译的难度,可以通过代码混淆技术增加对源代码的保护。
一、ProGuard简介
ProGuard是一个免费的java类文件压缩、优化、混淆器。
它探测并删除没有使用的类、字段、方法和属性。它删除没有用的说明并使用字节码得到最大优化。它使用无意义的名字来重命名类、字段和方法。优化的步骤分析和优化了类方法的字节码;混淆的步骤使用无意义的名字来重命名类、字段和方法。这些最初的步骤,使代码库更小,更高效,更难以进行逆向工程。最后的预验证步骤,为这些类增加了预验证信息,这是为了在 Java 6版本中优化启动时间。
所有这些步骤都是可选的。例如,ProGuard同样可以被用于仅仅列出应用程序中的没有被调用的代码,可以提前检测和返回java6中存在的类文件。
图16-5 ProGuard处理流程图
ProGuard读取输入的jar文件(或war文件、ear文件、zip文件或目录)。然后进行压缩、优化、混淆和预校验步骤。或者,可以进行多个优化过程,一个步骤通常紧接着另一个压缩步骤。ProGuard的处理结果将会写入到jar文件(或war文件、ear文件、zip文件或目录)中。输入可能包含资源文件,其名称和内容,可以有选择地更新,以反映混淆后的类名。
ProGuard的要求到指定的库JAR文件(或war文件、ear文件、zip文件或目录)。这些都是在编译过程中所需要的库文件。ProGuard使用它们来妥善处理重建类所必需的依赖关系。库JAR文件本身将始终保持不变。
ProGuard的使用目的:
1)为了更快的网络传输,快速装载和更小的内存占用,创建更加紧凑的安装文件;
2)为了保护软件的知识产权,创建更为坚挺的程序和程序库,使得逆向工程更加困难;
3)删除源文件中的没有调用的代码;
4)充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件。
例如,下面的配置选项包含所有的applet在一个jar文件中:
-keep public class * extends java.applet.Applet
ProGuard的是快速的。它只需几秒钟就可以处理几兆的程序和程序库。ProGuard的是一个可选的图形用户界面的命令行工具。它还为Ant和JME配备了无线工具包插件。
二、ProGuard使用
在Android 2.3以前,Android混淆代码只能通过手动安装运行proguard来实现代码混淆,其实现过程比较繁琐,Proguard的使用说明及安装文件可以访问http://proguard.sourceforge.net/。而在Android 2.3以后,Google已经将Proguard工具加入到Android SDK的工具集里,具体路径为:SDK\tools\proguard。
下面以一个例子,说明如何使用ProGuard。
这里,我们用到的工程是在讲解第六章(Drawable分类汇总)时编写的Demo。在工程目录的根路径下,会有一个proguard的配置文件proguard.cfg。也就是说,我们可以通过简单的配置,就能在elipse工程中直接使用ProGuard混淆Android工程。
图16-6 工程根目录
可以看到proguard.cfg已经帮我们写好了优化代码脚本,内容如下:
01
|
-optimizationpasses 5
|
02
|
-dontusemixedcaseclassnames
|
03
|
-dontskipnonpubliclibraryclasses
|
04
|
-dontpreverify
|
05
|
-verbose
|
06
|
-optimizations !code/simplification/arithmetic,!field/*,! class /merging/*
|
07
|
08
|
-keep public class * extends android.app.Activity
|
09
|
-keep public class * extends android.app.Application
|
10
|
-keep public class * extends android.app.Service
|
11
|
-keep public class * extends android.content.BroadcastReceiver
|
12
|
-keep public class * extends android.content.ContentProvider
|
13
|
-keep public class * extends android.app.backup.BackupAgentHelper
|
14
|
-keep public class * extends android.preference.Preference
|
15
|
-keep public class com.android.vending.licensing.ILicensingService
|
16
|
17
|
-keepclasseswithmembernames class * {
|
18
|
native <methods>;
|
19
|
}
|
20
|
21
|
-keepclasseswithmembers class * {
|
22
|
public <init>(android.content.Context, android.util.AttributeSet);
|
23
|
}
|
24
|
25
|
-keepclasseswithmembers class * {
|
26
|
public <init>(android.content.Context, android.util.AttributeSet, int );
|
27
|
}
|
28
|
29
|
-keepclassmembers class * extends android.app.Activity {
|
30
|
public void *(android.view.View);
|
31
|
}
|
32
|
33
|
-keepclassmembers enum * {
|
34
|
public static **[] values();
|
35
|
public static ** valueOf(java.lang.String);
|
36
|
}
|
37
|
38
|
-keep class * implements android.os.Parcelable {
|
39
|
public static final android.os.Parcelable$Creator *;
|
40
|
}
|
从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.IlicensingService。
并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考<proguard_path>/examples中的例子及注释。)
打开default.properties文件后可以看到,如图所示:
图16-7 修改前的default.properties文件
开发人员只需打开default.properties文件,并且按照Google开发文档所描述的,在文件中加入proguard.config=proguard.cfg一行,即可完成对ProGuard的配置。
图16-8 修改后的default.properties文件
加入配置后,重新编译导入正常签名的APK文件即可。具体方法不做详细分析。
想要验证混淆结果,我们必须采用反编译工具测试ProGuard是否有效。
首先,我们从谷歌的代码库中 http://code.google.com/p/dex2jar/ 下载dex2jar工具,用于还原.jar文件。下载完成后,进行解压操作,解压完成后我们会发现在目录中包含dex2jar.bat和classes.dex文件。
将生成的APK文件用解压文件解压,得到Classes.dex文件并将其放入到dex2jar解压目录中,并调用dex2jar.bat classes.dex命令行来还原jar文件。
看到命令行成功结束之后,dex2jar 文件夹里就会有“classes.dex.dex2jar.jar” 文件了,这个就是 传说中的 jar包了。
图16-9 dex2jar工具命令行示意图
最后,我们来验证混淆结果。要验证混淆结果,必须查看.jar文件;这一步就是传统的反编译了,需要辅助工具。这里用到的工具是jd-gui,您可以从http://java.decompiler.free.fr/?q=jdgui下载获得,也可以通过其他方式下载。
用jd-gui打开“classes.dex.dex2jar.jar”,我们可以看到工程的目录结构如下:
图16-10 混淆后的工程目录结构
可以看出经过混淆后的代码其类名、字段名、变量名等都变成了没有意义的字符。如果没有进行混淆,反编译的结果中所有的类名、字段名、函数名等将和编译前没有太大差别,对于逆向工程而言非常容易。
Demo源代码下载: Drawable_Test.rar (894.6 KB, 下载次数: 5)
Android代码混淆技术相关推荐
- Android代码混淆配置说明
1.为什么需要代码混淆 Proguard混淆用于保护APP不被破解和逆向分析,Proguard通过移除没有用到的代码以及通过特定规则重命名类.变量.方法来压缩.优化.混淆你的代码.这样可以让你APK更 ...
- Android代码混淆之混淆规则
请尊重他人的劳动成果,转载请注明出处:<Android代码混淆技巧> 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆.SDK已经集成了ProGua ...
- Android 代码混淆Proguard
混淆概念 Android代码混淆,又称Android混淆,是伴随着Android系统的流行而产生的一种APP保护技术,用于保护APP不被破解和逆向分析. 在Android的具体表现就是打包时,将项目里 ...
- 被黑客们使用的代码混淆技术
长久以来,代码混淆技术一直都被认为是不能登大雅之堂的奇巧淫技,没有哪个学者会拿正眼瞧它一眼.国际C语言混乱代码大赛(International Obfuscated C Code Contest,IO ...
- android aidl混淆代码,Android代码混淆
什么是代码混淆 代码混淆就是将代码中的各种元素,如变量,方法,类和包的名字改写成无意义的名字,增加项目反编译后被读懂的难度. Android代码混淆使用ProGuard工具,ProGuard是一个压缩 ...
- android代码混淆个人总结及踩坑
android代码混淆个人总结及踩坑 前言 公司项目使用组件化开发的形式,需要对自己负责的模块进行一些混淆配置,关于混淆相信做android开发的都或多或少有过一些接触,通过对混淆文件的配置从而将代码 ...
- android 混淆后的机制,Android 代码混淆机制
Android 代码混淆机制 由于Android项目是基于java语言的,而java属于高层抽象语言,易于反编译,其编译后的程序包包含了大量的源代码变量.函数名.数据结构等信息,根据其编译打包后的AP ...
- android加密墙,Android代码混淆加密配置(Proguard文件解析)
Android代码混淆加密配置(Proguard文件解析) Android代码混淆加密配置(Proguard文件解析) 为了防止自己的APP被轻易反编译,我们需要对APK进行混淆,或者特殊加密处理.可 ...
- android混淆语法(android代码混淆工具)
android 代码混淆算法有哪些 根据SDK的版本不同有2中不同的代码混淆方式,以上的proguard.cfg参数详解中所涉及到的信息是在较低版本SDK下的混淆脚本,事实上在高版本的SDK下混淆的原 ...
最新文章
- 我给学生做单车旅行的宣传讲座
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )
- 第k短路 (A*算法)
- python如何小写p转换p_Python如何将字符串“p”从列表转换为变量值p
- 谁说Dota2赢了人类的AI太水?连比尔·盖茨都啧啧称赞了
- TCP和UDP的不同
- 3. Markdown 语法教程
- 如何使用Tomcat
- linux java Cannot allocate memory
- mac mysql5.7_Mac 安装配置 MySql(Version 5.7.22) 环境变量
- 非常经典的C语言知识点总结!
- 软件测试:测试用例八大要素模板
- 51nod 巧克力 1429
- 华为服务器鼠标不响应,华为笔记本电脑鼠标失灵没反应如何解决
- caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`
- vue中prop验证、类型检查及注意事项
- 手机内存跟电脑内存的区别
- Swift5代码添加约束
- python3 opencv 图象灰度化处理
- 爱码物联SaaS一物一码_化妆品二维码防伪溯源系统