Skip to content

Repository files navigation

PinBridge Next

面向 Windows x64 / x86 的可编程动态二进制分析平台

以 Intel Pin 3.31 为执行引擎,通过稳定 C ABI、Rust Agent 与内嵌 CPython,提供从实时插桩、精确停点到录制重放与污染分析的一体化工作流。

PlatformIntel PinABIRustPython

核心能力 · 架构 · 快速开始 · Python 自动化 · 录制与重放 · 文档


PinBridge 是什么

PinBridge Next 不是简单的 Pin API 包装,也不是只负责展示事件的前端。它把动态分析拆成三条相互隔离的路径:

路径负责什么设计目标
原生热路径指令、内存、分支、Hook、系统调用与上下文事件不进入 Python,不跨越 C++ 所有权边界
控制与脚本路径断点、单步、上下文修改、同步拦截、插件生命周期Python 可编排,关键决定可同步返回原生层
录制与重放路径.pbtr 窗口录制、反汇编、前向污染、反向切片将高成本分析移出目标进程

核心理念很直接:Python 声明策略,原生层执行热路径,事件通过有界通道交给脚本和前端。

平台边界同样明确:PinBridge 本体不识别 VMProtect,也不内置“OEP”“脱壳成功”或“Dump” 等业务结论;它只提供精确停机、同步事件、寄存器/内存访问和执行区间监控等通用调试 原语。壳版本判断、OEP 判定条件和后续工作流属于可热替换的 Python 策略。这样 AI、用户 脚本和传统前端复用的是同一套调试器能力,不需要为每种壳修改 Agent。

核心能力

调试与控制

  • 精确软件停点、单步进入与单步越过,支持 x64 / x86。
  • 停止、恢复、线程与模块枚举、内存读写、寄存器读写、符号解析和反汇编。
  • 运行时 Hook 点与断点槽分离;Hook 可观察,也可同步修改寄存器、返回值和控制流。
  • 异常、系统调用、子进程跟随和调试器事件可交给 Python 作出同步决定。

Python 事件平台

  • 内嵌 CPython 3.10,多插件可热加载、卸载和事务式替换。
  • pb.on(...) 注册命名事件;pb.watch(...) 使用紧凑批处理消费高频事件。
  • pb.breakpoint(...) 在精确停点后执行脚本逻辑,可读取内存、修改上下文并决定如何继续。
  • pb.execution_trap(...) 发布原生执行区间监控,命中后先稳定停止全部应用线程,再投递 execution.trap;脚本可用它组合 OEP 定位、代码解密完成点等外置策略。
  • pb.instrumentation_set(...) 将种类、地址范围和线程过滤编译为不可变原生策略。
  • 支持指令执行与解码、内存、分支、模块、线程、进程生命周期、SMC、异常、系统调用、Hook、Trace、函数和基本块事件。

录制与离线分析

  • 独立录制通道采集指令字节、具体内存地址、访问值、寄存器快照和控制流边。
  • 固定格式 .pbtr 支持截断尾部检测、序列缺口报告与无损重复记录压缩。
  • 纯 Python 重放器支持 x64 / x86、同地址 SMC 解码、字节级寄存器与影子内存污染。
  • 已实现前向污染传播、寄存器/内存汇点、控制流汇点和基于具体 EA 的反向切片。

稳定 ABI 与多前端

  • pinbridge.dll 提供冻结的 C ABI v1.10;C++ 类型、异常和 STL 不跨越边界。
  • 句柄、缓冲区与所有权契约明确,可供 Rust、Python 或其他语言绑定。
  • Rust workspace 提供协议、客户端、CLI、TUI、UI 与 Agent。
  • Loopback 二进制协议允许 CLI、自动化程序、AI/MCP 客户端或自定义前端接入。

架构

flowchart TB
UI[CLI / TUI / UI / Automation] --> CLIENT[pinbridge-client]
CLIENT -->|Loopback binary protocol| AGENT
subgraph AGENT[pinbridge_agent.dll · Rust PinTool]
CONTROL[Control plane\nBreakpoint · Step · Context]
EVENTS[Bounded event lanes\nPriority · Observation · Telemetry]
PYTHON[Embedded CPython\nPlugins · Callbacks · Interceptors]
RECORD[PBTR recorder\nBytes · Memory · Registers]
end
AGENT --> ABI[pinbridge.dll · Frozen C ABI v1.10]
ABI --> PIN[Intel Pin 3.31 JIT]
PIN --> TARGET[Target process · x64 / x86]
RECORD --> PBTR[.pbtr capture]
PBTR --> REPLAY[Offline replay\nTaint · Slice · Decode]
Loading

