美文网首页
Android 反编译与混淆

Android 反编译与混淆

作者: 潜心之力 | 来源:发表于2018-03-15 13:56 被阅读0次

一、反编译

  • 反编译代码工具
  • 将需要反编译的代码片段移动至dex2jar的目录下,如下图红色框中所示
  • 打开命令行,快捷方式 win+R,输入cmd,移动到dex2jar的目录下,输入命令d2j-dex2jar.bat classes.dex
  • 操作执行后,可以看见目录下多了一个jar包,如下图所示
  • 将jar包复制到jd-gui-window目录下,并打开jd-gui.exe,查看jar包的内容
  • 反编译资源文件工具
  • 将要反编译资源的apk放在与工具同样的目录下,打开命令行,跳转至工具目录下,并执行反编译指令
  • 反编译成功后,可以看见多了一个app-release文件夹,里面的资源已经被反编译过的了

二、混淆

  • java 代码混淆,proguard-rules.pro
#微信
-keep class com.tencent.mm.opensdk.** {
   *;
}
-keep class com.tencent.wxop.** {
   *;
}

#网易云信
-dontwarn com.netease.**
-keep class com.netease.** {*;}

# okhttp3
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

# glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

-keepclasseswithmembers class com.activity.** {*;}
-keepclasseswithmembers class com.model.** { *; }
-keepclasseswithmembers class com.util.** {public *** *(***);}
  • 常用自定义混淆规则
#不混淆某个类  
-keep public class com.example.Test { *; }  
#不混淆某个包所有的类  
-keep class com.test.** { *; }  
#不混淆某个类的子类  
-keep public class * extends com.example.Test { *; }  
#不混淆所有类名中包含了“model”的类及其成员  
-keep public class com.** {*;}  
#不混淆某个接口的实现  
-keep class * implements com.example.Interface { *; }  
#不混淆某个类的构造方法  
-keepclassmembers class com.example.Test {   
  public <init>(); -> 匹配被public修饰的构造方法
}  
#不混淆某个类的特定的方法  
-keepclassmembers class com.example.Test {   
  public void test(java.lang.String); -> 匹配传参为String类型的方法
}  
#保留某些类及某些成员方法
-keepclassmembers public class * extends android.view.View {
   public void *(android.view.View); ->匹配传参为View的任意方法
   public static <fields>; -> 匹配被static修饰的区域
   public *** <methods>; -> 匹配被public修饰的任意类型的方法
   public *** *(***); -> 核心
   void set*(***);
   *** get*();
}
  • 常用不混淆类
    Android四大组件、Application、自定义View、数据模型Model、第三方开源库、反射方法、枚举Enum、序列化Parcelable、WebView的JS调用接口

  • 资源文件混淆,使用微信开源工具AndResGuard,进入tool_output目录
  • 将需要混淆的apk和与之对应的签名密钥准备好
  • 配置config.xml文件,其中value是key的密码
  • 切换到tool_output目录下,并执行混淆语句
  • 混淆成功后,可以发现目录下多了一个app的文件夹
  • 进入app文件夹,其中app_signed.apk就是我们所需要的apk
  • 混淆关键字详解

-keep 指定需要保留的类和类成员
-keepclassmembers 指定需要保留的类成员:变量或者方法
-keepclasseswithmembers 指定保留的类和类成员,条件是所指定的类成员都存在
-keepnames 指定要保留名称的类和类成员,仅用于模糊处理
-keepclassmembernames 指定要保留名称的类成员,仅用于模糊处理
-keepclasseswithmembernames 指定要保留名称的类成员,仅用于模糊处理
-keepattributes SourceFile,LineNumberTable 保留行号
-keepdirectories 指定要保持的目录结构
-keepattributes Signature 保持泛型
-dontwarn 压缩,如果有警告也不终止
-ignorewarnings 忽略警告,避免打包时某些警告出现
-optimizationpasses 指定压缩级别
-dontusemixedcaseclassnames 包名不混合大小写
-dontskipnonpubliclibraryclassmembers 不跳过非公共的库的类成员
<field> 匹配类中的所有字段
<method> 匹配类中的所有方法
<init> 匹配类中的所有构造函数
* 匹配任意长度字符,但不含包名分隔符(.)
** 匹配任意长度字符,并且包含包名分隔符(.)
*** 匹配任意参数类型
… 匹配任意长度的任意类型参数

三、真机调试

1、更改(app)build.grade文件,Tip:手机通过USB安装的Apk属于Debug版本

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.singApk"
        minSdkVersion 21  -> 以免真机不能安装apk
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    signingConfigs { //配置apk签名信息,二选一

        debug {  //生成调试版的apk
            storeFile file("../debug.keystore")
        }

        release { //生成正式版的apk
            keyAlias 'keyAlias'
            keyPassword 'keyPassword '
            storeFile file('../debug.keystore')
            storePassword 'storePassword '
        }
    }

2、更改AndroidStudio的配置,选择 File -> setting -> Build,Execution,Deployment -> Instant Run


取消勾选框里的选项

3、真机的权限允许
不同的厂商有不同的权限配置,需根据不同的手机,自行搜索需要允许的权限

四、资源目录分类

当资源文件数量足够庞大的时候,为方便日后开发及维护,建议将资源文件分包管理

android {  -> app.build
    sourceSets{
        main{
            res.srcDirs=
                    [
                            'src/main/res/layout/activity',

                            'src/main/res/layout/fragment',

                            'src/main/res/layout/adapter',

                            'src/main/res/layout/popwindow',

                            'src/main/res/layout/dialog',

                            'src/main/res/layout',

                            'src/main/res'
                    ]
        }
    }
}
将layout文件分类

相关文章

  • Android Apk 反编译与混淆

    Android Apk 反编译与混淆 反编译工具 目前反编译工具有四类 1、apktool 主要用于资源文件的获取...

  • Android 混淆总结

    混淆 关于混淆的概念请移步郭霖大神博客:Android安全攻防战,反编译与混淆技术完全解析(下)。小白必看,全面易...

  • Android 反编译与混淆

    一、反编译 反编译代码工具 将需要反编译的代码片段移动至dex2jar的目录下,如下图红色框中所示 打开命令行,快...

  • Android的多渠道打包|SquirrelNote

    系列文章:Android的反编译和代码混淆Android的打包签名[Android的多渠道打包 前言 本篇包括以下...

  • Android的反编译和代码混淆

    系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包 前言 包括以下内容 ...

  • Android的打包签名

    系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包 前言 从以下几个方面...

  • Android开发安全手册

    常规安全防御手段 混淆 混淆是Android基本安全手段,虽然目前有很多工具能够反混淆,但是对于反编译调试代码还是...

  • 全面解析:Android开发中的Proguard混淆配置

    为什么要进行代码混淆?   混淆在我们实际的Android开发中是必不可少的,如果不混淆, 发布出去,别人一反编译...

  • Android如何进行混淆

    android开发为什么要进相混淆? Android开发使用Java作为开发语言,Java代码是非常容易反编译的。...

  • android之代码混淆

    项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小APK包。 Android 中通...

网友评论

      本文标题:Android 反编译与混淆

      本文链接:https://www.haomeiwen.com/subject/ezthqftx.html