`
hyshucom
  • 浏览: 811791 次
文章分类
社区版块
存档分类
最新评论

APK反破解之一:Android Java混淆(ProGuard)

 
阅读更多

http://bbs.pediy.com/showthread.php?t=137112

AndroidJava混淆(ProGuard)ProGuard简介

ProGuard是一个SourceForge上非常知名的开源项目。官网网址是:http://proguard.sourceforge.net/

Java的字节码一般是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。

引用ProGuard官方的一段话来介绍就是:

ProGuardisafreeJavaclassfileshrinker,optimizer,obfuscator,andpreverifier.Itdetectsandremovesunusedclasses,fields,methods,andattributes.Itoptimizesbytecodeandremovesunusedinstructions.Itrenamestheremainingclasses,fields,andmethodsusingshortmeaninglessnames.Finally,itpreverifiestheprocessedcodeforJava6orforJavaMicroEdition.

AndroidEclipse开发环境与ProGuard

在Android2.3以前,混淆Android代码只能手动添加proguard来实现代码混淆,非常不方便。而2.3以后,Google已经将这个工具加入到了SDK的工具集里。具体路径:SDK\tools\proguard。当创建一个新的Android工程时,在工程目录的根路径下,会出现一个proguard的配置文件proguard.cfg。也就是说,我们可以通过简单的配置,在我们的elipse工程中直接使用ProGuard混淆Android工程。

具体混淆的步骤非常简单。首先,我们需要在工程描述文件default.properties中,添加一句话,启用ProGuard。如下所示:

代码:
#ThisfileisautomaticallygeneratedbyAndroidTools.
#Donotmodifythisfile--YOURCHANGESWILLBEERASED!
#
#ThisfilemustbecheckedinVersionControlSystems.
#
#TocustomizepropertiesusedbytheAntbuildsystemuse,
#"build.properties",andoverridevaluestoadaptthescripttoyour
#projectstructure.
#Indicateswhetheranapkshouldbegeneratedforeachdensity.
split.density=false
#Projecttarget.
target=android-10
proguard.config=proguard.cfg

这样,Proguard就可以使用了。当我们正常通过AndroidTools导出ApplicationPackage时,Proguard就会自动启用,优化混淆你的代码。

名称:  clip_image002.jpg查看次数: 1001文件大小:  27.6 KB

导出成功后,你可以反编译看看混淆的效果。一些类名、方法名和变量名等,都变成了一些无意义的字母或者数字。证明混淆成功!


proguard.cfg配置

稍微深入想一下混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?

这个是靠proguard.cfg文件来进行配置的。Android工程中默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下:

代码:
-optimizationpasses5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*
-keeppublicclass*extendsandroid.app.Activity
-keeppublicclass*extendsandroid.app.Application
-keeppublicclass*extendsandroid.app.Service
-keeppublicclass*extendsandroid.content.BroadcastReceiver
-keeppublicclass*extendsandroid.content.ContentProvider
-keeppublicclass*extendsandroid.app.backup.BackupAgentHelper
-keeppublicclass*extendsandroid.preference.Preference
-keeppublicclasscom.android.vending.licensing.ILicensingService

-keepclasseswithmembernamesclass*{
native<methods>;
}

-keepclasseswithmembernamesclass*{
public<init>(android.content.Context,android.util.AttributeSet);
}

-keepclasseswithmembernamesclass*{
public<init>(android.content.Context,android.util.AttributeSet,int);
}

-keepclassmembersenum*{
publicstatic**[]values();
publicstatic**valueOf(java.lang.String);
}

-keepclass*implementsandroid.os.Parcelable{
publicstaticfinalandroid.os.Parcelable$Creator*;
}


它主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。因为这些子类,都是可能被外部调用的。

另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类。

在实际的一个工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些ProGuard配置。这方面的资料在官网的Manual->Usage里有详细说明。大家可以研究一下。


参考资料

《ProGuard官方》
《Android2.3代码混淆proguard技术介绍》


分享到:
评论

相关推荐

    Android-apk

    在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”可以对代码进行混淆,反编译后是很难看懂的。把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可。只是把...

    zxing.java源码解析-Confusion:Android代码混淆

    减小apk文件的大小,在混淆过程中会删除未使用过的类和成员 代码安全,使类、函数、变量名随机变成无意义的代号形如:a,b,c...之类。防止app被反编译之后能够很容易的看懂代码 3.怎样使用混淆: 在app下面的build....

    Android如何防止apk程序被反编译

    proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。 下面具体说一说怎么样让SDK2.3下的proguard.cfg文件起作用

    apk自定义混淆字典集合.zip

    在 android studio中的默认混淆打包出来的文件是abcdefg这种字母字典,想要修改混淆字典就得自定义配置,使用自定义混淆字典进行混淆,增加app被反编译后阅读的难度, 压缩包里面包含1il、o0O、中文、java关键字、...

    详解Android代码混淆实战

    Android SDK 自带了混淆工具Proguard。它位于SDK根目录\tools\proguard下面。如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三方包是不能混淆的,这就需要我们手动...

    AndResGuard:微信团队为Android提供的proguard资源

    AndResGuard是用于减少apk大小的工具,它的作用类似于ProGuard for Java源代码,但仅针对资源文件。 它将res/drawable/wechat为r/d/a ,并将资源文件wechat.png重命名为a.png 。 最后,它用7zip重新打包了apk,这...

    AndResGuard:微信团队为Android提供的proguard资源

    AndResGuard是用于减小apk大小的工具,它的作用类似于ProGuard for Java源代码,但仅针对资源文件。 它将res/drawable/wechat为r/d/a ,并将资源文件wechat.png重命名为a.png 。 最后,它使用7zip重新打包了apk,这...

    Android studio 混淆配置详解

    studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。 功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。 优点: 1.删除项目无用的...

    ProGuard6.1.1汉化,窗口大小被优化调整

    软件使用方法,请参照网络提供教程 其中关键字未被汉化,如public,private,等 其他实用工具如下: android资源清理工具:...Apk加密工具:https://bbs.pediy.com/thread-251275.htm

    AndroidApk混淆编译时,报告java.io.IOException…错误解决办法

    Java.io.IOException: The same input jar [E:\Android\myProgram\angel\libs\alipaySdk-20160825.jar] is specified twice. 首先 看一下我项目中关于此jar的配置,我在libs中导入了alipaySdk-20160825.jar,

    Android如何防止apk程序被反编译(尊重劳动成果)

    Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一proguard文件夹 proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难...

    Android Studio配置反混淆的实现

    Android Studio如何混淆 为什么要混淆 了解安卓程序编译的会知道 其实我们的apk并不是很安全,从apk从可以解包出,步骤: 将apk文件改成zip结尾 然后解压zip 然后就会发现里面有一个classes.dex dex2jar 这个工具将...

    详解Android的反编译和代码混淆

    作用:将APK反编译成java源码(classes.dex转化成jar文件) 3、jd-gui 作用:查看APK中classes.dex转化成的jar文件,即源码文件 下面进行反编译资源文件和类文件: 反编译资源文件 资源文件:包括图片资源、布局资源...

    Java-ApkObfuscate

    这套项目可对Android APK的代码进行不同程度地静态混淆。项目本来作为公司客户端安全方面的预研,后因各种方向调整而并没上线。所以开源以免代码完全浪费了,有心人在改进功能后可向我pull request,我会合并到开源...

    antiguard:修复Android逆向工程师smali项目的类和包冲突

    当对用proguard混淆的apk进行反向工程时,修复类和程序包冲突。 关于 如果您正在处理smali项目,则此工具将帮助您解决类-程序包冲突。 想一想下面的目录结构。 在这个例子中,如果你需要访问类的a封装A / A / A / A...

Global site tag (gtag.js) - Google Analytics