热路径上的分析回调只写固定大小记录。Python 回调统一在 Agent 内部脚本线程执行;需要改变应用现场的 Hook、异常或系统调用使用专门的同步拦截通道,而不是让普通遥测事件阻塞目标线程。

快速开始

环境要求

  • Windows 10 / 11
  • Visual Studio 2022 C++ 工具链
  • CMake
  • Rust + Cargo
  • Intel Pin 3.31 SDK
  • CPython 3.10(x86 构建脚本可校验并准备官方 embeddable 包)

构建

$env:PIN_ROOT="D:\sdk\pin-3.31"# 构建 C ABI 桥;-Arch 可取 x64 或 x86
.\Build-Pin.ps1-Configuration Release -Arch x64
.\Build-Pin.ps1-Configuration Release -Arch x86
# 构建 x64/x86 Agent 与控制端Push-Location .\bindings\rust
.\build-agents.ps1Pop-Location

启动目标与控制端

$env:PINBRIDGE_AGENT_PORT="9011"&"$env:PIN_ROOT\intel64\bin\pin.exe"`-t ".\bindings\rust\target\release\pinbridge_agent.dll"`--"C:\Windows\System32\hostname.exe"

另开一个终端:

$cli=".\bindings\rust\target\release\pinbridge-cli.exe"&$cli--port 9011 ping
&$cli--port 9011 modules
&$cli--port 9011 threads
&$cli--port 9011 events 20

VMP / 异常敏感目标

默认 JIT 模式保留断点、单步、系统调用和逐指令插桩。对于通过 POPF/POPFD/POPFQ 打开 TF 的目标,PinBridge 会在应用指令边界虚拟化该 TF,并用应用 上下文重新抛出 0x80000004;异常仍进入目标原有 VEH/SEH,同时经过 PinBridge 的异常 事件通道。平台自有断点不会走这条重投递链。

只有遇到尚未兼容的代码缓存/反 DBI 行为时,才使用探针保底模式:

&$cli`--pin "$env:PIN_ROOT\intel64\bin\pin.exe"`--agent ".\bindings\rust\target\release\pinbridge_agent.dll"`--pin-probe --no-entry-bp run --"C:\path\protected.exe"

上面的 run 会进入 PinBridge 控制 shell。目标本身也读取控制台输入时,优先使用桌面启动页; 或在目标终端用 pin.exe -probe 1 -t <agent> -- <target> 启动,再从第二个终端连接 CLI, 避免控制 shell 与目标菜单竞争同一个标准输入。

底层 Probe 模式在桌面端显示为“原生兼容观察模式(调试能力受限)”。它让目标机器码原生 执行,只保留控制端口、Python 宿主、模块加载/卸载、应用启动、最终退出和分离通知等低频 观察能力。精确断点、单步、异常上下文接管、系统调用、执行监控及指令/基本块/Trace 插桩 属于 JIT 能力,在该模式中不启用;启动页同时自动关闭入口断点。它是兼容性保底,不是 VMP 脱壳或 OEP 定位模式。

Python 自动化

下面的插件只在目标函数范围内启用运行时指令事件。Python 负责声明和消费,实际过滤与采集由原生层完成。

importpbPOLICY_GENERATION=0defon_instruction(event):
pb.print(
f"tid={event['tid']} "f"ip={event['address']:#x} "f"size={event['size']} "f"policy={event['policy_generation']}"
)
defpb_init():
globalPOLICY_GENERATIONentry=pb.resolve_name("ntdll.dll!NtCreateFile")
ifnotentry:
raiseRuntimeError("NtCreateFile was not resolved")
pb.on("instruction", on_instruction)
POLICY_GENERATION=pb.instrumentation_set(
kinds=["instruction"],
ranges=[(entry, entry+0x80)],
)
pb.print(f"policy {POLICY_GENERATION} armed at {entry:#x}")
&$cli--port 9011 script run .\plugin.py
&$cli--port 9011 script output --follow
&$cli--port 9011 script off all

更完整的断点、Hook、异常接管、系统调用拦截和生命周期示例位于 examples/pythonfixturesvmp_oep.py 展示了这种边界:脚本观察内存保护变化并决定何时 布置监控,PinBridge 原生层负责在候选代码第一条指令执行前精确停住。脚本只输出 OEP 候选 并保持目标停止,Dump 与 IAT 恢复是后续独立策略。

录制与重放

# 在指定范围录制指令与内存事件&$cli--port 9011 trace start exec,memory `0x1400000000x140100000 C:\tmp\window.pbtr
&$cli--port 9011 trace stop
# 离线污染传播与反向切片Push-Location .\examples\python\replay
python .\taint.py C:\tmp\window.pbtr forward `--source mem:0x140020000:0x100`--sink reg:RAX
python .\taint.py C:\tmp\window.pbtr slice `--at 12345`--operand reg:RDX
Pop-Location

