harmony逆向分析实践
字数 2262 2025-08-29 08:30:06

HarmonyOS逆向分析实践教学文档

1. HarmonyOS应用包(.hap)基础

1.1 .hap文件结构

  • 类似于Android的.apk或iOS的.ipa文件
  • 包含应用程序代码、资源、第三方库和配置文件
  • 可重命名为.zip后解压查看内部结构

1.2 关键目录和文件

  • ets/目录:包含ArkTS/TS/JS编译后的方舟字节码(.abc文件)
  • libs/目录:包含native层的.so库文件
  • resources/目录:包含应用资源文件

2. 方舟字节码(.abc)分析

2.1 方舟字节码特性

  • 由方舟编译器将ArkTS/TS/JS代码编译成的二进制格式
  • 目前缺乏成熟的逆向工具,但可尝试:
    • 以文本形式直接查看(未混淆情况下可能看到源码)
    • 使用反编译工具

2.2 反编译工具

  • abc-decompiler:基于jadx和abcde实现的鸿蒙abc反编译工具
    • GitHub地址:https://github.com/ohos-decompiler/abc-decompiler
    • 将.abc文件拖入工具界面可查看反编译结果
    • 反编译为Java代码,但对ArkUI和内置库调用解析有限

2.3 典型结构分析

  • entryability/目录:包含应用的入口Ability
    • EntryAbility.ets:应用入口点,类似Android的Activity
      • 生命周期:Create、Foreground、Background、Destroy
  • pages/目录:包含UI页面
    • Index.ets:通常为主页面

3. Native层分析

3.1 Native模块注册机制

  1. 系统首先进入RegisterEntryModule函数
  2. 调用napi_module_register方法注册模块
  3. 关键结构体napi_module
    • nm_register_func:模块初始化函数
    • nm_modname:模块名称(ArkTS侧引入的库名)

3.2 模块初始化流程

  1. init函数中实现ArkTS接口与C++接口的绑定
  2. 使用napi_define_properties定义导出属性
  3. CMakeLists.txt配置CMake打包参数

3.3 ArkTS调用Native

  • 通过import引入Native库
  • 例如:import entry from 'libentry.so'

4. 逆向分析实战

