图片 4

Android的反编译和代码混淆

java代码编译成二进制class文件,这个class文件也可以反编译成源代码,除了注释外,其他的code基本都可以看到。为了防止重要code被泄露,我们往往需要混淆,即把方法名,变量名,类名,包名等这些java元素的名称改成让人意想不到的名称,这样代码结构就没有变化,还可以运行,但是想弄懂代码的架构却很难。proguard就起到了这样的作用:一、它可以分析一组class的结构,根据用户的配置,然后把这些class文件中可以混淆的java元素进行混淆二、删除无效的代码三、对代码进行优化(使用adt插件导出的apk,还进行zipalign优化)

系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包

废话不多说:混淆文件模版基本上差不多拿过来可以直接用,android
studio在项目的app目录下proguard-rules.pro文件模版如下:记得把自己的包名改一下,没用的的库删掉,自己需要的一些第三方SDK或gradle引用库的混淆规则也要加上

包括以下内容

# Add project specific ProGuard rules here.# By default, the flags in this file are appended to flags specified# in /Users/speakJ/Documents/sdk/android-sdk-macosx/tools/proguard/proguard-android.txt# You can edit the include path and order by changing the proguardFiles# directive in build.gradle.## For more details, see# http://developer.android.com/guide/developing/tools/proguard.html# Add any project specific keep options here:# If your project uses WebView with JS, uncomment the following# and specify the fully qualified class name to the JavaScript interface# class:-keepclassmembers class fqcn.of.javascript.interface.for.webview { public *;}#指定代码的压缩级别-optimizationpasses 5#包明不混合大小写-dontusemixedcaseclassnames#不去忽略非公共的库类-dontskipnonpubliclibraryclasses #优化 不优化输入的类文件-dontoptimize #预校验-dontpreverify #混淆时是否记录日志-verbose # 混淆时所采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#保护注解-keepattributes *Annotation*# 保持哪些类不被混淆-keep public class * extends android.app.Fragment-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#如果有引用v4包可以添加下面这行-keep public class * extends android.support.v4.app.Fragment#忽略警告-ignorewarning#####################记录生成的日志数据,gradle build时在本项目根目录输出#################apk 包内所有 class 的内部结构-dump class_files.txt#未混淆的类和成员-printseeds seeds.txt#列出从 apk 中删除的代码-printusage unused.txt#混淆前后的映射-printmapping mapping.txt#####################记录生成的日志数据,gradle build时 在本项目根目录输出-end################################混淆保护自己项目的部分代码以及引用的第三方jar包library#########################-keep public class com.ctcf.originsign.R$*{public static final int *;}#########tinker######### tinkerEnabled = true 自动keep#-keepattributes *Annotation*#-dontwarn com.tencent.tinker.anno.AnnotationProcessor#-dontwarn tInKEr.pReVEnT.PrEVErIfIEd.STuBCLaSS#-keep @com.tencent.tinker.anno.DefaultLifeCycle public class *#-keep public class * extends android.app.Application {# *;#}##-keep public class com.tencent.tinker.loader.app.ApplicationLifeCycle {# *;#}#-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle {# *;#}##-keep public class com.tencent.tinker.loader.TinkerLoader {# *;#}#-keep public class * extends com.tencent.tinker.loader.TinkerLoader {# *;#}#-keep public class com.tencent.tinker.loader.TinkerTestDexLoad {# *;#}###your dex.loader patterns here#-keep class com.tencent.tinker.loader.**#-keep class com.shudu.anteater.MyApplication#########tinker#########-keepclasseswithmembernames class com.rey.material.widget.** { *;}#Glide-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *;}#rx-keep class rx.android.** { *;}-keep class rx.** { *;}-keep class com.jakewharton.rxbinding.** { *;}-keep class com.trello.rxlifecycle.** { *;}-keep class io.reactivex.** { *;}-keep class cn.sharesdk.** { *;}#==================gson==========================-dontwarn com.google.**-keep class com.google.gson.** {*;}#==================protobuf======================-dontwarn com.google.**-keep class com.google.protobuf.** {*;}#jpush end#自己项目特殊处理代码-keep class com.yshr.model.** { *; }#如果引用了v4或者v7包-dontwarn android.support.**############混淆保护自己项目的部分代码以及引用的第三方jar包library-end##################-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*;}#保持 native 方法不被混淆-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);}#保持 Parcelable 不被混淆-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 类也不被混淆-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; !private <fields>; !private <methods>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}-keepclassmembers class * { public void *ButtonClicked(android.view.View);}#不混淆资源类-keepclassmembers class **.R$* { public static <fields>;}#高德地图-keep class com.amap.api.location.**{*;}-keep class com.amap.api.fence.**{*;}-keep class com.autonavi.aps.amapapi.model.**{*;}# AgentWeb-keep class com.just.library.** { *;}-dontwarn com.just.library.**# kotlin 反射-keep class kotlin.** { *; }-keep class org.jetbrains.kotlin.** { *; }-keepclassmembers,allowoptimization enum * { public static **[] values(); public static ** valueOf(java.lang.String); **[] $VALUES; public *;}-keep class com.chad.library.adapter.** {*;}-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter-keep public class * extends com.chad.library.adapter.base.BaseViewHolder-keepclassmembers public class * extends com.chad.library.adapter.base.BaseViewHolder { <init>(android.view.View);}-keepattributes InnerClasses#AgentWeb-keep class com.just.library.** { *;}-dontwarn com.just.library.**-keepclassmembers class com.just.library.agentweb.AndroidInterface{ *; }-keepnames class * extends android.view.View-keep class * extends android.app.Fragment { public void setUserVisibleHint; public void onHiddenChanged; public void onResume(); public void onPause();}-keep class android.support.v4.app.Fragment { public void setUserVisibleHint; public void onHiddenChanged; public void onResume(); public void onPause();}-keep class * extends android.support.v4.app.Fragment { public void setUserVisibleHint; public void onHiddenChanged; public void onResume(); public void onPause();}
  1. 要反编译apk需要下面3个工具
  2. 反编译资源文件
  3. 反编译类文件
  4. 代码混淆

