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/目录:包含应用的入口AbilityEntryAbility.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工具
- 安装:
git clone https://github.com/IchildYu/load-elf.git - 编译库:
gcc ./x64_main.c -o lib -g -ldl -masm=intel -shared -fPIC - 运行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接口文档