美文网首页
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 反编译与混淆

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