写点什么

HarmonyOS 应用代码混淆技术方案,为你的应用安全保驾护航

  • 2025-12-15
    北京
  • 本文字数:2160 字

    阅读完需:约 7 分钟

HarmonyOS应用代码混淆技术方案,为你的应用安全保驾护航

概述

代码混淆技术可以增加代码的复杂性和模糊性,从而提高攻击者分析代码的难度。代码混淆有以下几个方面的作用:

1.  保护知识产权:代码混淆防止他人轻易复制和窃取软件代码,增加逆向工程难度。

2.  防止逆向工程:逆向工程是分析软件以了解其工作原理和实现细节的过程。代码混淆可增加逆向工程的难度,保护应用程序免受恶意修改或破坏。

3.  提高安全性:代码混淆减少漏洞和安全风险,增加攻击者利用漏洞的难度。

4.  降低反盗版和欺诈风险:混淆代码可增加攻击者破解软件许可验证系统或修改代码绕过付费机制的难度,从而减少盗版和欺诈。

针对工程源码的混淆提高破解难度,缩短类和成员名称,减小应用大小。

 

混淆开启

从 DevEco Studio 版本 4.0 Beta1 开始,hvigor 插件提供代码混淆功能。开启混淆的条件如下:

l 工程为 Stage 模型

l 在 Release 编译模式下

l 模块 build-profile.json5 文件中开启混淆配置


 

注意:“enable”默认为“false”,默认不开启代码混淆功能。


满足开启混淆的条件后,选择目标模块,点击 Build -> Make Module 开始编译。


如果工程或模块是 Static Library,则该工程或模块是一个 HAR。


构建 HAR 时有以下三种方式:

1.  以 Debug 模式构建 HAR,会直接打包源码,不进行代码混淆。

2.  以 Release 模式构建 HAR,会编译、混淆并压缩代码。

3.  构建字节码格式的 HAR。开启混淆时,编译器会先对源码中间文件进行混淆,再生成 abc 字节码。


图1:DevEco Studio选择release编译模式


图2:DevEco Studio指定模块编译

 

混淆配置能力


编译选项

若按照上述编译流程开启代码混淆,在 DevEco Studio 5.0.3.600 之前的版本,默认仅混淆参数名和局部变量名。从 DevEco Studio 5.0.3.600 版本起,默认启用四项推荐的混淆选项:-enable-property-obfuscation、-enable-toplevel-obfuscation、-enable-filename-obfuscation 和 -enable-export-obfuscation。开发者可以根据需要进一步修改混淆配置。


混淆配置

在每个模块下都能找到 build-profile.json5 文件,如下图所示。可以在此文件中配置是否开启混淆及混淆配置文件。


图3:编译配置文件

 

新建工程时,每个模块下都有 obfuscation-rules.txt 文件,用于配置混淆。


图4:混淆配置文件

 

在上图中,obfuscation-rules.txt 文件中添加了-enable-property-obfuscation 和-enable-toplevel-obfuscation 开关,表示已启用属性混淆和顶层作用域名称混淆。


DevEco Studio 混淆现有选项及功能描述如下:

 


混淆自定义选项名称

功能简述

混淆选项

-disable-obfuscation

关闭混淆

-enable-property-obfuscation

属性混淆

-enable-toplevel-obfuscation

顶层作用域名称混淆

-enable-filename-obfuscation

文件名混淆

-enable-export-obfuscation

export导出名称与属性混淆

-compact

代码压缩

-remove-log

删除console.*方法

-print-namecache filepath

指定路径输出namecache.json文件及内容

-apply-namecache filepath

复用指定的名称缓存文件

-remove-comments

删除注释

保留选项

-keep-property-name

保留属性名

-keep-global-name

保留顶层作用域和导出元素的名称

-keep-file-name

保留指定的文件/文件夹的名称

-keep-dts

读取指定.d.ts文件中的名称作为白名单

-keep-comments

保留编译生成的声明文件中class, function, namespace, enum, struct, interface, module, type及属性上方的JsDoc注释

-keep

保留指定相对路径中的所有名称(例如变量名、类名、属性名等)

通配符

名称类和路径类的保留选项支持通配符

混淆选项具体的使用方法和样例代码可以参考代码混淆。


混淆优化建议


开发人员混淆工程时,发现缓存文件或 SDK 中的文件中存在大量未混淆的源码名称。原因包括以下两类:

l 混淆选项开启较少;开启-enable-property-obfuscation、-enable-toplevel-obfuscation、-enable-export-obfuscation、-enable-filename-obfuscation 选项。

l 源码名称与系统白名单、语言白名单重名;添加后缀避开白名单。


混淆规则合并策略

在编译一个模块时,生效的混淆规则是当前编译模块混淆规则和依赖模块混淆规则的合并结果。具体规则请参考:混淆规则合并策略


查看混淆结果

开发人员在编译模块的 build 目录中可找到编译和混淆生成的缓存文件、名称映射表及系统 API 白名单文件。

l 源码编译及混淆缓存文件目录:build/\[…\]/release/模块名

l 混淆名称映射表及系统 API 白名单目录:build/\[…\]/release/obfuscation

-名称映射表文件:nameCache.json,记录源码名称映射。

-系统 API 白名单文件:systemApiCache.json,记录 SDK 接口与属性名称。


图5:DevEco Studio编译产物与缓存文件


调试


代码经过混淆工具处理后,名称会发生更改,这可能导致运行时崩溃堆栈日志难以理解,因为堆栈与源代码不完全一致。如果未保留调试信息,行号及名称更改将导致无法准确定位问题。此外,启用-enable-property-obfuscation、-enable-toplevel-obfuscation 等选项后,代码混淆可能会引发运行时崩溃或功能性错误。开发人员需要还原报错堆栈,排查并配置白名单以确保功能正常。


