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专属的文件和运行时环境。
如果还有具体的配置细节或者代码实现的疑问,随时问我就行~




