调试一个 Windows 程序,我以前的做法是开一堆命令行脚本:找进程的脚本一个,注入的脚本一个,读内存又是另一个。每换一个目标进程就要改一遍参数,改到后来记不清上次注的是哪个。
所以我写了个工具,把这条链路收进一个界面里。
SuperInject 只跑在 Windows 上,pywebview 写的界面,MIT 协议。
完整的一条链路
找进程、注入、读内存、改内存、冻结、卸载、结束进程,这些都在一个窗口里。
进程列表可以按名字、PID 或者进程路径搜,能多选批量处理,也可以直接粘 PID。x64 和 x86 的 DLL 都内置了,按目标进程的位数自动挑,不用手动指定。
注入前会逐个 PID 预检:进程还在不在、位数对不对、能不能打开、是不是系统关键进程、是不是已经注入过了。
注入成功不只看 LoadLibraryW 返回非零——那只能证明模块进了目标进程。SuperInject 会一直等注入的 DLL 主动连回控制通道,连上了才算成功。
已经注入过的进程再次注入,会自动先卸载旧 DLL,等通道断干净,再注入新的。
内存
搜索支持十六进制模式,4D 5A ?? ?? 这种带通配的也行,可以一次在多个进程里扫。
查看和写入按地址来。遇到代码段或者只读页,会临时改页属性,写完再改回去,所以改代码也是可以的。
内存快照和 diff 是我觉得最省时间的一块。按 4KB 分页算 SHA-256,再存前 64 字节,落到本地 json 文件里。拍两次快照对比,页级 SHA 直接定位到变了哪几页,然后两栏 hex 对比,改了一个字节也能看出来,不会被几 MB 的无关差异淹掉。
硬件断点
DR0 到 DR3 四个槽位的线程级硬件断点,DR7 控制读写、长度和启用。槽位用完了自动降到 VEH 模拟,INT3 打补丁加上单步重写。
命中时会带上完整的寄存器状态——x64 那边是 RIP、RSP、RBP、RFLAGS、RAX 到 RDI、R8 到 R15,还有 CS 和 SS;x86 是对应的 EIP、ESP、EBP、EFLAGS、EAX 到 EDI。栈快照带前 16 项。
让 AI agent 来用
v1.3.0 加了 MCP server。SuperInject.exe mcp 起一个 stdio JSON-RPC 服务,把 31 个调试能力暴露给 Claude Desktop、Cursor 这类工具。
授权是会话制的。启动的时候弹窗确认 PID 白名单、进程名通配符、能力分档和有效期。没授权的工具在 tools/list 里根本不会出现,硬调也只回 consent_denied,不会落到控制器。
界面上有个授权面板,能看到当前状态,能授权、能撤销、能复制一份配置给外部工具用。
另外 Agent 端可以走一个不需要管理员权限的 launcher,配置里指到 SuperInject.exe mcp-launcher,全程不弹 UAC。配置可以直接写进 Claude Desktop 或 Cursor,写之前会备份原文件,只改 mcpServers.superinject 这一个键,别的条目原样保留。内容一样就返回 unchanged 不动文件,JSON 坏了直接报错不碰原文件。只在你点了确认之后才写。
其它
冻结进程走 NtSuspendProcess,挂起全部线程,目标完全无响应。恢复的时候会核实线程真实的挂起状态。
崩溃转储:目标进程碰到 ACCESS_VIOLATION、STACK_OVERFLOW、ILLEGAL_INSTRUCTION、DIVIDE_BY_ZERO、PRIV_INSTRUCTION、GUARD_PAGE、INVALID_HANDLE 这些情况,DLL 会自动写一份 dump 加一个 json 元数据,控制器扫到新文件就推事件。
资源查看能把目标进程内存里的图片、音频、视频直接提取出来在界面里预览。PE 资源那几种会补文件头转成 BMP、ICO、CUR。
代码 patch 走 trampoline:在目标地址写 5 字节 E9 rel32 跳到新分配的 RWX trampoline,shellcode 末尾再跳回原地址加 5。能列出所有 patch、单个回滚、全部清除,每个进程上限 32 个。
打包出来是单个 SuperInject.exe,DLL 和前端资源都嵌进去了,没有 _internal 文件夹。
用之前得知道
这是调试工具。只用在你自己的程序,或者你拿到了明确授权的程序上。
不要拿它去绕过软件的授权或者保护机制,也不要用在没授权的第三方进程上。在多数地方,未经授权往第三方进程注入代码是违法的,后果自己担。
最后
v1.3.0 那次更新里有个细节我记了一下:之前只释放 x64 的 DLL,导致第一次跨位数注入时报「x86 DLL 未内嵌也未编译」,资源提取、内存快照、查看修改全被这道闸门挡住。现在 exe 启动时把两份 DLL 都校验并写到磁盘。
SuperInject 已经归档,不会再维护。代码和 release 都还在,GitHub 页面顶上的黄色横幅就是这个意思。想接着用的话从 Releases 下就行。
代码在仓库里:SuperInject
用的时候有问题,或者想要什么功能,说一声。