wellingtonlee/peek-a-bin

GitHub: wellingtonlee/peek-a-bin

一款纯前端的 WebAssembly 驱动 PE 反汇编与分析工具,支持控制流图、多后端反编译和内核驱动分析,无需安装即可在浏览器中完成二进制逆向。

Stars: 0 | Forks: 0

# Peek-a-Bin ![Peek-a-Bin](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/d0fd4bace3063305.png) 基于浏览器的 PE 反汇编器。所有分析均通过 WebAssembly 在客户端完成。 [![Deploy to GitHub Pages](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/df8c38c490063306.svg)](https://github.com/wellingtonlee/peek-a-bin//actions/workflows/deploy.yml) ![Screenshot](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/c5bd0be6ac063307.png) **[在线演示](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, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 前端安全, 反汇编工具, 反编译器, 可执行文件, 恶意软件分析, 控制流图, 文件结构查看器, 浏览器工具, 自动化攻击, 逆向工程, 静态分析