当前位置: 首页 > article >正文

【HarmonyOS Next】鸿蒙加固方案调研和分析

【HarmonyOS Next】鸿蒙加固方案调研和分析

一、前言

在这里插入图片描述

根据鸿蒙应用的上架流程,本地构建app文件后,上架到AGC平台,平台会进行解析。根据鸿蒙系统的特殊设置,仿照IOS的生态闭环方案。只能从AGC应用市场下载app进行安装。这样的流程一定程度上提高了防破解和逆向的成本。

但应用代码防逆向是一个持续攻防对抗的过程,如对代码文件保护有更高的要求,需要结合其他安全加固措施,进一步提高逆向分析应用的难度。

二、目前市面上鸿蒙的加固服务商:

1.梆梆加固
https://www.bangcle.com/pages/cat_id/96.html
在这里插入图片描述

2.NAGA 娜迦科技
https://www.nagain.com/activity/article/76/#/produCtenter/securityReinforce/hap
在这里插入图片描述

娜迦移动应用APP安全加固服务
https://developer.huawei.com/consumer/cn/market/prod-detail/6b8d4d7cebf743aaa9d926fe55658a01/1
在这里插入图片描述

3.网易易盾
https://dun.163.com/product/harmony-reinforce
在这里插入图片描述

4.爱加密
https://www.ijiami.cn/harmonyOS
在这里插入图片描述

5.FairGuard 游戏加固
https://www.fair-guard.com/help/list-375.html

6. 360加固
https://jiagu.360.cn/#/global/details/HongMengNext
在这里插入图片描述

三、鸿蒙加固方案

1.代码混淆
对 ArkTS 代码中的类名、方法名、变量名等进行替换,使用无意义的字符来代替原本有明确含义的名称。攻击者难以从代码符号中获取有价值的信息,增加了代码理解和逆向分析的难度。

  • 控制流混淆:通过改变代码的执行流程,在不影响程序正常功能的前提下,插入一些无用的跳转、循环和条件判断语句。这样会打乱代码的逻辑结构,使得逆向工程中难以还原出清晰的程序逻辑。
    加密保护
entry/build-profile.json5
"enable": true,即可开启混淆。

// 打包
将项目配置为release模式进行打包,此时混淆才会实际执行,最终生成混淆后的应用包。
另外,如果想混淆字符串字面量属性名,还需在上述基础上再使用-enable-string-property-obfuscation

2.代码加密:
对 ArkTS 源代码或编译后的字节码进行加密处理,在应用运行时动态解密。即使攻击者获取到应用文件,看到的也是加密后的代码,无法直接进行分析和篡改。

  • 资源加密:对应用中的图片、音频、视频等资源文件进行加密,防止资源被非法提取和复用。应用在运行时会自动对加密资源进行解密和加载。

可以编写脚本对代码文件进行加密处理,在应用启动时再进行解密。常见的加密算法有 AES(高级加密标准)。也可使用一章节中的三方服务商。

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

def encrypt_file(key, input_file_path, output_file_path):
    cipher = AES.new(key, AES.MODE_CBC)
    with open(input_file_path, 'rb') as f_in:
        plaintext = f_in.read()
    ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
    with open(output_file_path, 'wb') as f_out:
        f_out.write(cipher.iv)
        f_out.write(ciphertext)

# 使用示例
key = os.urandom(16)  # 生成 16 字节的密钥
input_file = 'your_code_file.js'
output_file = 'encrypted_code_file.js'
encrypt_file(key, input_file, output_file)

在这里插入图片描述
也可使用AGC平台提供的加密,不过会对APP冷启动带来时间影响。目前加密还是白名单设置,并非开放给所有APP。

3.虚拟机加壳
将应用程序包裹在一个自定义的虚拟机环境中运行,对应用的指令集进行转换和解释执行。攻击者需要先破解虚拟机的运行机制,才能进一步分析应用代码,增加了逆向的难度。

  • 代码抽取加壳:将应用的核心代码从原程序中抽取出来,存储在加壳程序的特定区域,并在运行时动态加载和执行。这样可以有效保护核心代码不被轻易获取和分析。
    运行时防护

