【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )


更多 ProGuard 混淆配置参考 : https://www.guardsquare.com/en/products/proguard/manual/usage





一、Proguard 混淆后的报错信息



前提 : proguard-rules.pro 混淆配置中配置保留行数 ;

# 保留行数
-keepattributes SourceFile,LineNumberTable

当代码混淆后 , 如果出现报错信息 , 此时报错信息全部都是被混淆过的信息, 无法从中找出可用的信息 ;

混淆后 报错信息不可读 ;


下面是截取出的混淆后的报错信息 :

2020-11-10 12:01:59.426 28142-28142/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: kim.hsl.handler, PID: 28142
    java.lang.RuntimeException: Unable to start activity ComponentInfo{kim.hsl.handler/kim.hsl.handler.MainActivity}: java.lang.NullPointerException: Attempt to read from field 'b.a.a.d b.a.a.b.a' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3897)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:219)
        at android.app.ActivityThread.main(ActivityThread.java:8349)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
     Caused by: java.lang.NullPointerException: Attempt to read from field 'b.a.a.d b.a.a.b.a' on a null object reference
        at b.a.a.a.<init>(Handler.java:30)
        at kim.hsl.handler.MainActivity.onCreate(MainActivity.kt:24)
        at android.app.Activity.performCreate(Activity.java:8085)
        at android.app.Activity.performCreate(Activity.java:8073)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3870)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473) 
        at android.os.Handler.dispatchMessage(Handler.java:110) 
        at android.os.Looper.loop(Looper.java:219) 
        at android.app.ActivityThread.main(ActivityThread.java:8349) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055) 

报错信息 , at b.a.a.a.(Handler.java:30) , 报错的是混淆后的信息 , 可读性很差 ;





二、Proguard 混淆映射文件 mapping.txt



前提 : proguard-rules.pro 混淆配置中配置保留行数 ;

# 保留行数
-keepattributes SourceFile,LineNumberTable

Proguard 混淆后 , 会提供一个 原始代码混淆过的代码 的对应关系文件 mapping.txt ;

该文件存放在 app\build\outputs\mapping\debug 目录下 ;

在这里插入图片描述


上面的报错信息 :

     Caused by: java.lang.NullPointerException: Attempt to read from field 'b.a.a.d b.a.a.b.a' on a null object reference
        at b.a.a.a.<init>(Handler.java:30)

在 mapping.txt 查找 b.a.a.a 类 , 对应的原始类是 kim.hsl.handler.Handler ;

在这里插入图片描述


解读 mapping.txt 文件中的信息 :

kim.hsl.handler.Handler -> b.a.a.a:
    kim.hsl.handler.MessageQueue mQueue -> a
    13:31:void <init>() -> <init>
    39:42:void sendMessage(kim.hsl.handler.Message) -> a

kim.hsl.handler.Handler 类名被混淆成了 b.a.a.a ,

kim.hsl.handler.MessageQueue mQueue 成员名称被混淆成了 a ,

39:42:void sendMessage(kim.hsl.handler.Message) 方法名称被混淆成了 a ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,Classes.dex是包含了Java字节码的文件,是应用程序的核心文件之一。如果这个文件被反编译,攻击者可以轻松地获取应用程序的核心代码和逻辑,从而进行恶意攻击。因此,加密混淆Classes.dex文件是非常必要的。 以下是一些常用的加密混淆Classes.dex文件的方法: 1. 使用ProGuard混淆ProGuard是一个开源的Java字节码混淆器,可以对Java字节码进行压缩、优化和混淆。它可以删除未使用的代码、重命名类、方法和属性名,并且可以将代码分成多个不同的文件。使用ProGuard混淆器可以有效地保护应用程序的代码不被反编译。 2. 使用DexGuard混淆DexGuard是一个专门为Android应用程序设计的混淆器,可以对Java字节码进行更加复杂的混淆加密。它可以使用高级的代码混淆加密技术,如字符串加密、类加密、方法加密、代码搬运、代码膨胀等等。使用DexGuard混淆器可以更加有效地保护应用程序的代码不被反编译。 3. 使用加密算法加密Classes.dex文件 可以使用加密算法对Classes.dex文件进行加密,可以使用对称加密算法或非对称加密算法。对称加密算法包括AES、DES、RC4等等,非对称加密算法包括RSA、DSA等等。加密后的Classes.dex文件只有在运行时才能被解密,可以有效地保护应用程序的代码不被反编译。 总之,加密混淆Classes.dex文件是非常必要的,可以有效地保护应用程序的核心代码和逻辑。使用ProGuard混淆器或DexGuard混淆器都可以实现代码混淆加密,同时可以使用加密算法加密Classes.dex文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值