【鸿蒙逆向新范式】ABCDE工具包10分钟上手:从字节码解析到反编译全流程
🔥 为什么选择ABCDE?
你是否还在为OpenHarmony应用逆向分析工具匮乏而烦恼?面对方舟字节码(Ark Bytecode,简称ABC)文件无从下手?尝试过多种工具却因依赖复杂、功能单一而放弃?
本文将带你全面掌握ABCDE OpenHarmony逆向工具包——这款由纯Kotlin编写的跨平台工具集,能一站式解决ABC文件解析、方法反汇编、资源索引提取等核心需求。读完本文后,你将能够:
- 3分钟完成工具部署与基础配置
- 掌握ABC文件结构解析的核心API
- 实现方舟字节码到JavaScript的反编译
- 开发自定义逆向分析工具(附2个实战案例)
📋 工具包架构总览
ABCDE采用模块化设计,核心功能与UI组件解耦,便于二次开发。整体架构如下:
技术特性对比表
| 特性 | ABCDE | 传统工具 |
|---|---|---|
| 语言依赖 | 纯Kotlin (跨平台) | C++/Python (平台限制) |
| 二次开发支持 | Maven依赖 + API文档 | 无公开接口 |
| 反编译能力 | 实验性JS输出 | 仅支持字节码展示 |
| 资源解析 | 内置资源索引解析 | 需要额外工具链 |
| 构建产物 | 单一UberJar | 多文件依赖 |
⚡ 极速上手指南
环境准备
- 克隆仓库
git clone https://gitcode.com/OpenHarmonyToolkitsPlaza/ABCDE.git
cd ABCDE
- 构建可执行文件
# 构建桌面GUI工具(含所有依赖)
./gradlew :abcdecoder:packageReleaseUberJarForCurrentOS
构建成功后,可执行文件位于:
abcdecoder/build/libs/abcdecoder-<版本>-<系统>-uber.jar
基础功能演示
1. 桌面GUI工具
启动命令:
java -jar abcdecoder/build/libs/abcdecoder-*-uber.jar
主要功能界面:
- ABC文件分析:树形展示类结构、方法列表及字节码
- HAP包浏览:解析应用包结构,快速定位关键资源
- 资源索引查看:类似Android Studio的ARSC查看器,支持多维度检索
2. 命令行工具
| 功能 | 命令示例 |
|---|---|
| 类信息导出 | java -jar abcdecoder.jar --cli --dump-class module.abc --out=classes.txt |
| 资源索引导出 | java -jar abcdecoder.jar --cli --dump-index resources.index --out=res.json |
🛠️ 核心API详解
1. ABC文件解析核心
// 基础用法:读取ABC文件中的类信息
val file = File("path/to/module.abc")
val mmap = FileChannel.open(file.toPath()).map(READ_ONLY, 0, file.length())
val abc = AbcBuf(file.path, mmap)
// 遍历类定义
abc.classes.forEach { (_, classItem) ->
if (classItem is AbcClass) {
println("类名: ${classItem.name}")
// 遍历方法
classItem.methods.forEach { method ->
println(" 方法: ${method.defineStr(showClass = true)}")
// 获取方法字节码
val code = method.code?.let { Code(it) }
code?.instructions?.forEach { inst ->
println(" 指令: ${inst.disassemble()}")
}
}
}
}
2. 反编译功能
// 字节码到JS的反编译示例
val method: MethodItem = ... // 从AbcClass中获取方法
val decompiler = ToJs(method)
val jsCode = decompiler.translate()
println("反编译结果:\n$jsCode")
注意:反编译功能目前处于实验阶段,不支持try-catch语句和异步相关字节码。
💡 实战案例分析
案例1:包体积分析工具(abclen)
核心实现:
// 计算各类结构体积占比
val sizeCounter = SizeCounter(abc)
val report = sizeCounter.generateReport()
// 按包名分组统计
val packageStats = report.groupByPackage()
// 生成TXT报告
File("report.txt").writeText(report.formatAsTable())
使用方法:
java -jar abclen.jar target.abc
案例2:字符串查找工具(findStr)
// 扫描ABC文件中的中文字符串
val abc = AbcBuf(file.path, mmap)
abc.literalArrays.forEach { literalArray ->
literalArray.strings.forEach { str ->
if (str.contains(Regex("[\u4e00-\u9fa5]"))) {
println("发现中文字符串: $str")
}
}
}
📈 进阶开发指南
引入核心库到Maven项目
- 部署到本地仓库
./gradlew publishToMavenLocal
- 添加依赖
repositories {
mavenLocal()
}
dependencies {
implementation("io.github.yricky.oh:abcde-jvm:0.1.0-dev-4d03a43")
}
自定义解析器开发
🚀 未来功能展望
-
反编译增强
- 支持try-catch语句解析
- 优化JS输出可读性
- 添加TypeScript类型标注
-
静态分析能力
- 调用流程图生成
- 代码混淆检测
- 敏感API调用识别
-
可视化增强
- 字节码执行流程动画
- 类继承关系图谱
- 方法调用热力图
🔖 资源汇总
- 源码仓库:https://gitcode.com/OpenHarmonyToolkitsPlaza/ABCDE
- API文档:通过
./gradlew dokkaHtml生成 - 示例项目:
examples/目录下包含2个完整案例 - 构建产物:支持通过GitHub Actions自动构建
如果你觉得本工具对你的开发有帮助,请不要吝啬你的⭐️Star⭐️,这是对开发者最大的支持!
版权声明:本项目采用Apache-2.0开源协议,允许商业使用,但需保留原作者信息。
更新日志:工具包平均每2周更新一次,重大功能会同步更新本文档。
问题反馈:请通过项目Issue提交bug报告或功能建议。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



