一、前言
如今传统 PC 外挂的主流绘制方式仍是两类:内部注入 Hook 图形 API,以及外部 Overlay 窗口调用图形 API。这两类本质上都绕不开图形 API。本文分享单机环境下一种比较取巧的方式:它不注入、不调用图形 API,只靠 User32 摆窗口,让窗口本身当方框。
二、具体实现
Windows 里一个窗口的诞生大致三步:RegisterClassEx 注册窗口类,CreateWindowEx 创建窗口实例,消息循环负责分发窗口消息。这套流程任何 Win32 资料里都有,本文不展开。本文只关心其中两件事:CreateWindowEx 的扩展样式怎么选,才能让窗口不抢焦点、不抢输入、不碰像素;以及窗口创建后,怎么让它跟随目标。
std::wstring className = L"BoxClass";
WNDCLASSEXW wc = { sizeof(wc) };
wc.lpfnWndProc = WindowProc;
wc.lpszClassName = className.c_str();
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); // 红色
RegisterClassExW(&wc);
HWND hBox = CreateWindowExW(
WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
className.c_str(), L"",
WS_POPUP,
0, 0, 0, 0,
nullptr, nullptr, nullptr, nullptr);
SetLayeredWindowAttributes(hBox, 0, 64, LWA_ALPHA); // 让窗口半透明上述代码会创建出一个宽高为0、背景为红色且半透明的矩形窗口,先介绍一下每个样式:
WS_EX_LAYERED:实现窗口半透明,没有它SetLayeredWindowAttributes无法生效,主要为了不遮挡背后内容
WS_EX_TRANSPARENT:实现鼠标穿透,依赖WS_EX_LAYERED,主要为了让窗口不抢焦点和输入
WS_EX_TOPMOST:实现窗口置顶
WS_EX_TOOLWINDOW:让窗口不出现在任务栏和Alt+Tab中
WS_POPUP:去掉窗口标题栏和边框,实现纯矩形的窗口
之后通过 SetWindowPos 把窗口移动到目标位置
SetWindowPos(hBox, nullptr, x, y, w, h, nullptr);
x, y 是目标在屏幕上的左上角坐标,w, h 是矩形窗口的宽高。
目前窗口移动到了目标位置,但目前不可见,还需调用ShowWindow展示出窗口
ShowWindow(hBox, SW_SHOW);
人物死了要隐藏,也可通过ShowWindow
ShowWindow(hBox, SW_HIDE);
三、缺点
不可否认,WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_TOOLWINDOW
这个组合是很标准的外部 Overlay 窗口特征。反作弊枚举所有窗口、检查扩展样式组合,就能筛出一批可疑窗口
另一个限制是窗口数量。一个窗口对应一个目标,多目标需要多窗口。实测超过 25 个窗口就可能出现卡顿,这决定了它只适合 5v5 这类少目标场景,且绘制效果单一,只有一个方框
四、声明
以上仅用于技术分享学习,禁止用于非法用途!
[招生]科锐逆向工程师培训(2026年11月13日实地,远程教学同时开班, 第57期)
最后于 2小时前
被mb_gfvnetwy编辑
,原因: