qiufuyu123/Positron

GitHub: qiufuyu123/Positron

基于 DLL 注入的 Electron 应用 JavaScript 注入引擎,可附加到运行中的进程执行 JS 并实时操作 DOM,无需重启或修改目标文件。

Stars: 9 | Forks: 1

# Positron [中文文档](docs/README_CN.md) 附加到任何正在运行的 Electron 应用程序,在其主进程或渲染进程中执行 JavaScript,并通过实时的模块系统扩展功能——无需重启目标程序或修改其文件。 ![Positron 演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7e35c4706e022643.png) *进程列表和演示固件应用* ## 功能 - **附加到正在运行的进程** — 无需重启,无需修改源码 - **在主进程或渲染进程中执行** — 使用 `.world renderer` 切换运行环境 - **模块系统** — 通过生命周期钩子加载/卸载 JS 模块 - **自卸载 DLL** — payload 在引导完成后从内存中自我擦除 - **无需重新注入即可重连** — JS server 在宿主断开后依然存活 - 支持 **x64 和 x86** - **C++ SDK** — 用于编程集成的静态库 ## 快速入门 ``` # 构建 (需要 VS2022+ C++20, Node.js) npm install msbuild positron.slnx /p:Configuration=Debug /p:Platform=x64 /m # 列出 Electron 进程 host.exe list # 附加并启动 REPL host.exe attach ``` ## 工作原理 ``` host.exe ──attach──> target (Electron) │ │ │ 1. Manual-map payload.dll (BlackBone, bypasses loader checks) │ 2. Resolve V8 symbols via fuzzy PE export matching │ 3. Bootstrap a JS TCP server in V8 main thread │ 4. payload.dll self-unmaps (VEH removal + VirtualFree trampoline) │ │ │ 5. Pure JS communication (length-prefixed JSON over TCP) │ │ └────────────────────┘ ``` 引导完成后,原生 DLL 将完全从内存中消失。随后的 `host.exe attach` 会检测到存活的 JS server 并跳过注入。 ## 用法 ### 交互式 REPL ![REPL 演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c67edab16e022644.png) *附加,进入渲染进程环境,读取 document.title* ``` host.exe attach positron[pid]> 1+1 2 positron[pid]> process.versions.electron "42.0.1" positron[pid]> .world renderer [world = renderer:0] positron[pid/r0]> document.title "Positron Demo" ``` ### 实时 DOM 操作 ![DOM 注入](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/6cc8c758ed022646.png) *从 REPL 修改页面标题* ``` positron[pid/r0]> document.title = "injected" "injected" ``` ### 模块系统 ![模块演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/f39f4c84d8022647.png) *已加载演示模块:标题已更改,状态徽章已翻转,日志条目正在流式传输* ``` positron[pid]> .mod load examples\modules\demo.js [mod.load] {"loaded":"demo"} positron[pid]> .mod list [modules] ["demo"] positron[pid]> .mod unload demo [mod.unload] {"unloaded":"demo"} ``` 模块拥有完整的生命周期管理: ``` (function() { return { name: 'my-module', onLoad: function(api) { api.evalRenderer('document.title', 0).then(function(t) { api.log('title: ' + t); }); }, onUnload: function(api) { api.log('bye'); } }; })() ``` **模块 API:** `api.eval()`, `api.evalRenderer()`, `api.send()`, `api.log()`, `api.getElectron()`, `api.require` ### 单次执行命令 ``` host.exe eval "1+1" # main process host.exe eval -r "document.title" # renderer host.exe run script.js # run a JS file ``` ### 原生模式 用于挂钩原生导出(要求 DLL 保持映射): ``` host.exe attach --native positron(native)[pid]> .hook SomeExport ``` ## REPL 命令 | 命令 | 描述 | |---|---| | `.world auto\|renderer[:N]` | 切换执行目标 | | `.mod load ` | 加载 JS 模块 | | `.mod unload ` | 卸载模块 | | `.mod list` | 列出已加载的模块 | | `.dump [name]` | 保存页面 HTML | | `.hook ` | (原生) 安装 detour | | `.detach` | 断开连接 | ## 架构 ``` positron/ host/ CLI + REPL (host.exe) payload/ Injected DLL — V8 bridge, teardown trampoline sdk/ Static lib, headers, bootstrap.js (terser-minified) shared/wire/ Length-prefixed JSON framing examples/ SDK consumer, JS modules (demo, hello) tests/ Integration + unit tests third_party/ BlackBone, nlohmann/json, replxx, CLI11, MinHook ``` ### 自卸载序列 在 JS server 确认存活后: 1. 停止分离的线程(renderer 轮询器、hook flusher) 2. `RemoveVectoredExceptionHandler` (BlackBone 的 VEH) 3. `VirtualFree` BlackBone 的暂存页(约 12 KB) 4. 在独立的 RWX 页面上的 Shellcode 跳板:`Sleep(500ms)` → `VirtualFree(payload_base)` → `ExitThread(0)` ## SDK ``` #include positron::sdk::Session s; s.attach(pid); // v2 by default auto r = s.eval("1+1"); // r.json_value == "2" s.detach(); ``` ## 许可证 [MIT](LICENSE)
标签:BlackBone, C++, DLL注入, Electron, GNU通用公共许可证, JavaScript注入, JS沙箱逃逸, MITM代理, Node.js, REPL, SSH蜜罐, V8引擎, 云资产清单, 内存操作, 内存自卸载, 动态注入, 安全测试, 攻击性安全, 数据擦除, 流量审计, 白盒测试, 网络安全, 跨平台注入, 进程注入, 进程附加, 逆向工程, 隐私保护