# 需求-命令行执行反汇编脚本

编写命令行反汇编shell脚本，脚本放到disassembler目录下。

## IDA Pro应用目录获取

脚本运行的前提是找得到IDA Pro，如果没有IDA Pro可执行文件所在目录：

- 如果有：那么继续执行。
- 如果没有：那么让用户输入路径（路径中可能有空格），输入完成后检查目录下是否有ida和idat这两个命令，如果有则记录下来下次就不需要用户输入了，如果没有则报错退出。

IDA Pro应用目录获取脚本放到`shell/library`中，作为通用的库脚本能够被复用。

IDA Pro应用目录记录：成功获取目录后，存储在当前Git仓库根目录的`.config`目录下，能够被所有脚本读取、使用，存储使用json格式，json格式中的内容可以被jq命令读取。

## 命令行执行反汇编脚本

示例：

```shell
IDA_FUNC_ADDR="__Z9calculateddc" \
IDA_OUTPUT="~/Documents/Codes/OpenSecurity/analysis_details/__Z9calculateddc_0x100000D98-5.asm" \
"/Applications/IDA Professional 9.1.app/Contents/MacOS/idat" -v -A \
  -L/tmp/ida_dump.log \
  -S"~/Documents/Codes/OpenSecurity/disassembler/dump_func_disasm.py" \
  ~/Documents/Codes/llvm-build/test/OllvmTest/build/OllvmTest.i64
```

`disassembler/dump_func_disasm.py`中也有相应的注释。

### 脚本技术栈

shell

### 脚本编写位置

脚本写到`disassembler`目录下。

### shell脚本需要的传参

1. --addr: 必填，函数名或地址。
2. --output：可选，输出路径。如果不填则输出到当前shell脚本所在位置。当然，对于运行dump_func_disasm.py的时候，这个参数是必填的。
3. --log: 可选，日志输出路径。如果不填则输出到当前目录下，文件名为`dump_func_disasm.log`。它对应给到idat的`-L`参数。

### 调用idat搜需要的其他参数

根据示例、代码中的注释，进行传递。

### shell脚本中是否能够正确执行要做预先的判断

1. 如果idat要打开的**目标二进制**或**`.i64`这样的IDA Pro数据文件**已经被打开，那么执行示例中的命令后会在日志中出现这样的错误：

```shell
2026-04-05 23:35:15.306 IDA has found an unpacked version of database: ~/Documents/Codes/llvm-build/test/OllvmTest/build/OllvmTest.i64
on the disk.
It appears IDA did not close properly;
it is probably safer to restart your work from the packed database -> ~R~estore packed base
2026-04-05 23:35:15.306 ~/Documents/Codes/llvm-build/test/OllvmTest/build/OllvmTest.id0: Resource temporarily unavailable -> OK
```

能否预先判断，是否已经被打开然后在命令行中提示给用户，这样用户就不需要看日志文件就知道问题了。如果可以的话就去做，另外写一个脚本到
`shell/library`中，作为通用的库脚本能够被复用。

### idat执行后

1. 执行完成后通过`echo $?`判断执行是否成功，并打印相应日志。
2. 打印执行idat产生的日志位置。

### shell脚本的要求

1. 有良好的封装，函数化封装。
2. 常量不要散的到处都是，用统一的字段来表示。

## 其他

所有脚本在创建文件之前先判断所在目录是否存在，如果不存在则先创建，使用`mkdir -p`。