对于壳、SMC 或自解密目标,优先录制携带实际执行字节的 exec_bytes,避免使用磁盘 PE 字节推断运行时语义。

验证状态

范围当前基线
C/C++ ABI 与契约测试60 / 60
Rust Agent 单元测试38 / 38
Python PBTR / replay 测试37 / 37
x64 AgentRelease 编译 + 真实 Pin 回归通过
x86 AgentRelease 编译 + Python 精确断点回归通过
Python 动态插桩命名回调、批处理、Trace、函数、基本块真机通过

常用验证入口:

.\Run-Tests.ps1
$env:PINBRIDGE_PIN_EXE="$env:PIN_ROOT\intel64\bin\pin.exe"
python .\tests\control_e2e.py
python .\tests\script_e2e.py
python .\examples\python\replay\test_taint.py
.\fixtures\instrumentation_python_demo\run.ps1
.\fixtures\exception_python_demo\run.ps1
.\fixtures\syscall_python_demo\run.ps1
.\fixtures\x86\run_python.ps1

项目结构

include/pinbridge/ 冻结 C ABI 头文件与生成常量
src/ ABI facade、后端接口与 Intel Pin 实现
msvc/ PinTool DLL 工程
bindings/rust/ Rust workspace:Agent、协议、客户端与前端
examples/python/ Python 插件与离线重放工具
fixtures/ 可重复执行的真实 Pin 集成测试
tests/ ABI 契约、控制面与脚本 E2E
docs/ 设计、脚本 API 与分析路线文档
tools/ 绑定和代码生成工具

Hub 架构与操作模式

默认桌面部署由单个 Tauri 进程内嵌并持有一个 Hub。Hub 是 Agent 传输、会话、控制门禁、动态脚本服务和结构化 activity 时间线的唯一所有者。Tauri 是可信人工适配器,pinbridge-mcp 是连接同一 Hub 的 AI stdio 适配器;两者不会分别建立竞争性的 Agent 连接。

pinbridge-hub 是面向独立可信人工适配器的 headless 替代部署,不能与 Tauri 内嵌 Hub 使用同一个 endpoint。它只连接已经运行的 Agent;MCP 断开时不会启动、重启或终止目标进程。

支持两种顶层体验:

  • 人工主导(“古法”):人工先启动或附加目标,在 Manual 模式下定位、检查和调试,然后明确把控制权交给 AI。
  • AI 主导:可信人工完成交权后,AI 执行有界同步读取;目标和脚本写操作仅在 AiAutonomous 下允许。可信人工接管时会先阻止新的 AI 写操作,再尝试暂停 Agent。

动态脚本在当前目标中注入、替换或移除,不会重启目标。两个适配器共享有界、结构化的 activity 时间线、operation ID 和资源引用;日志不保存源码或大型 payload。MCP 提供同步工具和动态脚本能力,但不暴露高频原始事件流。桌面轮询可以使用内部的小型事件快照,但不承诺向 MCP 提供完整事件回调覆盖。

headless 部署应将凭据放在受保护的环境变量中,不要写入命令行或日志:

$env:PINBRIDGE_HUB_HUMAN_SECRET="<protected-secret-at-least-16-bytes>"$env:PINBRIDGE_HUB_AI_SECRET="<different-protected-secret>"
cargo run -p pinbridge-hub ----agent-port 9011--listen 9444$env:PINBRIDGE_HUB_ENDPOINT="127.0.0.1:9444"
cargo run -p pinbridge-mcp

默认 Tauri 部署从受保护的进程环境中读取 PINBRIDGE_HUB_HUMAN_SECRETPINBRIDGE_HUB_AI_SECRET,并从 PINBRIDGE_HUB_PORT(或 --hub-listen)读取 Hub 监听配置。若任一 secret 缺失或无效,Tauri 仍保持 Manual 模式,但不会启动 Hub IPC,AI 交权也保持禁用;仅当两个 secret 均有效时才监听并允许 MCP 接入。MCP 进程从 PINBRIDGE_HUB_ENDPOINT(或 --hub-endpoint)读取连接地址。凭据不会写入日志或 MCP 请求。

文档

平台边界

  • 当前目标平台为 Windows x64 / x86;Linux 平台层尚未实现。
  • Intel Pin 3.31 在 Windows JIT 模式下不支持重新附加。PinBridge 会明确报告不支持,不会把失败伪装成成功。
  • 普通高频事件是异步观察通道;需要修改应用现场时,应使用断点或同步拦截 API。
  • 项目面向授权的软件分析、调试、兼容性研究与安全研究场景。

Stable ABI below. Native policy in the hot path. Python everywhere else.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages