移动端安全 鸿蒙app分析初探(arkanalyzer)
字数 1296 2025-08-22 12:23:30
鸿蒙App静态分析工具ArkAnalyzer深度解析
1. 鸿蒙应用开发基础
1.1 开发语言演进
- Java:鸿蒙早期主要开发语言
- TypeScript(TS):HarmonyOS 3.1开发者预览版开始引入
- ArkTS:当前主流开发语言,基于TS扩展,特点:
- 匹配ArkUI框架
- 扩展声明式UI语法
- 轻量化并发机制
- 文件后缀
.ets
1.2 环境配置
- Node.js安装:必备运行环境
- TypeScript安装:
npm install -g typescript - ArkTS开发:直接继承TS语法,开发者可无缝过渡
1.3 应用架构模型
Stage模型(HarmonyOS 3.1+主推):
开发态结构
项目根目录/
├── AppScope/ # 自动生成,不可更改
├── entry/ # 主入口模块
│ └── src/
│ └── main/
│ ├── ets/
│ │ ├── entryability/ # UIAbility入口
│ │ ├── pages/ # 页面UI文件
│ │ └── common/ # 公共资源
│ └── module.json5 # 模块配置
└── hvigor/ # 构建工具配置
UIAbility生命周期
- Create
- Foreground
- Background
- Destroy
编译态转换
.ets→.abc(ArkTS编译结果)- 资源合并规则:AppScope优先
- 配置合并:app.json5 → module.json
发布态包结构
-
.app包:
- META-INF/:签名信息
- resources/:资源文件
- libs/:原生库
- entry.hap:主模块
-
.hap模块:
- code/:业务逻辑代码
- resources/:模块资源
- libs/:模块专用库
2. ArkAnalyzer工具详解
2.1 环境配置
- 安装Node.js和npm
- 克隆仓库:
https://gitee.com/openharmony-sig/arkanalyzer - 安装依赖:
npm install(管理员权限运行) - 测试运行:通过
package.json执行测试用例
2.2 核心架构
分析流程:
ArkTS代码 → AST生成 → Scene数据结构 → CFG生成 → CG生成 → 数据流分析
关键数据结构
-
Scene类(核心访问入口):
- 文件列表
- 命名空间列表
- 类列表
- 方法列表
- 属性列表
-
CFG(控制流图):
blocks:基本块集合stmtToBlock:语句到基本块映射startingStmt:起始语句defUseChains:定义-使用链declaringMethod:声明方法declaringClass:声明类
-
IR表示:
- 临时变量命名:
$temp+序号 - 循环消减:转为
if+代码块 - 语法糖处理:如匿名函数重命名为
AnonymousFunc$desuagring$0
- 临时变量命名:
2.3 基础分析示例
示例1:基本信息提取
// 获取所有文件
let files: ArkFile[] = projectScene.getFiles();
let filenames: string[] = files.map(file => file.getName());
// 获取所有命名空间
let namespaces: ArkNamespace[] = projectScene.getNamespaces();
// 获取所有类(含默认类_DEFAULT_ARK_CLASS)
let classes: ArkClass[] = projectScene.getClasses();
// 获取类属性
let fields: ArkField[] = targetClass.getFields();
// 获取类方法
let methods: ArkMethod[] = targetClass.getMethods();
示例2:控制流分析
// 生成调用图
let callGraph = new CallGraph(projectScene);
let callGraphBuilder = new CallGraphBuilder(callGraph, projectScene);
callGraphBuilder.buildClassHierarchyCallGraph(entryPoints);
callGraph.dump("out/cg/cg.dot"); // 输出Graphviz格式
示例3:数据流分析
// SSA转换
let staticSingleAssignmentFormer = new StaticSingleAssignmentFormer();
staticSingleAssignmentFormer.transformBody(method.getBody());
// 定义-使用链分析
cfg.buildDefUseChain();
for (const chain of cfg.getDefUseChains()) {
console.log(`变量: ${chain.value}, 定义: ${chain.def}, 使用: ${chain.use}`);
}
示例4:空指针检测
const method = ModelUtils.getMethodWithName("U2", defaultMethod);
if (method) {
const problem = new UndefinedVariableChecker(
[...method.getCfg().getBlocks()][0].getStmts()[method.getParameters().length],
method
);
const solver = new UndefinedVariableSolver(problem, projectScene);
solver.solve();
}
3. 实战案例
3.1 环境配置
修改./tests/AppTestConfig.json:
{
"projectPath": "实际项目路径"
}
3.2 典型分析流程
-
初始化分析:
node -r ts-node/register AppTest.ts -
控制流可视化:
- 生成的
.dot文件可用Graphviz渲染 - 在线工具:GraphvizOnline
- 生成的
-
深度分析建议:
- 结合SSA进行变量追踪
- 利用定义-使用链追踪数据流
- 自定义分析规则继承基础Checker类
4. 扩展资源
注:ArkAnalyzer仍处于活跃开发阶段,建议定期关注仓库更新获取最新功能。