使用 obfuscation 代码混淆保护你的 Flutter 应用程序
视频
https://www.bilibili.com/video/BV1ui421i7Pv/
前言
原文 https://ducafecat.com/blog/securing-your-flutter-app-with-code-obfuscation
本文将会和大家说下保护代码的重要性,和如何给程序加上混淆编译功能。
尽可能的不要在你的程序中写死各种服务秘钥,比如 oss 容易被盗用。
参考
- https://docs.flutter.dev/deployment/obfuscate
- https://www.guardsquare.com/blog/obstacles-in-dart-decompilation-and-the-impact-on-flutter-app-security
知识点
在 Flutter 项目中开启代码混淆有以下几个主要的好处:
- 提高应用安全性:
- 代码混淆会对应用程序的源代码进行转换和混淆,使其更难被逆向工程和破解。这有助于保护应用程序的知识产权和商业机密。
- 混淆后的代码不易被阅读和理解,降低了攻击者分析和篡改代码的风险。
- 减小APK文件大小:
- 代码混淆可以通过缩短变量名、移除未使用的代码等方式来减小应用程序的大小。
- 更小的APK文件意味着更快的下载速度和更高的用户体验。
- 提升应用性能:
- 代码混淆通常会对代码进行优化,消除无用的调用和重复代码,从而提高应用程序的运行效率和性能。
- 隐藏程序结构:
- 混淆后的代码不易阅读和理解,这使得攻击者更难分析应用程序的内部结构和工作原理。
- 这对于保护关键算法和业务逻辑非常有帮助。
- 降低应用被篡改的风险:
- 代码混淆会让攻击者更难定位和修改关键代码,从而降低应用被篡改的风险。
- 这对于需要高安全性的应用程序非常重要,例如金融、支付等领域的应用。
了解逆向
这里我们以 android apk 文件举例,来说明混淆的必要性,如果你了解直接跳过本节。
先编译一个 release apk
flutter build apk --release
# 输出文件
build/app/outputs/flutter-apk/app-release.apk
下载 apktool 工具
https://apktool.org/docs/install
https://bitbucket.org/iBotPeaches/apktool/downloads/
macos 下直接 brew
brew install apktool
ios 下可以试试 class-dump 工具
解包
我们可以建一个 dump 目录,将 app-release.apk 文件放入
cd dump
apktool d app-release.apk -o output_dir
与 zip 解包的区别
- 还原编译过的资源文件:
- APKTool 可以还原 APK 中经过编译的资源文件,如 Drawable、Layout、Values等,使得这些文件可以被直接编辑和修改。
- 而直接使用 ZIP 解压,得到的只是原始的资源文件,无法进行深入的编辑和修改。
- 解码 Smali 代码:
- APKTool 可以将 APK 中的 Dalvik 字节码文件解码为 Smali 汇编代码,方便逆向分析和修改应用程序的逻辑。
- 直接解压 ZIP 得到的是原始的 Dex 字节码文件,需要使用其他工具如 dex2jar 才能进一步分析。
- 重新打包 APK:
- APKTool 除了可以解包,还可以将修改后的 Smali 代码和资源文件重新打包成新的 APK 文件。
- 直接使用 ZIP 解压缩无法直接重新打包,需要额外的步骤。
- 保留签名信息:
- APKTool 在重新打包时会保留原 APK 的签名信息,无需重新签名。
- 直接使用 ZIP 解压缩后重新打包,需要重新对 APK 进行签名。
apktool 可以重新打包 apk 文件哦!
逆向 lib/arm64-v8a/libapp.so 文件
工具还是很多 IDA Pro , objdump, radare2, Ghidra 。
结论
我们还是混淆下代码提升下应用安全。
混淆步骤
Android
android/app/build.gradle
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.debug
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
minifyEnabled true
: 这个选项开启了代码混淆功能,会对应用程序的代码进行优化和缩减,以减小 APK 的大小并提高安全性。
shrinkResources true
: 这个选项会删除未使用的资源文件,进一步缩小 APK 的大小。
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
: 这里指定了 Proguard 规则文件的位置。Proguard 是一个代码混淆和优化工具,这些规则文件定义了如何对代码进行处理。
android/app/proguard-rules.pro
# Flutter Obfuscation
-ignorewarnings
-keep class io.flutter.app.** {
*; }
-keep class io.flutter.plugin.** {
*; }
-keep class io.flutter.util.** {
*; }
-keep class io.flutter.view.** {
*; }
-keep class io.flutter.embedding.** {
*; }
-keep class io.flutter.embedding.engine.** {
*; }
-keep class io.flutter.embedding.android.** {
*; }
-keep class io.flutter.embedding.engine.plugins.** {
*; }
-keep class io.flutter.plugin.common.** {
*; }
-keep class io.flutter.plugin.platform.** {
*; }
ignorewarnings
: 忽略 ProGuard 在运行期间可能产生的一些警告信息。
-keep class *
: 保留 * 包及其所有子包下的所有类和成员不被混淆。
执行打包
flutter build apk --release --obfuscate --split-debug-info=./build_info
Font asset "MaterialIcons-Regular.otf" was tree-shaken, reducing it from 1645184 to 1384 bytes (99.9% reduction). Tree-shaking can be disabled by providing the --no-tree-shake-icons flag when building your app.
Running Gradle task 'assembleRelease'... 34.9s
✓ Built build/app/outputs/flutter-apk/app-release.apk (17.8MB)
IOS
build settings -> other swift flags 在 release 中加入 "-D DART_OBFUSCATION"
执行打包
flutter build ios --release --obfuscate --split-debug-info=./build_info
ios 需要配置好发布证书。
小结
在 Flutter 应用程序开发中,开启代码混淆是一个非常重要的步骤。它不仅可以提高应用的安全性,还能优化应用的性能和大小,降低被篡改的风险,最终带来更好的用户体验。开发者应该认真考虑在发布应用程序时启用代码混淆功能,以全面保护应用程序的安全和完整性。
感谢阅读本文
如果有什么建议,请在评论中让我知道。我很乐意改进。
flutter 学习路径
- Flutter 优秀插件推荐 https://flutter.ducafecat.com
- Flutter 基础篇1 - Dart 语言学习 https://ducafecat.com/course/dart-learn
- Flutter 基础篇2 - 快速上手 https://ducafecat.com/course/flutter-quickstart-learn
- Flutter 实战1 - Getx Woo 电商APP https://ducafecat.com/course/flutter-woo
- Flutter 实战2 - 上架指南 Apple Store、Google Play https://ducafecat.com/course/flutter-upload-apple-google
- Flutter 基础篇3 - 仿微信朋友圈 https://ducafecat.com/course/flutter-wechat
- Flutter 实战3 - 腾讯即时通讯 第一篇 https://ducafecat.com/course/flutter-tim
- Flutter 实战4 - 腾讯即时通讯 第二篇 https://ducafecat.com/course/flutter-tim-s2
© 猫哥
ducafecat.com
end