PE Dagger ServerWindows PE32 / PE32+ 静态解析与改写服务
一款面向可执行程序的静态解析与改写服务,服务启动后仅监听单一端口,通过 HTTP + JSON 方式对外提供接口,能够在单次请求中完成头部解析、导入导出表分析、反汇编、节区改写、资源与重定位重建、签名审计等能力,同时支持多会话隔离并发运行。
从启动到落盘的四步
写操作只改内存镜像,必须 Save 才落盘, 因此可以在落盘前反复试错、随时 Revert。
启动服务
双击即以后台托盘模式常驻运行,默认监听本机 8947 端口,日志写入程序目录;需要观察实时输出时,可切换为前台命令行模式。
发起调用
所有能力统一通过一次 HTTP 请求触发,请求体只需给出接口名、参数与会话标识;Python、curl、浏览器或原始 socket 均可直接调用。
内存编辑镜像
读接口即时反映内存中的改动;写接口只修改内存编辑镜像,磁盘文件始终保持原样,并可随时撤销回到上次保存的状态。
Save 落盘
省略路径即原地覆盖,给出路径即另存,写入过程保持原子性;若未保存就关闭文件或退出进程,内存中的改动会全部丢弃。
关键约束:Save 省略参数则原地覆盖当前文件,给出路径则另存;
Revert 丢弃内存改动回到上次 Open / Save 的状态。
同一会话内串行执行,跨会话并行。
协议与调用方式
统一 POST /(另有一个 GET / 返回服务信息),请求响应都是 JSON。
端点只有这两个,没有 /api。
{
"interface": "<接口名>",
"params": ["参数0", "参数1"],
"session": "<会话 id>"
}
// 成功:HTTP 200 { "status": "success", "result": { ... }, "timestamp": 123456 } // 业务/参数错误:HTTP 400,但 body 仍是合法 JSON { "status": "error", "code": "E_OP_FAILED", "result": { "error": "错误描述" }, "timestamp": 123456 }
判定成功必须看最外层的 status,不是 result 内部字段。
params 是字符串数组——非字符串元素(数字、对象)会被解析器丢弃。
因为业务错误也用 HTTP 400,用 urllib 会被抛成 HTTPError 而丢掉响应体,
建议用原始 socket 或直接调用本页代码。
| code | 含义 |
|---|---|
E_BAD_JSON | 请求体不是合法 JSON |
E_BAD_PARAM | 接口名不存在或参数个数 / 格式错误(错误信息里会写明正确写法) |
E_NOT_OPEN | 尚未调用 Open 打开 PE 文件 |
E_OP_FAILED | 业务执行失败(如样本不具备该结构) |
E_UNAUTHORIZED | 缺少或错误的 X-Auth-Token(HTTP 401) |
E_READONLY | 只读模式下调用了写接口(HTTP 403) |
E_BAD_SESSION | 会话标识非法 |
E_NOT_FOUND | 路由未命中 / 方法不允许 / 服务内部错误 |
{ "interface": "SessionCreate", "params": [] }
{ "interface": "Open", "params": ["a.dll"], "session": "s1" }
{ "interface": "SessionClose", "params": ["s1"] }
会话各自持有独立的已打开文件与编辑镜像 { "interface": "Open", "params": ["a.dll"], "session": "s1" } { "interface": "Open", "params": ["b.dll"], "session": "s2" }
会话 id 合法字符 A-Za-z0-9_.-:,长度 1~64;空闲超时默认 600s 回收,
default 槽永不回收。同一会话内串行执行,不同会话可并行处理。
14 类接口 · 142 个能力
从服务与会话管理,到头部解析、导入导出、资源、重定位、节区、反汇编、搜索、哈希、签名审计, 再到结构改写与工具统计。点击任意分类直达接口浏览器;浏览器内还可按 15 个 API 类进一步筛选。
面向样本分析与二进制工程化
可编程接口,让 PE 分析从「手动点选工具」升级为「脚本驱动」, 并可进一步接入自动化流水线与大模型编排。
PE 骨架解析
一次调用即可取回文件基本信息、DOS / NT 头、可选头、数据目录与节表,帮助快速建立对样本整体结构的认知。
导入导出与资源枚举
按 DLL 分组或按函数名检索导入表,枚举全部导出符号,并遍历资源树提取所需的资源数据,摸清样本的对外依赖与内置资源。
地址换算与反汇编
在 RVA / FOA / VA 之间互相换算定位,对指定地址定点反汇编,并支持特征码搜索、字符串与 HexASCII 数据提取。
结构改写与另存
对样本打补丁,修改 ImageBase、节名与节属性,追加数据并重建重定位,最后更新校验和、另存为新的可执行文件。
安全审计与哈希
综合评估 ASLR / DEP / CFG / SEH 等安全特性,计算全文件与逐节哈希,解析 Authenticode 签名并验签,检查 overlay 附加数据。
多会话分析
为不同文件创建相互独立的会话,各自维护打开状态与内存编辑镜像,可并行执行、互不干扰。
从下载到第一次调用
下载并启动 → 安装工具集 → 执行第一次调用,三步跑通。服务端零依赖,静态链接 /MT,无需安装运行库。
下载并启动
发布包内含 x64 与 x86 两个目录,解压后双击 PEDagger.exe 即后台托盘运行;加 --console 前台运行看输出。
PEDagger.exe 托盘驻留 PEDagger.exe --console 前台运行 PEDagger.exe --port=8947 --readonly
安装 PEDagger 工具集
一条命令装好 Python 工具集,内含 SDK 与示例脚本,仅依赖标准库、无需任何第三方包。
CMD> pip install PeDagger==1.0.0
运行环境:Windows 7 及以上,提供 x64 与 x86 两个构建版本,均以 /MT 静态链接运行库,
无需额外安装任何依赖。解析只读文件无需管理员权限;改写位于系统目录下的文件需要提权。
默认监听 8947 端口,可用 --port 指定其他端口,--readonly 开启只读模式。
获取渠道:服务端发布包由
GitHub Releases
提供,Python 工具集由
PyPI
提供(pip install PeDagger==1.0.0),源码见
lyshark/PEDagger。
第一段分析脚本
下面这段脚本基于随附的 Python SDK 编写:它覆盖全部 142 个接口,仅依赖标准库、无需任何第三方包; 整体采用与项目内既有实现一致的分层设计——统一的配置与鉴权、底层通信基类、按功能拆分的模块类,以及一个对外的聚合客户端。
from pedagger_sdk import * # 初始化 PEDagger 客户端连接 client_interface = PEDaggerClient(address="127.0.0.1", port=8947, api_key="45d3552b12b12cdf2c831344311cf81e") # 创建客户端会话池 resp = client_interface.session_create() # 同时打开两个会话 s1 = client_interface.open_file("c://win32.exe", session="session1") s2 = client_interface.open_file("c://x32.dll", session="session2") # 查看会话列表 print(client_interface.session_list()) # 分别调用两个会话的 nt_head 方法 res_nt1 = client_interface.nt_head(session="session1") res_nt2 = client_interface.nt_head(session="session2") # 打印结果 print(res_nt1) print(res_nt2) # 关闭会话 client_interface.session_close(session_id="session1") client_interface.session_close(session_id="session2")
鉴权头是 X-Auth-Token(GET / 也要带)。
服务端内置默认 KEY 45d3552b12b12cdf2c831344311cf81e,未配置任何 token 时即用它鉴权,
因此 SDK 默认就会带上该 KEY,auth_required=true。
接口浏览器
全部 142 个接口均与 SDK 方法一一对应,支持关键词搜索与 API 类名筛选。 点击任意行 即可展开该接口的 Python 调用、原始 JSON 报文、完整入参与返回字段。
| 接口 | SDK 方法 | API 类名 | 功能说明 |
|---|