在build.gradle文件中引用配置proguardFiles
getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’

release { // 不显示Log, 在java代码中的调用方式为:BuildConfig.LOG_DEBUG buildConfigField "boolean", "LOG_DEBUG", "false" minifyEnabled true zipAlignEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }
  1. apktool作用:资源文件获取,可以提取图片文件和布局文件进行使用查看
  2. dex2jar作用:将APK反编译成java源码(classes.dex转化成jar文件)
  3. jd-gui作用:查看APK中classes.dex转化成的jar文件,即源码文件

如何测试一个apk的代码是否被混淆过方案一:一、
下载dex2jar包,解压二、把apk包的后缀名改为.zip三、把apk压解压拿到classes.dex文件,并放到dex2jar所在的目录下四、在dex2jar所在的目录下运行命令sudo
sh d2j-dex2jar.sh classes.dex之后生成
classes-dex2jar.jar五、下载jd-gui六、把jar包加载到jd.gui,查看源码,源码中的类名,方法名,变量名是否已经改变注意:选择classes-dex2jar.jar文件时如果提示路径不对,需要把这个文件拷贝出来放到桌面再打开就可以了作为一个测试不仅检测自己的apk是否被混淆过,而且要测试是否混淆成功,且混淆正确1、安装被混淆过的apk,进行功能测试2、查看混淆好的系统,是否仍保留:Android系统组件,自定义View,Android
Parcelable,Android R文件等不能被混淆的文件

下面进行反编译资源文件和类文件:

mac环境混淆apk、dex2jar、jd-dui下载和详细使用方法

资源文件:包括图片资源、布局资源、动画、样式等其他资源

图片 1image.png图片 2image.png图片 3image.png

这样资源文件都可以看得到了。

方式一:反编译得到Java类1.下载并解压dex2jar-2.0,得到dex2jar-2.0文件夹,里面包含dex2jar.bat及其文件2.将apk文件改为xx.zip文件,并解压得到classes.dex文件,并将其复制到dex2jar-2.0文件夹中3

图片 4image.png

发表评论

电子邮件地址不会被公开。 必填项已用*标注