4.反调试检测
在应用运行过程中,实时检测是否有调试器连接。如果检测到调试行为,应用可以采取相应的措施,如终止运行、弹出警告提示或进行数据加密等,防止攻击者通过调试手段获取应用的敏感信息。【这些检测方法并非绝对安全,有经验的攻击者可能会绕过这些检测。】
在 ArkTS 中,要判断是否运行在模拟器环境,可通过读取系统文件信息来实现:

import fileio from '@ohos.fileio';

// 判断是否运行在模拟器环境的函数
async function isRunningOnEmulator(): Promise<boolean> {
    const sysDirPath = '/sys/devices/virtual/dmi/id';
    const biosVendorFilePath = `${sysDirPath}/bios_vendor`;

    try {
        // 检查 sysDirPath 是否存在
        const sysDirStat = await fileio.stat(sysDirPath);
        if (sysDirStat) {
            // 检查 biosVendorFilePath 是否存在
            const biosVendorFileStat = await fileio.stat(biosVendorFilePath);
            if (biosVendorFileStat) {
                // 读取 bios_vendor 文件内容
                const fd = await fileio.open(biosVendorFilePath, 0o400);
                const buffer = new ArrayBuffer(1024);
                const readLength = await fileio.read(fd, buffer);
                const biosVendor = new TextDecoder().decode(buffer.slice(0, readLength));
                await fileio.close(fd);

                // 判断是否包含模拟器相关标识
                return biosVendor.includes('Android') || biosVendor.includes('Genymotion');
            }
        }
    } catch (e) {
        console.error(`Error checking emulator: ${e.message}`);
    }
    return false;
}

// 使用示例
isRunningOnEmulator().then((result) => {
    if (result) {
        console.log('The app is running on an emulator.');
    } else {
        console.log('The app is running on a real device.');
    }
});

5.内存保护:对应用在内存中的数据和代码进行监控和保护,防止内存被非法访问、篡改或注入恶意代码。可以采用内存加密、内存访问控制等技术手段来实现内存保护。

  • 设备环境检测:检测应用运行的设备环境是否安全,如是否存在模拟器、Root / 越狱设备等。如果检测到不安全的设备环境,应用可以限制部分功能或拒绝运行,降低被攻击的风险。
    数据安全防护
    处理敏感数据并及时清除示例:


struct SensitiveDataProtectionExample {
  private sensitiveData: string | null = null;

  handleSensitiveData() {
    // 模拟获取敏感数据
    this.sensitiveData = 'mySecretPassword';

    // 处理敏感数据
    console.log(`Processing sensitive data: ${this.sensitiveData}`);

    // 处理完后及时清除敏感数据
    this.sensitiveData = null;
  }

  build() {
    Column({ space: 50 }) {
      Button('Process Sensitive Data')
        .onClick(() => {
          this.handleSensitiveData();
        })
    }
    .width('100%')
  }
}

6.数据传输加密:在应用与服务器之间进行数据传输时,采用 SSL/TLS 等加密协议对数据进行加密,防止数据在传输过程中被窃取或篡改。

  • 数据存储加密:对应用在本地存储的敏感数据,如用户信息、配置文件等,进行加密处理。只有在经过授权的情况下才能解密和访问这些数据,确保数据的安全性。

http://www.kler.cn/a/579191.html

相关文章:

  • INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性
  • 在Ubuntu上搭建Samba服务,实现与windows之间的文件共享
  • 软件测试の概念之测试分类质量模型测试用例
  • 【哇! C++】类和对象(五) - 赋值运算符重载
  • 文生图 图生视频 文生视频人工智能AI工具节选
  • 【django初学者项目】
  • 算法每日一练 (9)
  • Flutter 学习之旅 之 flutter 不使用插件,简单实现一个 Toast 功能
  • Web3 的未来:去中心化如何重塑互联网
  • 03.05 QT事件
  • uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!
  • 力扣72题编辑距离
  • Linux运维——oh-my-zsh
  • 高效处理 List<T> 集合:更新、查找与优化技巧
  • 《A++ 敏捷开发》- 18 软件需求
  • HTML 文本格式化
  • Python爬取咸鱼Goodfish店铺所有商品接口的详细指南
  • Android中的Fragment是什么以及它有哪些生命周期方法
  • unity学习64,第3个小游戏:一个2D跑酷游戏
  • react基本功