如何告诉proguard混淆jar包的类名

7509人阅读
工作技能及技巧(18)
由于java和.net这类高层抽象语言,具有 天生的易反汇编 特性,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息
根据其编译后的程序包,可以非常容易的得到 近乎源代码质量 的反汇编代码。如果不加混淆,相当于直接将源代码拱手送人,内容严密的app权限审核可以说是形同虚设。如果大家想避免源代码泄漏后重新修改策划而额外增加的工作量,建议都加上混淆。
android平台的混淆原理是用“ 不能直接猜出含义 的通用变量名和函数名a b c等”替换编译后程序包中“ 具有明显语义信息 的变量名和函数名”
这样,通过逆向工程得到的只是 难以理解 的代码。
从混淆的原理可以得出以下两点信息:
1.重命名变量名可能会导致程序异常。因为程序是需要跟平台交互的,平台只会以固定类名来调用我们的app,这就涉及到需要屏蔽不能重命名的函数及类 proguard.cfg文件就是起这个作用的,混淆后哪个地方出错,就将相关的类和函数加入到混淆屏蔽列表里面去
2.由于混淆只改变字符串,并不能改变程序逻辑,耐心的hacker还是能够理解程序的设计思路并尝试修改。但这类人群不会太多,加上有我们自定义框架的牵制,逆向工程也绝非轻而易举。
这个世界上没有不能破解的软件,只有 不值得破解 的软件,只有 逆向的成本超过了收益 ,我们的软件资产才是安全的,混淆则可以显著增加逆向成本。
在package编译时使用proguard混淆,即使用晦涩的名字重命名类名、字段名、函数名,以精简、优化和混淆代码。使用proguard处理的好处是apk文件会有一点点变小,同时更加难于被反编译。类似说明网上有很多,大家可以自己搜索了解一下。
下面几步,开发者只用关注第 3、4、5、6步即可
1、全局混淆选项,修改build/core/package.mk
ifndef LOCAL_PROGUARD_ENABLED
ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)
& & # turn on Proguard by default for user & userdebug build
& & LOCAL_PROGUARD_ENABLED :=full
2、全局flag文件修改,屏蔽-dontobfuscate。修改build/core/proguard.flags
# Don't obfuscate. We only need dead code striping.
#-dontobfuscate
3、在自己模块下创建proguard.cfg文件,用来配置混淆选项,初始文件如下:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
& & native &methods&;
-keepclasseswithmembers class * {
& & public &init&(android.content.Context, android.util.AttributeSet);
-keepclasseswithmembers class * {
& & public &init&(android.content.Context, android.util.AttributeSet, int);
-keepclassmembers class * extends android.app.Activity {
& &public void *(android.view.View);
-keepclassmembers enum * {
& & public static **[] values();
& & public static ** valueOf(java.lang.String);
-keep class * implements android.os.Parcelable {
& public static final android.os.Parcelable$Creator *;
4、在Android.mk里每个package类型的LOCAL_MODULE里LOCAL_PACKAGE_NAME下面添加两句,
& & & LOCAL_PROGUARD_ENABLED := full #指定当前的应用打开混淆
& & & LOCAL_PROGUARD_FLAG_FILES := proguard.cfg #指定混淆配置文件
5、编译时设置环境变量使用. ./setenv.sh -bv user
6、遇到报错需要就需要修改proguard.cfg文件,规则可以找google。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:860235次
积分:7822
积分:7822
排名:第2073名
原创:109篇
转载:68篇
评论:112条
(1)(1)(2)(5)(1)(1)(4)(4)(2)(5)(1)(1)(1)(1)(3)(4)(1)(2)(6)(3)(4)(2)(1)(7)(10)(2)(6)(7)(4)(1)(1)(7)(2)(4)(7)(2)(6)(11)(6)(12)(2)(1)(7)(8)(2)(2)(4)Android&混淆打包详解_这是一个秘密_新浪博客
Android&混淆打包详解
第一步:开启混淆功能​
取消project.properties里面关于proguard的注释。​
删除“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”前的“#”注释。(这里指的是混淆配置文件在SDDK目录下,你也可以把配置文件放到目录下,引用时改为:“proguard.config=./proguard-android.txt:proguard-project.txt”即可)​
第二步:自定义“proguard-project.txt”文件​
proguard-android.txt是SDK自带的对Android系统混淆的一般性配置文件,一般工程不需要修改此配置文件,在此不再赘述。主要讲一下proguard-project.txt的自定义。​​
哪些功能需要配置:​
系统默认的配置已经涵盖了大部分的内容,但是如果你的工程中有如下内容,则需要手动添加配置到proguard-project.txt文件中。
(1) 只在 AndroidManifest.xml 引用的类(proguard-android.txt 已默认配置)
(2) 通过JNI回调方式被调用的函数(proguard-android.txt 已默认配置)
(3) 运行时动态调用的函数或者成员变量
当然,如果你不确定哪些需要手动配置,可以以默认的配置生成程序,当运行中发现ClassNotFoundException异常时,即可找到哪个类不该被混淆。
语法:​
{filename}&&&
从给定的文件中读取配置参数
-basedirectory
{directoryname}&&&
指定基础目录为以后相对的档案名称
{class_path}&&&
指定要处理的应用程序jar,war,ear和目录
{class_path}&&&
指定处理完后要输出的jar,war,ear和目录的名称
-libraryjars
{classpath}&&&
指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
-dontskipnonpubliclibraryclasses&&&
指定不去忽略非公共的库类。
-dontskipnonpubliclibraryclassmembers&&&
指定不去忽略包可见的库类的成员。
-keep {Modifier}
{class_specification}&&&
保护指定的类文件和类的成员
-keepclassmembers {modifier}
{class_specification}&&&
保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers
{class_specification}&&&
保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
-keepnames
{class_specification}&&&
保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames
{class_specification}&&&
保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames
{class_specification}&&&
保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds
{filename}&&&
列出类和类的成员-keep选项的清单,标准输出到给定的文件
-dontshrink&&&
不压缩输入的类文件
-printusage {filename}
-whyareyoukeeping
{class_specification}&&&&
-dontoptimize&&&
不优化输入的类文件
-assumenosideeffects
{class_specification}&&&
优化时假设指定的方法,没有任何副作用
-allowaccessmodification&&&
优化时允许访问并修改有修饰符的类和类的成员
-dontobfuscate&&&
不混淆输入的类文件
-printmapping {filename}
-applymapping
{filename}&&&
重用映射增加混淆
-obfuscationdictionary
{filename}&&&
使用给定文件中的关键字作为要混淆方法的名称
-overloadaggressively&&&
混淆时应用侵入式重载
-useuniqueclassmembernames&&&
确定统一的混淆类的成员名称来增加混淆
-flattenpackagehierarchy
{package_name}&&&
重新包装所有重命名的包并放在给定的单一包中
-repackageclass
{package_name}&&&
重新包装所有重命名的类文件中放在给定的单一包中
-dontusemixedcaseclassnames&&&
混淆时不会产生形形色色的类名
-keepattributes
{attribute_name,...}&&&
保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile,
Deprecated, Synthetic, Signature, and
InnerClasses.
-renamesourcefileattribute
{string}&&&
设置源文件中给定的字符串常量​
(1) 不混淆某个类的构造函数
例如:不混淆Test类的构造函数:
-keepclassmembers classcom.ticktick.example.Test {public (int,int);}
(2) 不混淆某个包所有的类或指定的类
例如,不混淆package com.ticktick.example下的所有类/接口
-keep class com.ticktick.example.** { * ; }
例如,不混淆com.ticktick.example.Test类:
-keep class com.ticktick.example.Test { * ; }
如果希望不混淆某个接口,则把上述命令中的class替换为interface即可。
(3) 不混淆某个类的特定的函数
例如:不混淆com.ticktick.example.Test类的setTestString函数:
-keepclassmembers classcom.ticktick.example.Test {public void setTestString(java.lang.String);}
(4) 不混淆某个类的子类,某个接口的实现
例如:不混淆com.ticktick.example.Test类的子类
-keep public class * extends com.ticktick.example.Test
例如:不混淆com.ticktick.example.TestInterface的实现
-keep class * implementscom.ticktick.example.TestInterface {public static final com.ticktick.example.TestInterface$Creator *;}
(5) 添加第三方依赖包
例如:添加android-support-v4.jar依赖包
-libraryjarslibs/android-support-v4.jar-dontwarnandroid.support.v4.**{*;}-keep class android.support.v4.**{*;}-keep interface android.support.v4.**{*;}
需要添加dontwarn,因为默认情况下proguard会检查每一个引用是否正确,但是第三方库里往往有些不会用到的类,没有正确引用,所以如果不配置的话,系统会报错。
5. 混淆后的调试信息解析
当代码混淆之后,输出的Log信息也会带有混淆内容,比如函数名和类名会被替换为晦涩难懂的名字,而与代码中的不一致。
因此,ProGuard工具还提供了恢复混淆内容的工具和文件。
当你开启了ProGuard混淆后,每次生成release版的apk时,Andriod工程的根目录下会对应生成一个proguard文件夹,该文件夹下的mapping.txt文件记录了混淆后的名字与混淆前的名字的对应关系,通过该文件,我们反向得到恢复后的Log信息。
假设Log文件名为log.txt,则恢复混淆的命令为:
$retrace.sh -verbose mapping.txt log.txt
注1:retrace.sh命令位于 /tools/proguard/目录下
注2:你需要保存每一个release版本的mapping.txt,因为每一次release的混淆结果和映射关系都不一样。
关于Android的代码混淆我就总结到这儿了,你也可以去ProGuard的官方网页上获取关于ProGuard更加详细的介绍,有任何疑问欢迎留言或者来信lujun.交流。​
引入微信开放平台不能混淆成功时请参考:http://blog.csdn.net/jiguangcanhen/article/details/
这是一个秘密
博客等级:
博客积分:0
博客访问:137,555
关注人气:0
荣誉徽章:匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。[android] Proguard代码混淆器怎么排除指定的类或子类 - Android当前位置:& &&&[android] Proguard代码混淆器怎么排除指定的类或子[android] Proguard代码混淆器怎么排除指定的类或子类&&网友分享于:&&浏览:190次[android] Proguard代码混淆器如何排除指定的类或子类
[android] Proguard代码混淆器如何排除指定的类或子类
转载自 /blog/500496
使用Proguard代码混淆器,特别要注意一点的就是使用了反射机制的类属性或方法最好不要参与混淆.
Proguard 4.5 相关的选项配置如下:
修改配置文件: proguard.cfg
#不要混淆MyBean的所有属性与方法
-keepclasseswithmembers class MyBean {
&methods&;
#不要混淆MySuperBean所有子类的属性与方法
-keepclasseswithmembers class * extends MySuperBean{
&methods&;
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有}

我要回帖

更多关于 proguard 混淆web项目 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信