1# Disassembler反汇编工具 2 3## 简介 4 5Disassembler是ArkTS反汇编工具,如果开发者需要分析方舟字节码文件(\*.abc)相关问题,可使用Disassembler将字节数据反汇编成可阅读的汇编指令。 6 7工具随DevEco Studio SDK发布,以windows平台为例,Disassembler工具位置为:[DevEco Studio安装目录]\sdk\[SDK版本]\openharmony\toolchains\ark_disasm.exe。 8 9## 命令行说明 10 11反汇编命令: 12 13``` 14ark_disasm.exe [options] input_file output_file 15``` 16 17参数说明: 18 19| 参数 | 是否可缺省 | 描述 | 20| -------- | -------- | -------- | 21| [options] | 可缺省 | 命令选项,详见下文options选项说明。 | 22| input_file | 不可缺省 | 待反汇编的方舟字节码文件路径。 | 23| output_file | 不可缺省 | 反汇编内容的输出文件路径。 | 24 25options选项说明: 26 27| 选项 | 是否可缺省 | 是否存在入参 | 描述 | 28| -------- | -------- | -------- | -------- | 29| --debug | 可缺省 | 不带参数 | 使能输出调试信息,默认输出到屏幕。 | 30| --debug-file | 可缺省 | 带参数 | 如果使能了--debug,指定调试信息的输出文件。 | 31| --help | 可缺省 | 不带参数 | 打印帮助提示。 | 32| --skip-string-literals | 可缺省 | 不带参数 | 跳过对字符串字面量的反汇编。 | 33| --quiet | 可缺省 | 不带参数 | 使能所有'--skip-'开头的选项。 | 34| --verbose | 可缺省 | 不带参数 | 使能输出额外信息(字节位置、方舟字节码格式、操作码)。 | 35| --version | 可缺省 | 不带参数 | 显示配套方舟字节码文件版本号以及最低支持的方舟字节码文件版本。 | 36 37## 使用示例 38 39假设已存在方舟字节码文件:test.abc,其源代码如下: 40 41``` 42let i = 99; 43function show(){return i;} 44show(); 45``` 46 47 48执行如下命令,就能生成反汇编文件:test.txt。生成的反汇编文件内带有操作码及格式等信息。 49 50``` 51ark_disasm.exe test.abc test.txt 52``` 53 54查看反汇编文件的内容。 55 56 57``` 58cat test.txt 59``` 60 61内容如下 62 63``` 64# source binary: test.abc // 反汇编的方舟字节码文件 65 66.language ECMAScript 67 68# ==================== 69# LITERALS // 字面量数据 70 710 0x203 { 0 [ 72 MODULE_REQUEST_ARRAY: { 73 }; 74]} 75 76# ==================== 77# RECORDS // 模块定义数据 78 79.record _ESConcurrentModuleRequestsAnnotation { // _开头这些都是固定的模块数据 80} 81 82.record test { // 一个js文件对应一个模块数据,包含了模块的相关信息(在方舟字节码文件中的位置,是否是commonjs ...) 83 u8 isCommonjs = 0x0 84 u32 moduleRecordIdx = 0x203 85 ...... 86} 87 88# ==================== 89# METHODS // 方法定义数据 90 91L_ESSlotNumberAnnotation: 92 u32 slotNumberIdx { 0x0 } 93.function any test.#*#show(any a0, any a1, any a2) <static> { // 此方法源码中的show方法,同时这里也说明了,它属于test模块 94 ldlexvar 0x0, 0x0 95 ...... 96} 97 98L_ESSlotNumberAnnotation: 99 u32 slotNumberIdx { 0x3 } 100.function any test.func_main_0(any a0, any a1, any a2) <static> { // 此方法是自动生成的,可以理解成整个js文件就是一个方法,方法名为func_main_0 101 newlexenv 0x1 102 ...... 103} 104 105# ==================== 106# STRING // 符号表信息 107 108[offset:0x88, name_value:i] 109``` 110 111使用参数--verbose,可打印偏移量等更多详细信息。 112 113 114``` 115ark_disasm.exe --verbose test.abc test.txt 116``` 117 118此处列出部分示例。 119 120``` 121.record _ESSlotNumberAnnotation { # offset: 0x00cd, size: 0x0026 (38) // 这里打印了模块在方舟字节码文件中具体的位置和大小 122} 123 124.record test { # offset: 0x00f3, size: 0x0098 (152) // 这里打印了模块在方舟字节码文件中具体的位置 125 u32 moduleRecordIdx = 0x203 # offset: 0x0144 // 这里打印了模块信息的位置 126} 127...... 128.function any test.#*#show(any a0, any a1, any a2) <static> { # offset: 0x0153, code offset: 0x0245 // 这里打印了方法信息具体的位置和方法中指令的具体位置 129# CODE: 130 ldlexvar 0x0, 0x0 # offset: 0x0249, [IMM4_IMM4].........[0x3c 0x00] // 这里打印了每条指令的具体位置 131 ...... 132} 133``` 134