qiufuyu123/Positron
GitHub: qiufuyu123/Positron
基于 DLL 注入的 Electron 应用 JavaScript 注入引擎,可附加到运行中的进程执行 JS 并实时操作 DOM,无需重启或修改目标文件。
Stars: 9 | Forks: 1
# Positron
[中文文档](docs/README_CN.md)
附加到任何正在运行的 Electron 应用程序,在其主进程或渲染进程中执行 JavaScript,并通过实时的模块系统扩展功能——无需重启目标程序或修改其文件。

*进程列表和演示固件应用*
## 功能
- **附加到正在运行的进程** — 无需重启,无需修改源码
- **在主进程或渲染进程中执行** — 使用 `.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

*附加,进入渲染进程环境,读取 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 操作

*从 REPL 修改页面标题*
```
positron[pid/r0]> document.title = "injected"
"injected"
```
### 模块系统

*已加载演示模块:标题已更改,状态徽章已翻转,日志条目正在流式传输*
```
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引擎, 云资产清单, 内存操作, 内存自卸载, 动态注入, 安全测试, 攻击性安全, 数据擦除, 流量审计, 白盒测试, 网络安全, 跨平台注入, 进程注入, 进程附加, 逆向工程, 隐私保护