reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,242 @@
---
name: browser-automation
description: |
统一自动化入口。覆盖浏览器自动化(Playwright)和 Windows 桌面应用自动化(OpenReverse)。
浏览器场景:打开网页、点击、填表、爬取、截图、自动化登录、渗透页面交互。
桌面场景:操作 IDA/x64dbg 等 GUI 工具、Windows UI Automation、视觉驱动交互、桌面应用网络抓包。
触发关键词:浏览器自动化、桌面自动化、打开网页、填表、爬取、截图、自动化登录、Playwright、agent-browser、headless、OpenReverse、UIA、CUA、桌面操作、Windows 自动化。
---
# 自动化操作 (Desktop & Browser Automation)
## ACTION REQUIRED(读完后立刻执行)
1. `NOW`:确认当前任务是否命中本 skill 的适用范围
2. `NOW`:读取 `../tool-index.md`,校验工具可用性和实际路径
3. `NEXT`:缺工具时调用 bootstrap,不要猜路径
4. `ACT`:进入"工作流"第一步并执行,不要停在确认状态
## 适用范围
当任务属于以下场景时使用本 skill:
### 浏览器场景(Playwright / agent-browser)
- 打开网页并操作页面元素(点击、填表、提交)
- 爬取页面内容或截图
- 自动化登录流程
- 渗透测试中与 Web 页面交互(提交 payload、触发 XSS)
- 验证码页面的自动化处理
- 批量表单提交
### 桌面应用场景(OpenReverse)
- 操作 Windows 桌面应用(IDA Pro、x64dbg、Wireshark 等)
- 需要视觉驱动交互(CUA 模式)
- 需要结构化 UI 操作(UIA 模式)
- 桌面应用的网络流量观察(内置 mitmproxy)
- 自动化逆向工具的 GUI 操作
- 黑盒测试桌面软件
### 与其他工具的分工
| 场景 | 用什么 |
|------|--------|
| 操作网页(浏览器内) | **Playwright / agent-browser** |
| 操作桌面应用(Windows GUI) | **OpenReverse** |
| 抓包分析、HTTP 请求捕获 | anything-analyzer 或 OpenReverse network lane |
| JS 断点、Hook、CDP 调试 | jshookmcp |
| 定位签名算法、补环境复现 | js-reverse |
简单判断:
- 目标是网页 → Playwright
- 目标是 Windows 桌面应用 → OpenReverse
- 两者都需要 → 组合使用
---
## Part 1: 浏览器自动化(Playwright / agent-browser)
### 核心工作流
```bash
# 1. 打开页面
agent-browser open <url>
# 2. 获取可交互元素(返回 @e1, @e2... 引用)
agent-browser snapshot -i
# 3. 用引用操作元素
agent-browser click @e1
agent-browser fill @e2 "text"
# 4. 完成后关闭
agent-browser close
```
### 命令参考
```bash
# 导航
agent-browser open <url>
agent-browser close
# 页面快照
agent-browser snapshot # 完整无障碍树
agent-browser snapshot -i # 仅可交互元素(推荐)
# 交互操作
agent-browser click @e1
agent-browser fill @e2 "text"
agent-browser type @e2 "text"
agent-browser press Enter
agent-browser scroll down 500
# 获取信息
agent-browser get text @e1
agent-browser get title
agent-browser get url
# 等待
agent-browser wait @e1
agent-browser wait 2000
agent-browser wait --load networkidle
```
### 注意事项
- 必须执行 `agent-browser close`,否则进程泄漏
- 操作前先 snapshot,不要猜元素引用
- 提交表单后用 `wait --load networkidle` 等页面稳定
---
## Part 2: 桌面应用自动化(OpenReverse)
### 概述
[OpenReverse](https://github.com/zhexulong/openreverse) 是面向 AI Agent 的桌面交互与证据采集框架,支持:
- **UIA 模式**:Windows UI Automation,结构化桌面控件操作
- **CUA 模式**:视觉驱动交互(Computer Use Agent),适合复杂 GUI
- **网络观察**:内置 mitmproxy 代理 + 本地抓取
### 交互模式选择
| 模式 | 适合场景 | 底层 |
|------|---------|------|
| UIA | 目标应用有标准 Windows 控件(按钮、文本框、列表) | Windows UI Automation API |
| CUA | 目标应用 UI 复杂或非标准控件(IDA 的反汇编视图、自定义渲染界面) | 视觉识别 + 鼠标键盘 |
### 网络观察模式
| 模式 | 适合场景 |
|------|---------|
| Proxy Lane | 目标应用可以配置代理(推荐) |
| Local Lane | 目标应用无法走代理,需要本地抓取 |
### 安装与配置
```bash
# 1. Clone 项目
git clone https://github.com/zhexulong/openreverse.git
cd openreverse
# 2. 安装依赖
npm install
# 3. 接入 Agent 宿主(Claude Code / Codex / Zed)
npm run init:agents -- --target=all /path/to/project
# 4. 安装 CUA runtime(如果需要视觉驱动模式)
npm run install:cua-runtime
npm run doctor:cua-runtime
# 5. 安装网络观察依赖(如果需要抓包)
npm run install:mitmproxy
npm run doctor:network
```
### 常见组合
| 需求 | 配置 |
|------|------|
| 只操作桌面应用 | UIA 或 CUA,不接网络 lane |
| 操作桌面应用 + 抓包 | UIA/CUA + proxy lane |
| 操作桌面应用 + 本地抓取 | UIA/CUA + local lane |
### 逆向场景示例
```text
场景:自动化操作 IDA Pro 进行批量分析
1. 用 OpenReverse CUA 模式打开 IDA Pro
2. 自动加载目标二进制
3. 等待分析完成
4. 通过 UI 操作导出函数列表
5. 同时用 network lane 观察 IDA 的网络行为(如 Lumina 请求)
```
```text
场景:自动化操作 x64dbg 调试
1. 用 OpenReverse UIA 模式启动 x64dbg
2. 加载目标程序
3. 设置断点
4. 运行并观察寄存器/内存变化
5. 截图保存证据
```
---
## 按需自举(On-Demand Bootstrap)
### 自动化能力边界
| 工具 | 可自动安装 | 安装方式 | 说明 |
|------|-----------|---------|------|
| Playwright | ✓ | npm + npx playwright install | 浏览器自动化引擎 |
| agent-browser CLI | ✓ | npm install -g agent-browser | 浏览器操作 CLI |
| Node.js | ✓ | winget | 前置依赖 |
| OpenReverse | ✗ | 手动 clone + npm install | 实验阶段,依赖较重 |
| mitmproxy | ✗ | 手动安装 | OpenReverse 网络观察依赖 |
### 自举触发
- 浏览器操作缺 Playwright → 自动 bootstrap
- 桌面操作需要 OpenReverse → 引导用户手动安装(给出完整步骤)
### OpenReverse 手动安装引导
如果 AI 检测到需要桌面应用自动化但 OpenReverse 未安装:
```markdown
⚠️ **需要 OpenReverse 进行桌面应用自动化**
**安装步骤**:
1. `git clone https://github.com/zhexulong/openreverse.git`
2. `cd openreverse && npm install`
3. `npm run init:agents -- --target=all <你的项目路径>`
4. 如需视觉模式:`npm run install:cua-runtime`
5. 如需网络观察:`npm run install:mitmproxy`
**验证**:`npm run doctor:cua-runtime` 和 `npm run doctor:network`
```
---
## 路由上下文
**上游入口**: `skills/SKILL.md`(总控)、`routing.md`
**适用场景**: 任何需要自动化操作浏览器或桌面应用的任务
**下游出口**:
- 抓到的请求需要分析 → `anything-analyzer` 或 `js-reverse`
- 需要 JS 调试/Hook → `jshookmcp`
- 需要还原签名算法 → `js-reverse`
- 桌面应用是逆向工具 → `ida-reverse/`
**同级关联模块**: `js-reverse`(浏览器操作后可能需要分析 JS)、`ida-reverse`(OpenReverse 可以自动化操作 IDA GUI)
## 任务完成自检(声称完成前 MUST 通过)
- [ ] 我是否执行了工作流中的每一步(而不是只阅读)?
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?

View File

@@ -0,0 +1,425 @@
# 浏览器与桌面自动化速查
> 覆盖 Playwright(浏览器自动化)和 OpenReverse(Windows 桌面自动化)的常用命令与模式。
> 面向渗透测试、逆向工程、自动化采集场景。
---
## Playwright / agent-browser 命令速查
### 导航与生命周期
```bash
# 打开页面
agent-browser open "https://target.com/login"
# 等待页面加载完成
agent-browser wait --load networkidle
# 关闭浏览器(必须执行,否则进程泄漏)
agent-browser close
```
### 页面快照
```bash
# 完整无障碍树(调试用)
agent-browser snapshot
# 仅可交互元素(推荐,返回 @e1, @e2... 引用)
agent-browser snapshot -i
```
### 元素交互
```bash
# 点击
agent-browser click @e1
# 填写文本框
agent-browser fill @e2 "admin"
# 逐字符输入(适合有 JS 监听的输入框)
agent-browser type @e2 "password123"
# 按键
agent-browser press Enter
agent-browser press Tab
agent-browser press Escape
# 滚动
agent-browser scroll down 500
agent-browser scroll up 300
```
### 信息获取
```bash
# 获取元素文本
agent-browser get text @e1
# 获取页面标题
agent-browser get title
# 获取当前 URL
agent-browser get url
```
### 等待策略
```bash
# 等待元素出现
agent-browser wait @e1
# 等待固定时间(毫秒)
agent-browser wait 2000
# 等待网络空闲
agent-browser wait --load networkidle
# 等待导航完成
agent-browser wait --load domcontentloaded
```
---
## 渗透测试常用模式
### 自动化登录
```bash
agent-browser open "https://target.com/login"
agent-browser snapshot -i
agent-browser fill @username "admin"
agent-browser fill @password "password123"
agent-browser click @login_button
agent-browser wait --load networkidle
agent-browser get url # 确认是否跳转到后台
```
### XSS Payload 注入
```bash
agent-browser open "https://target.com/search"
agent-browser snapshot -i
agent-browser fill @search_input "<script>alert(1)</script>"
agent-browser click @search_button
agent-browser wait --load networkidle
agent-browser snapshot # 检查 payload 是否被渲染
```
### 表单批量提交(配合脚本)
```powershell
$payloads = @("' OR 1=1--", "<img src=x onerror=alert(1)>", "{{7*7}}")
foreach ($p in $payloads) {
agent-browser open "https://target.com/form"
agent-browser snapshot -i
agent-browser fill @input "$p"
agent-browser click @submit
agent-browser wait --load networkidle
agent-browser snapshot # 检查响应
}
agent-browser close
```
### Cookie / LocalStorage 提取
```bash
# 通过 Playwright API(Node.js 脚本模式)
# agent-browser 不直接暴露 cookie,需要用脚本模式
```
```javascript
// playwright-extract.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://target.com');
// 提取 cookies
const cookies = await context.cookies();
console.log(JSON.stringify(cookies, null, 2));
// 提取 localStorage
const storage = await page.evaluate(() => JSON.stringify(localStorage));
console.log(storage);
await browser.close();
})();
```
### 截图取证
```bash
# agent-browser 模式
agent-browser open "https://target.com/admin"
agent-browser wait --load networkidle
# 截图功能取决于 agent-browser 版本
```
```javascript
// playwright 脚本模式
await page.screenshot({ path: 'evidence.png', fullPage: true });
```
---
## Playwright Node.js API 速查
### 基础模板
```javascript
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true, // 无头模式
// proxy: { server: 'http://127.0.0.1:8080' } // 走 Burp 代理
});
const context = await browser.newContext({
ignoreHTTPSErrors: true, // 忽略证书错误
userAgent: 'Mozilla/5.0 ...',
});
const page = await context.newPage();
await page.goto('https://target.com');
// ... 操作 ...
await browser.close();
})();
```
### 常用选择器
```javascript
// CSS 选择器
await page.click('#login-btn');
await page.fill('input[name="username"]', 'admin');
// 文本选择器
await page.click('text=Submit');
await page.click('button:has-text("Login")');
// XPath
await page.click('xpath=//button[@type="submit"]');
// 组合
await page.click('form >> input[type="submit"]');
```
### 网络拦截
```javascript
// 拦截请求
await page.route('**/api/**', route => {
console.log('API call:', route.request().url());
route.continue();
});
// 修改请求
await page.route('**/api/auth', route => {
route.continue({
headers: { ...route.request().headers(), 'X-Admin': 'true' }
});
});
// 拦截响应
await page.route('**/api/user', async route => {
const response = await route.fetch();
const json = await response.json();
json.role = 'admin'; // 篡改响应
route.fulfill({ response, json });
});
```
### 等待与断言
```javascript
// 等待元素
await page.waitForSelector('#result');
await page.waitForSelector('.error', { state: 'visible' });
// 等待网络请求
const [response] = await Promise.all([
page.waitForResponse('**/api/login'),
page.click('#login-btn'),
]);
console.log(response.status(), await response.json());
// 等待导航
await Promise.all([
page.waitForNavigation(),
page.click('a[href="/admin"]'),
]);
```
---
## OpenReverse 桌面自动化速查
### 模式选择
| 模式 | 命令前缀 | 适合场景 |
|------|---------|---------|
| UIA | `openreverse uia ...` | 标准 Windows 控件(按钮、文本框、列表) |
| CUA | `openreverse cua ...` | 复杂/非标准 GUI(IDA 反汇编视图、自定义渲染界面) |
### UIA 模式(结构化控件操作)
```bash
# 启动应用
openreverse uia launch "C:\Tools\x64dbg\x64dbg.exe"
# 获取窗口树
openreverse uia tree
# 点击按钮
openreverse uia click "Button:Open"
# 填写文本框
openreverse uia fill "Edit:FilePath" "C:\sample.exe"
# 选择菜单
openreverse uia menu "File > Open"
# 获取控件文本
openreverse uia get-text "Edit:Output"
```
### CUA 模式(视觉驱动交互)
```bash
# 截图当前屏幕
openreverse cua screenshot
# 点击屏幕坐标
openreverse cua click 500 300
# 双击
openreverse cua dblclick 500 300
# 输入文本
openreverse cua type "search string"
# 按键
openreverse cua key "ctrl+g" # IDA: Go to address
openreverse cua key "F5" # IDA: Decompile
openreverse cua key "F9" # x64dbg: Run
```
### 网络观察(mitmproxy)
```bash
# 启动代理模式观察
openreverse network start --mode proxy --port 8888
# 启动本地抓取模式
openreverse network start --mode local --filter "target.exe"
# 获取捕获的请求
openreverse network list
# 导出为 HAR
openreverse network export har output.har
# 停止观察
openreverse network stop
```
---
## 逆向工具自动化组合
### IDA Pro 自动化(OpenReverse + ida-reverse)
```text
场景:批量分析多个样本
1. openreverse cua launch "ida64.exe"
2. 对每个样本:
a. openreverse cua key "ctrl+o" # 打开文件对话框
b. openreverse uia fill "Edit:FileName" "sample_N.exe"
c. openreverse uia click "Button:Open"
d. 等待分析完成(轮询 IDA 标题栏)
e. 通过 ida-reverse MCP 工具提取结果
f. openreverse cua key "ctrl+w" # 关闭数据库
```
### x64dbg 自动化调试
```text
场景:自动化断点设置与数据采集
1. openreverse uia launch "x64dbg.exe"
2. openreverse cua key "F3" # 打开文件
3. openreverse uia fill "Edit:FileName" "target.exe"
4. openreverse uia click "Button:Open"
5. openreverse cua key "ctrl+g" # Go to address
6. openreverse cua type "0x401000"
7. openreverse cua key "F2" # 设置断点
8. openreverse cua key "F9" # 运行
9. openreverse cua screenshot # 截图保存状态
```
---
## 常见问题与解决
| 问题 | 原因 | 解决 |
|------|------|------|
| agent-browser 无响应 | 进程泄漏 | 先 `agent-browser close`,再重新 open |
| 元素引用失效 | 页面已刷新 | 重新 `snapshot -i` 获取新引用 |
| 填表无效 | JS 监听 input 事件 | 用 `type` 代替 `fill` |
| HTTPS 证书错误 | 自签名证书 | Playwright: `ignoreHTTPSErrors: true` |
| 页面加载超时 | 网络慢/资源多 | 增加 timeout 或用 `domcontentloaded` |
| UIA 找不到控件 | 应用使用自绘控件 | 切换到 CUA 模式 |
| CUA 点击偏移 | 分辨率/DPI 不匹配 | 先 screenshot 确认坐标 |
---
## 安装与依赖
### Playwright
```powershell
# 安装 Node.js(如果没有)
winget install OpenJS.NodeJS.LTS
# 安装 Playwright
npm install -g playwright
npx playwright install # 下载浏览器引擎
# 安装 agent-browser CLI
npm install -g agent-browser
```
### OpenReverse
```powershell
git clone https://github.com/zhexulong/openreverse.git
cd openreverse
npm install
npm run init:agents -- --target=all <项目路径>
# 可选:CUA 运行时
npm run install:cua-runtime
npm run doctor:cua-runtime
# 可选:网络观察
npm run install:mitmproxy
npm run doctor:network
```
---
## 相关资源
| 资源 | 说明 | 链接 |
|------|------|------|
| Playwright 官方文档 | API 参考 | https://playwright.dev/docs/intro |
| OpenReverse | 桌面自动化框架 | https://github.com/zhexulong/openreverse |
| mitmproxy | HTTP/HTTPS 代理 | https://mitmproxy.org/ |
| Windows UI Automation | UIA 文档 | https://learn.microsoft.com/en-us/windows/win32/winauto/entry-uiauto-win32 |

View File

@@ -0,0 +1,120 @@
#requires -Version 5
<#
.SYNOPSIS
Bootstrap script for agent-browser and Playwright.
Installs Node.js (if missing), agent-browser CLI, and Playwright browsers.
#>
[CmdletBinding()]
param(
[switch]$SkipBrowserInstall
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
. (Join-Path $PSScriptRoot '..\..\scripts\lib\ToolDiscovery.ps1')
function Write-Step {
param([string]$Message)
Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] $Message" -ForegroundColor Cyan
}
# Step 1: Ensure Node.js
Write-Step "Checking Node.js..."
$node = Get-Command node -ErrorAction SilentlyContinue
if (-not $node) {
Write-Step "Node.js not found, attempting install via winget..."
$winget = Get-Command winget -ErrorAction SilentlyContinue
if ($winget) {
& winget install --id OpenJS.NodeJS.22 --source winget --accept-package-agreements --accept-source-agreements --disable-interactivity
if ($LASTEXITCODE -ne 0) {
throw "Failed to install Node.js via winget. Install manually: https://nodejs.org/"
}
# Refresh PATH
$env:PATH = [System.Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('PATH', 'User')
}
else {
throw "Node.js not found and winget not available. Install Node.js manually: https://nodejs.org/"
}
}
$nodeVersion = & node -v
Write-Step "Node.js: $nodeVersion"
# Step 2: Ensure npm
$npm = Get-Command npm -ErrorAction SilentlyContinue
if (-not $npm) {
throw "npm not found. Reinstall Node.js: https://nodejs.org/"
}
# Step 3: Install agent-browser globally
Write-Step "Checking agent-browser..."
$agentBrowser = Get-Command agent-browser -ErrorAction SilentlyContinue
if (-not $agentBrowser) {
Write-Step "Installing agent-browser globally..."
& npm install -g agent-browser
if ($LASTEXITCODE -ne 0) {
Write-Warning "agent-browser global install failed. Trying npx fallback..."
}
else {
Write-Step "agent-browser installed."
}
}
else {
Write-Step "agent-browser already available: $($agentBrowser.Source)"
}
# Step 4: Install Playwright and browsers
if (-not $SkipBrowserInstall) {
Write-Step "Installing Playwright browsers (chromium)..."
& npx playwright install chromium
if ($LASTEXITCODE -ne 0) {
Write-Warning "Playwright browser install failed. You may need to run: npx playwright install chromium"
}
else {
Write-Step "Playwright chromium installed."
}
# Record browser location
$playwrightPath = $null
try {
$envBrowsersPath = $env:PLAYWRIGHT_BROWSERS_PATH
if ([string]::IsNullOrWhiteSpace($envBrowsersPath)) {
# Default Playwright browser cache location on Windows
$defaultPath = Join-Path $env:LOCALAPPDATA 'ms-playwright'
if (Test-Path -LiteralPath $defaultPath) {
$playwrightPath = $defaultPath
}
}
else {
$playwrightPath = $envBrowsersPath
}
}
catch {}
if ($playwrightPath) {
Write-Step "Playwright browsers location: $playwrightPath"
"playwright_browsers_path=$playwrightPath"
}
}
# Step 5: Verify
Write-Step "Verification:"
$finalCheck = Get-Command agent-browser -ErrorAction SilentlyContinue
if ($finalCheck) {
"agent-browser=$($finalCheck.Source)"
"status=ready"
}
else {
# Fallback: can still use via npx
$npxCheck = Get-Command npx -ErrorAction SilentlyContinue
if ($npxCheck) {
"agent-browser=npx agent-browser"
"status=ready-via-npx"
}
else {
"status=failed"
throw "agent-browser installation failed. Install manually: npm install -g agent-browser"
}
}