如何将.exe文件按函数级转换为多个汇编文件?
如何将EXE文件的反汇编函数分离为独立文件
下面是用主流逆向工具实现函数分离的具体操作:
IDA Pro 实现方案
- 加载目标EXE文件,等待IDA完成自动分析,确认左侧
Functions窗口里所有函数已被识别。 - 用Python脚本批量导出最高效,打开IDA脚本窗口(快捷键
Shift+F2),粘贴以下代码后运行:import idautils import idc import os # 创建存放函数的目录 output_dir = "extracted_functions" if not os.path.exists(output_dir): os.makedirs(output_dir) # 遍历所有识别到的函数 for func_ea in idautils.Functions(): func_name = idc.get_func_name(func_ea) func_end = idc.get_func_attr(func_ea, idc.FUNCATTR_END) # 逐行提取反汇编代码 disasm_lines = [] ea = func_ea while ea < func_end: disasm_lines.append(idc.generate_disasm_line(ea, 0)) ea = idc.next_head(ea, func_end) # 写入独立文件 with open(os.path.join(output_dir, f"{func_name}.txt"), "w", encoding="utf-8") as f: f.write("\n".join(disasm_lines)) - 运行后,所有函数会以
[函数名].txt的格式保存在extracted_functions目录中。
Ghidra 实现方案
- 将EXE导入Ghidra,完成自动分析后打开
Function Manager窗口。 - 编写Ghidra Python脚本批量导出:在
Script Manager中新建脚本,粘贴以下代码并运行:from ghidra.app.script import GhidraScript import os class ExtractFuncScript(GhidraScript): def run(self): output_dir = "ghidra_extracted_funcs" if not os.path.exists(output_dir): os.makedirs(output_dir) # 遍历程序所有函数 for func in currentProgram.getListing().getFunctions(True): func_name = func.getName() body = func.getBody() # 提取函数范围内的所有反汇编行 disasm_lines = [] for code_unit in currentProgram.getListing().getCodeUnits(body, True): disasm_lines.append(code_unit.toString()) # 写入文件 with open(os.path.join(output_dir, f"{func_name}.txt"), "w", encoding="utf-8") as f: f.write("\n".join(disasm_lines)) - 执行完成后,每个函数的反汇编内容会单独保存在指定目录下。
Radare2 命令行实现方案
- 终端中执行以下步骤:
- 先创建存放函数的目录:
mkdir -p functions - 生成函数列表:
r2 -q -c "aaa; af > funclist.txt" your_file.exe - 批量导出每个函数的反汇编:
while read func; do r2 -q -c "pD \$F{$func}" your_file.exe > "functions/${func}.txt" done < funclist.txt
- 先创建存放函数的目录:
- 上述命令会把每个函数的反汇编内容输出到
functions目录下的对应文件中。
注意点
- 如果目标EXE加壳,必须先脱壳再进行分析,否则工具无法正确识别所有函数。
- 脚本默认会导出所有识别到的函数,包括系统导入函数(如
kernel32.dll中的API),可在脚本中添加判断逻辑过滤掉不需要的函数。
内容的提问来源于stack exchange,提问作者Homayoon Soleimani
相关产品推荐
相关产品推荐