4.1 分析流程

  1. 定位关键检查函数(如check
  2. 在libs目录找到对应的.so文件(如libentry.so
  3. 使用IDA分析.so文件

4.2 IDA分析要点

  1. 查找RegisterEntryModule函数
  2. 定位模块指针(如&unk_8210
  3. 分析注册的Native函数(如check

4.3 N-API关键接口

  1. napi_env env:函数调用环境
  2. napi_ref ref:JavaScript对象引用
  3. napi_value* result:输出参数,存储JavaScript对象
  4. napi_value recv:函数调用上下文(类似JavaScript的this)
  5. napi_value func:要调用的JavaScript函数
  6. size_t argc:参数个数
  7. const napi_value* argv:参数数组

4.4 典型check函数分析

  1. 初始化阶段:

    • 设置targetidx等变量
    • 进入主要逻辑标签(如Label19
  2. 函数调用流程:

    • 从二进制数据获取索引序号
    • 通过序号获取ArkTS层函数
    • 调用获取的函数(如reg_method_0, reg_method_1
  3. 加密逻辑:

    • 通常包含多个case的switch结构
    • 常见操作:右移、异或、换位等
    • 关键变量:bin_iswitch_case_key

5. 加密算法模拟

5.1 准备工作

  1. 定位加密相关资源:
    • 通常在resources/rawfile中的二进制文件
  2. 获取关键参数:
    • bin_i:二进制数据索引
    • switch_case_key:加密密钥

5.2 使用load-elf工具

  1. 安装:
    git clone https://github.com/IchildYu/load-elf.git
    
  2. 编译库:
    gcc ./x64_main.c -o lib -g -ldl -masm=intel -shared -fPIC
    
  3. 运行exp.py脚本模拟加密过程

5.3 加密逻辑还原

  1. 分析ArkTS层注册函数:
    • 查找与序号对应的函数
    • 理解返回值生成逻辑
  2. 修改模拟代码:
    • 根据分析结果调整参数
    • 生成正确的bin_iswitch_case_key元组

6. 完整逆向流程总结

  1. 解压.hap文件,分析结构
  2. 反编译.abc文件,理解ArkTS层逻辑
  3. 定位关键Native函数调用(如testNapi.check
  4. 分析对应的.so文件(如libentry.so
  5. 理解Native层注册和调用机制
  6. 还原加密算法逻辑
  7. 使用工具模拟加密过程
  8. 最终生成或验证flag

7. 注意事项

  1. 鸿蒙逆向工具链尚不成熟,需结合多种方法
  2. 注意ArkTS与Native层的交互方式
  3. 加密逻辑通常分散在多层,需综合分析
  4. 动态调试结合静态分析效果更佳
  5. 关注资源文件中的关键数据(如二进制blob)

8. 参考资源

  1. abc-decompiler工具:https://github.com/ohos-decompiler/abc-decompiler
  2. load-elf工具:https://github.com/IchildYu/load-elf
  3. HarmonyOS官方开发文档
  4. N-API接口文档
HarmonyOS逆向分析实践教学文档 1. HarmonyOS应用包(.hap)基础 1.1 .hap文件结构 类似于Android的.apk或iOS的.ipa文件 包含应用程序代码、资源、第三方库和配置文件 可重命名为.zip后解压查看内部结构 1.2 关键目录和文件 ets/ 目录:包含ArkTS/TS/JS编译后的方舟字节码(.abc文件) libs/ 目录:包含native层的.so库文件 resources/ 目录:包含应用资源文件 2. 方舟字节码(.abc)分析 2.1 方舟字节码特性 由方舟编译器将ArkTS/TS/JS代码编译成的二进制格式 目前缺乏成熟的逆向工具,但可尝试: 以文本形式直接查看(未混淆情况下可能看到源码) 使用反编译工具 2.2 反编译工具 abc-decompiler :基于jadx和abcde实现的鸿蒙abc反编译工具 GitHub地址:https://github.com/ohos-decompiler/abc-decompiler 将.abc文件拖入工具界面可查看反编译结果 反编译为Java代码,但对ArkUI和内置库调用解析有限 2.3 典型结构分析 entryability/ 目录:包含应用的入口Ability EntryAbility.ets :应用入口点,类似Android的Activity 生命周期:Create、Foreground、Background、Destroy pages/ 目录:包含UI页面 Index.ets :通常为主页面 3. Native层分析 3.1 Native模块注册机制 系统首先进入 RegisterEntryModule 函数 调用 napi_module_register 方法注册模块 关键结构体 napi_module : nm_register_func :模块初始化函数 nm_modname :模块名称(ArkTS侧引入的库名) 3.2 模块初始化流程 在 init 函数中实现ArkTS接口与C++接口的绑定 使用 napi_define_properties 定义导出属性 CMakeLists.txt配置CMake打包参数 3.3 ArkTS调用Native 通过 import 引入Native库 例如: import entry from 'libentry.so' 4. 逆向分析实战 4.1 分析流程 定位关键检查函数(如 check ) 在libs目录找到对应的.so文件(如 libentry.so ) 使用IDA分析.so文件 4.2 IDA分析要点 查找 RegisterEntryModule 函数 定位模块指针(如 &unk_8210 ) 分析注册的Native函数(如 check ) 4.3 N-API关键接口 napi_env env :函数调用环境 napi_ref ref :JavaScript对象引用 napi_value* result :输出参数,存储JavaScript对象 napi_value recv :函数调用上下文(类似JavaScript的this) napi_value func :要调用的JavaScript函数 size_t argc :参数个数 const napi_value* argv :参数数组 4.4 典型check函数分析 初始化阶段: 设置 targetidx 等变量 进入主要逻辑标签(如 Label19 ) 函数调用流程: 从二进制数据获取索引序号 通过序号获取ArkTS层函数 调用获取的函数(如 reg_method_0 , reg_method_1 ) 加密逻辑: 通常包含多个case的switch结构 常见操作:右移、异或、换位等 关键变量: bin_i 和 switch_case_key 5. 加密算法模拟 5.1 准备工作 定位加密相关资源: 通常在 resources/rawfile 中的二进制文件 获取关键参数: bin_i :二进制数据索引 switch_case_key :加密密钥 5.2 使用load-elf工具 安装: 编译库: 运行exp.py脚本模拟加密过程 5.3 加密逻辑还原 分析ArkTS层注册函数: 查找与序号对应的函数 理解返回值生成逻辑 修改模拟代码: 根据分析结果调整参数 生成正确的 bin_i 和 switch_case_key 元组 6. 完整逆向流程总结 解压.hap文件,分析结构 反编译.abc文件,理解ArkTS层逻辑 定位关键Native函数调用(如 testNapi.check ) 分析对应的.so文件(如 libentry.so ) 理解Native层注册和调用机制 还原加密算法逻辑 使用工具模拟加密过程 最终生成或验证flag 7. 注意事项 鸿蒙逆向工具链尚不成熟,需结合多种方法 注意ArkTS与Native层的交互方式 加密逻辑通常分散在多层,需综合分析 动态调试结合静态分析效果更佳 关注资源文件中的关键数据(如二进制blob) 8. 参考资源 abc-decompiler工具:https://github.com/ohos-decompiler/abc-decompiler load-elf工具:https://github.com/IchildYu/load-elf HarmonyOS官方开发文档 N-API接口文档