wellingtonlee/peek-a-bin
GitHub: wellingtonlee/peek-a-bin
一款纯前端的 WebAssembly 驱动 PE 反汇编与分析工具,支持控制流图、多后端反编译和内核驱动分析,无需安装即可在浏览器中完成二进制逆向。
Stars: 0 | Forks: 0
# Peek-a-Bin

基于浏览器的 PE 反汇编器。所有分析均通过 WebAssembly 在客户端完成。
[](https://github.com/wellingtonlee/peek-a-bin//actions/workflows/deploy.yml)

**[在线演示](https://wellingtonlee.github.io/peek-a-bin/)**
## 功能特性
**文件加载**
- 将 PE 文件直接拖放到浏览器中
- 内置演示二进制文件,便于快速探索
- 最近打开的文件存储在 IndexedDB 中 —— 点击即可重新打开,无需再次浏览
**PE 分析**
- 带字段描述的 DOS/NT/Optional Headers
- 包含特性和熵的节表 (Section table)
- 导入和导出目录解析
- 资源目录树,包含版本信息、图标预览和清单显示
**反汇编**
- 通过 Capstone WASM 进行 x86 和 x64 反汇编
- 混合递归下降 + 线性扫描反汇编
- 填充间隙区域视觉上变暗,以便与控制流可达代码区分
- 针对大型二进制文件的虚拟滚动
- 显示控制流的跳转箭头
- 用于导航概览的缩略图
**高级分析**
- 通过序言扫描、调用目标和 .pdata(x64 异常目录)进行函数检测
- 当 .pdata 可用时,提供精确的函数边界
- 交叉引用 —— 字符串、导入和数据节引用
- 调用者/被调用者侧边栏面板 —— 显示哪些函数调用了活动函数以及它调用了哪些函数
- PE 异常检测 —— 标记可疑特征(WX 节、加壳指示器、禁用 ASLR/DEP 等)并带有严重性着色横幅
- 栈帧重建
- 控制流图 (CFG) —— 可通过 `Space`(IDA 风格)切换的内联图视图,支持完整的指令交互、可折叠块、平移/缩放和侧边栏图概览缩略图
- 带子标签的反编译器 —— **低级**(内置基于 IR 的反编译器)、**高级**(可选 Ghidra 服务器)、**AI**(LLM 驱动的增强/解释);每个标签每个函数缓存及双向汇编同步
**内核驱动分析**
- 自动检测 `.sys` 驱动程序(NATIVE 子系统、WDM 标志、内核模块导入)
- 针对已识别驱动程序的可关闭琥珀色横幅和状态栏徽章
- 可疑内核 API 标记,带有颜色编码的类别(进程/线程、回调/Hook、内存、注册表、文件系统、网络、对象)
- IOCTL 代码解码器 —— 在反汇编和反编译输出中内联注解设备控制代码
- IRP 派发表检测 —— 识别 DriverEntry 中的 MajorFunction 处理程序分配并自动重命名处理程序函数
- Authenticode / 数字签名解析 —— 无需外部 ASN.1 库即可从 PKCS#7 SignedData 中提取签名者主题、颁发者和有效期
**导航**
- 命令面板 (Ctrl/Cmd+P)
- 快捷键面板(按 `?`)
- 跳转到地址
- 面包屑轨迹
**注释**
- 书签、重命名和注释
- 撤销/重做支持
- 持久化存储在 localStorage
- 统一导出/导入(书签、重命名、注释、十六进制补丁、函数)
**数据视图**
- 带有数据交叉引用指示器的十六进制转储 —— 紫色徽章显示交叉引用计数,点击查看引用指令
- 字符串提取
- 数据检查器
- 支持下载的资源浏览器
**离线 / PWA**
- 可作为 Progressive Web App 安装
- 完全离线支持 —— 包括反汇编引擎在内的所有资源均被缓存
## 技术栈
- React 19, TypeScript 5.7, Vite 6
- Tailwind CSS 4
- capstone-wasm (编译为 WASM 的 Capstone 反汇编引擎)
- @tanstack/react-virtual (虚拟滚动)
- vite-plugin-pwa (Service Worker 和离线缓存)
- Vitest (单元测试)
- 用于主线程外反汇编的 Web Workers
## 环境要求
- Node.js 20+
- npm
## 快速开始
```
git clone https://github.com/wellingtonlee/peek-a-bin.git
cd peek-a-bin
npm install
npm run dev
# http://localhost:5173/peek-a-bin/
```
## 测试
```
npm test # run all tests once
npm run test:watch # watch mode
```
## 生产构建
```
npm run build
npm run preview # http://localhost:4173/peek-a-bin/
```
## 离线 / PWA 使用
Peek-a-Bin 是一个 Progressive Web App,首次访问后即可完全离线工作。
1. **访问应用** —— 在 Chrome、Edge 或其他支持 PWA 的浏览器中访问([在线演示](https://wellingtonlee.github.io/peek-a-bin/) 或本地 `npm run preview` 构建)。
2. **安装** —— 点击浏览器地址栏中的安装图标,或使用浏览器菜单(例如 Chrome 中的“安装 Peek-a-Bin...”)。在移动设备上,使用“添加到主屏幕”。
3. **离线使用** —— 安装后,应用无需互联网连接即可工作。Service Worker 会预缓存所有资源,包括约 2 MB 的 Capstone WASM 反汇编引擎。
4. **更新** —— Service Worker 会在后台自动更新。在更新可用后的下次访问时,新版本将自动加载。
## Docker
```
docker build -t peek-a-bin .
docker run -p 8080:80 peek-a-bin
# http://localhost:8080/peek-a-bin/
```
## Ghidra 反编译服务器(可选)
反编译面板中的 **高级** 标签可以使用配套的 Ghidra 服务器以获得更高质量的反编译。该服务器通过 [pyhidra](https://github.com/dod-cyber-crime-center/pyhidra) 封装 Ghidra 的反编译器并暴露 REST API。
### 快速开始
```
cd ghidra-server
docker build -t peek-a-bin-ghidra .
docker run -p 8765:8765 peek-a-bin-ghidra
```
如需要求 API 密钥进行身份验证:
```
docker run -p 8765:8765 peek-a-bin-ghidra --api-key YOUR_SECRET
```
### 不使用 Docker 运行
需要 Java 21+ 和 Python 3.10+:
```
cd ghidra-server
pip install -r requirements.txt
python server.py --port 8765
```
首次运行时,pyhidra 会自动下载并安装 Ghidra。
### 将 Peek-a-Bin 连接到服务器
1. 在 Peek-a-Bin 中打开 **设置**(齿轮图标或通过命令面板)
2. 勾选 **启用 Ghidra 服务器**
3. 输入服务器 URL(默认:`http://localhost:8765`)
4. 如果服务器使用 `--api-key` 启动,请输入 API 密钥
5. 点击 **保存**
配置完成后,反编译面板中的 **高级** 标签会将二进制文件发送到 Ghidra 服务器并显示 Ghidra 的反编译输出。二进制文件上传一次,并由 SHA-256 哈希在服务器端缓存。
### API 端点
| Method | Endpoint | Description |
|--------|----------|-------------|
| `GET` | `/api/v1/ping` | 健康检查,返回 `{ version }` |
| `POST` | `/api/v1/binary` | 上传 PE 二进制文件,返回 `{ projectId }` |
| `POST` | `/api/v1/decompile` | 反编译指定地址的函数,返回 `{ code, lineMap }` |
## 项目结构
```
src/
├── analysis/ # Binary analysis modules (driver detection, IOCTL, IRP, anomaly detection)
├── components/ # React UI components
├── decompile/ # Decompilation clients (Ghidra REST, WASM stub, types)
├── pe/ # PE file format parser (headers, imports, authenticode)
├── disasm/ # Disassembly engine integration and built-in decompiler
├── llm/ # LLM integration (settings, streaming client, prompts)
├── workers/ # Web Worker threads
├── hooks/ # Custom React hooks
├── utils/ # Shared utilities
├── styles/ # Tailwind and global styles
├── App.tsx # Root application component
└── main.tsx # Entry point
ghidra-server/ # Optional Ghidra decompilation server (Docker + FastAPI)
```
## 键盘快捷键
在应用中按 `?` 查看所有快捷键。主要按键绑定包括:
| Key | Action |
|-----|--------|
| `Space` | 切换 线性 / 图视图 |
| `1`–`8` | 切换标签页 |
| `G` | 跳转到地址 |
| `?` | 键盘快捷键面板 |
| `Ctrl+P` | 命令面板 |
| `Ctrl+F` | 搜索反汇编 |
| `B` | 切换书签 |
| `0` | 缩放以适应(图模式) |
| `Tab` | 循环切换后继块(图模式) |
| `Ctrl+Z` / `Ctrl+Shift+Z` | 撤销 / 重做 |
| `Alt+Left` / `Alt+Right` | 后退 / 前进 |
## 架构
Peek-a-Bin 完全在客户端运行。文件使用 TypeScript PE 解析器在浏览器中解析,然后通过编译为 WebAssembly 的 Capstone 在 Web Worker 中进行反汇编。WASM 二进制文件在首次加载后缓存到 IndexedDB 中。应用状态通过 React Context 和 `useReducer` 管理。虚拟滚动(通过 @tanstack/react-virtual)确保即使对于大型二进制文件,UI 也能保持响应。
反汇编采用混合方法:从已知入口点(导出、.pdata 条目、检测到的序言、调用目标)开始递归下降,随后进行线性扫描以填补空白。这避免了将嵌入数据解码为指令,同时仍提供完整的节覆盖。
```
File Drop → PE Parser (TS) → Capstone WASM (Worker) → React UI
```
## 许可证
[MIT](LICENSE)
标签:Capstone, CFG, DAST, IndexedDB, PE 文件, WASM, WebAssembly, x64, x86, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 前端安全, 反汇编工具, 反编译器, 可执行文件, 恶意软件分析, 控制流图, 文件结构查看器, 浏览器工具, 自动化攻击, 逆向工程, 静态分析