函数调用栈还原

经过混淆的应用程序中代码名称会发生更改,因此报错栈与源码不完全一致,crash 时打印的报错栈会难以理解,如何处理请参考报错栈还原


反混淆工具 hstack

hstack 需要将 Node.js 配置到环境变量中,详细使用说明请参考 hstack

 

使用第三方加固


在 HarmonyOS 提供的代码混淆能力之外,开发者还可以使用第三方安全厂商提供的高级混淆和加固能力。多家安全加固厂商已经启动了 HarmonyOS 开发,开发者可以根据需求选择这些安全厂商的服务。开发者需要与第三方安全厂商自行沟通合作方式和范围,本文档不做详细说明。具体的官方与第三方代码混淆能力的关系如下:


特性

特性描述

HarmonyOS

三方

名称混淆

混淆类、字段、属性、方法和文件名。

控制混淆

混淆方法内的控制流以防御自动或手动代码分析,包括虚假控制流和控制流扁平化。

×

指令替换

通过将简单的算术和逻辑表达式转换为难以分析的代码来保护专有公式。

×

数据混淆

加密敏感字符串,以防止通过尝试搜索的黑客攻击,也用来加密类、asset 文件、资源文件和 Native 库

×

代码虚拟化

转换方法实现为随机生成虚拟机的指令序列

×

调用隐藏

为访问敏感的APIs 添加反射,比如用于签名校验和密码操作的标准APIs

×

移除日志代码

移除logging 、调试和测试代码,以阻止任何利用此信息的企图

×


由于 HarmonyOS 代码签名、应用加密等安全机制的限制,以及应用市场上架审核的纯净安全要求,三方加固厂商提供的安全加固内容必须满足以下六点要求:

1、不允许隐藏敏感系统 API 的调用,审核人员必须能够清晰地看到应用的特性。

2、不允许混淆非自研的 SDK。SDK 应由 SDK 厂商自行进行混淆保护。如果非自研 SDK 被混淆,将会影响应用市场审核相关 SDK 的指纹信息。

3、通过第三方安全加固的应用程序,必须确保不包含恶意行为,以免对生态系统造成影响。此要求为约束性条款,不遵守可能导致应用被下架。

4、不允许使用第三方虚拟机,HarmonyOS 系统通过代码签名等机制限制动态加载代码,这可能导致应用无法正常运行。

5、不允许对方舟字节码文件进行篡改,此方法可能让应用无法正常运行,以及影响应用市场对应用的纯净安全进行审核。

6、不允许对系统库使用 hook 技术,此方法影响应用市场对应用的纯净安全进行审核。

2025-12-15 10:231

评论

发布
暂无评论

521我发誓读完本文,再也不会担心Spring配置类问题了

YourBatman

spring springboot @Configuration Spring配置类

啃碎并发(八):深入分析wait&notify原理 猿码架构

猿灯塔

图解:深度优先搜索与广度优先搜索

淡蓝色

Java 数据结构 算法

Java 后端博客系统文章系统——No2

猿灯塔

【Java虚拟机】垃圾收集器与内存分配

烫烫烫个喵啊

Java Java虚拟机

利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论?

JackTian

Python Linux 运维 数据分析 招聘

亚马逊:让创新科技成为重启世界的新动能

爱极客侠

肖风:数据要素市场与分布式AI平台

CECBC

Docker基础修炼3--Docker容器及常用命令

程序员潘Sir

Docker Linux 容器 命令

区块链+高考,让世界再无冒名顶替

CECBC

16种设计思想 - Design for failure

Man

Java 微服务 设计原则

积极支持EdgeX发展,英特尔为2020 EdgeX中国挑战赛获奖队伍创造广阔合作空间

最新动态

实验室里的AI激情:腾讯优图的升级修炼之路

脑极体

SpringBoot入门:01 - 配置数据源

封不羁

Java spring springboot

DDD实施过程中的点滴思考

冯文辉

领域驱动设计 DDD

最大的 String 字符长度是多少?

武培轩

Java 源码 后端 JVM

微服务架构下分布式事务解决方案

Axe

一个爱不释手的Apifox,让我扔掉 Postman的想法

给你买橘子

Java 编程 程序员 开发 Postman

编程能力 —— 异步编程

wendraw

Java 大前端 编程能力

编程能力 —— 寻路问题

wendraw

Java 大前端 编程能力

HTTP/2 总结

guoguo 👻

编程能力 —— 解析表达式

wendraw

Java 大前端 编程能力

5分钟上手部署!!!

清风

Java Spring Boot

创业使人成长系列 (2)- 散伙协议

石云升

创业 股权 合伙人 散伙协议

Git 常用操作汇总-cheat sheet

多选参数

git GitHub gitlab gitee

数据结构与算法知识点总结

烟雨濛濛

领域驱动设计(DDD)实践之路(一)

vivo互联网技术

架构 领域驱动设计 DDD

流水账

zack

【写作群星榜】6.27~7.10 写作平台优秀作者 & 文章排名

InfoQ写作社区官方

写作平台 排行榜 热门活动

终于有人把Elasticsearch架构原理讲明白了,感觉之前看的都是渣

爱嘤嘤嘤斯坦

Java elasticsearch 编程 架构

漫画通信:一图看懂通信发展史

阿里云Edge Plus

HarmonyOS应用代码混淆技术方案,为你的应用安全保驾护航_HarmonyOS_HarmonyOS_InfoQ精选文章