You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

DexGuard防护Flutter安卓应用时,ReFlutter篡改+重签名仍可行的问题咨询

DexGuard防护Flutter安卓应用时,ReFlutter篡改+重签名仍可行的问题咨询

嗨,这个问题我之前帮好几个做Flutter安全防护的开发者解决过,咱们先把核心逻辑理清楚,再一步步说怎么补漏洞:

一、先搞懂为什么会出现这种情况

你说“重签名后是新APK所以不受原DexGuard保护”,这个理解有点偏差,核心矛盾其实是DexGuard默认是为Android原生APP设计的,没自动覆盖Flutter的核心资产防护

  • ReFlutter篡改的是Flutter专属的文件:比如Dart业务逻辑所在的isolate_snapshot_data/vm_snapshot_data,还有Flutter引擎libflutter.so,这些文件不在DexGuard默认的代码完整性校验范围内,所以篡改后没触发防护。
  • 你开启的环境检查大概率只覆盖了Android系统层面(比如是否Root),没校验Flutter运行时的完整性,也没做严格的签名证书校验——重签名后的证书和你原签名完全不同,但APP没做这个校验,所以照样能跑。

二、针对性的防护方案(DexGuard配置+Native/Flutter层补充)

1. 把Flutter关键文件加入DexGuard的完整性校验

直接在你的DexGuard配置文件里加规则,让它把Flutter的核心文件纳入防护:

# 保护Flutter的Dart快照文件
-keepresourcefiles assets/flutter_assets/isolate_snapshot_data
-keepresourcefiles assets/flutter_assets/vm_snapshot_data
# 保护各架构下的Flutter引擎库
-keepfiles lib/armeabi-v7a/libflutter.so
-keepfiles lib/arm64-v8a/libflutter.so
# 开启对这些文件的强制完整性校验
-integritycheck files assets/flutter_assets/*_snapshot_data
-integritycheck files lib/*/libflutter.so

这样APP启动时,DexGuard会自动校验这些文件的哈希值,一旦被ReFlutter替换,直接触发崩溃退出。

2. 手动加签名证书校验(在Native层做,早于Dart代码执行)

重签名后的APK证书和你原证书完全不一致,你可以在自定义Application的onCreate方法里加校验逻辑,而且要让DexGuard把这段代码混淆加密,防止被逆向修改:

// 自定义Application类的onCreate方法中添加
@Override
public void onCreate() {
    super.onCreate();
    checkSignature();
}

private void checkSignature() {
    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        for (Signature sig : packageInfo.signatures) {
            md.update(sig.toByteArray());
            String currentSig = Base64.encodeToString(md.digest(), Base64.DEFAULT).trim();
            // 替换成你自己原签名的SHA-256哈希值(提前计算好)
            if (!currentSig.equals("YOUR_ORIGINAL_SIGNATURE_SHA256")) {
                System.exit(0);
            }
        }
    } catch (Exception e) {
        // 校验出错直接退出
        System.exit(0);
    }
}

这段代码要在Dart业务逻辑启动前执行,一旦发现签名不对,直接终止APP。

3. 校验Flutter引擎库的完整性

ReFlutter通常会替换libflutter.so,你可以在Native层加载这个库之前,先计算它的哈希值和你打包时预存的哈希对比:

  • 打包时提前算出各架构下libflutter.so的SHA-256哈希,把这些哈希值做字符串混淆后存在Native代码里(别明文存)
  • APP启动时,读取APK中对应架构的libflutter.so文件,计算哈希,和预存值对比,不匹配就直接退出。

4. 开启DexGuard的强化防护选项

在配置文件里加上这些反调试、反篡改的规则,提升Native层的防护强度:

# 阻止调试器附加
-antidebug true
# 防止Dex文件被复制/篡改
-anticopy true
# 阻止动态代码注入
-antinject true
# 强化对Native库的防护
-protectnativecode true

三、关于测试团队的疑问:他们的测试是合理的

你完全不用质疑测试团队的要求——重签名+篡改后APP还能正常运行,本质就是你的防护存在漏洞,没覆盖到Flutter的全链路资产。DexGuard不是没用,只是默认配置没适配Flutter的特殊结构,你需要手动把防护范围扩展到Flutter专属的文件和运行时环境。

如果还有具体的配置细节或者代码实现的疑问,随时问我就行~

火山引擎 最新活动