name: 图形API钩子 description: 用于DirectX、OpenGL和Vulkan的图形API钩子和渲染技术指南。使用此技能时,涉及图形钩子、覆盖渲染、着色器操作或游戏渲染管道分析。
图形API钩子与渲染
概述
本技能涵盖来自awesome-game-security集合的图形API资源,包括DirectX、OpenGL和Vulkan的钩子技术、覆盖渲染和图形调试。
DirectX
DirectX 9
// 关键函数钩子
IDirect3DDevice9::EndScene
IDirect3DDevice9::Reset
IDirect3DDevice9::Present
DirectX 11
// 关键函数钩子
IDXGISwapChain::Present
ID3D11DeviceContext::DrawIndexed
ID3D11DeviceContext::Draw
DirectX 12
// 关键函数钩子
IDXGISwapChain::Present
ID3D12CommandQueue::ExecuteCommandLists
VTable钩子
// DX11示例
typedef HRESULT(__stdcall* Present)(IDXGISwapChain*, UINT, UINT);
Present oPresent;
HRESULT __stdcall hkPresent(IDXGISwapChain* swapChain, UINT syncInterval, UINT flags) {
// 在此渲染覆盖
return oPresent(swapChain, syncInterval, flags);
}
// 通过vtable钩子
void* swapChainVtable = *(void**)swapChain;
oPresent = (Present)swapChainVtable[8]; // Present是索引8
OpenGL
关键函数
wglSwapBuffers
glDrawElements
glDrawArrays
glBegin/glEnd (legacy)
钩子示例
typedef BOOL(WINAPI* wglSwapBuffers_t)(HDC);
wglSwapBuffers_t owglSwapBuffers;
BOOL WINAPI hkwglSwapBuffers(HDC hdc) {
// 渲染覆盖
return owglSwapBuffers(hdc);
}
Vulkan
关键函数
vkQueuePresentKHR
vkCreateSwapchainKHR
vkCmdDraw
vkCmdDrawIndexed
实例/设备层
- 使用验证层进行调试
- 自定义层用于拦截
- 层清单配置
通用钩子库
Kiero
- 跨API钩子库
- 支持DX9/10/11/12、OpenGL、Vulkan
- 自动方法检测
通用ImGui钩子
- 预构建的ImGui集成
- 多API支持
- 易于部署
ImGui集成
设置(DX11)
// 在Present钩子中
ImGui_ImplDX11_Init(device, context);
ImGui_ImplWin32_Init(hwnd);
// 渲染
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
// 您的渲染代码
ImGui::Begin("覆盖");
// ...
ImGui::End();
ImGui::Render();
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
窗口过程钩子
// ImGui输入所需
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
return CallWindowProc(oWndProc, hWnd, msg, wParam, lParam);
}
覆盖技术
外部覆盖
1. 创建透明窗口
2. 设置 WS_EX_LAYERED | WS_EX_TRANSPARENT
3. 使用 SetLayeredWindowAttributes
4. 使用 GDI+/D2D 渲染
5. 定位在游戏窗口上
DWM覆盖
- 钩子桌面窗口管理器
- 在DWM组合中渲染
- 更高权限要求
- 更好的反检测
Steam覆盖劫持
- 钩子Steam的覆盖函数
- 使用现有覆盖基础设施
- 需要Steam运行
NVIDIA覆盖劫持
- 钩子GeForce Experience覆盖
- 原生外观的覆盖
- 可能需要特定驱动
着色器操作
透视实现
// 禁用深度测试
OMSetDepthStencilState(depthDisabledState, 0);
// 或在像素着色器中
float4 PSMain(VS_OUTPUT input) : SV_Target {
// 始终通过深度测试
return float4(1, 0, 0, 0.5); // 红色透明
}
角色高亮(Chams)
// 替换模型着色器
float4 PSChams(VS_OUTPUT input) : SV_Target {
if (isEnemy) {
return float4(1, 0, 0, 1); // 红色
}
return float4(0, 1, 0, 1); // 绿色
}
渲染概念
世界到屏幕
D3DXVECTOR3 WorldToScreen(D3DXVECTOR3 pos, D3DXMATRIX viewProjection) {
D3DXVECTOR4 clipCoords;
D3DXVec3Transform(&clipCoords, &pos, &viewProjection);
if (clipCoords.w < 0.1f) return invalid;
D3DXVECTOR3 NDC;
NDC.x = clipCoords.x / clipCoords.w;
NDC.y = clipCoords.y / clipCoords.w;
D3DXVECTOR3 screen;
screen.x = (viewport.Width / 2) * (NDC.x + 1);
screen.y = (viewport.Height / 2) * (1 - NDC.y);
return screen;
}
视图矩阵提取
- 从设备常量
- 模式扫描
- 引擎特定位置
- 逆向工程地址
调试工具
PIX for Windows
- 帧捕获和分析
- GPU性能分析
- 着色器调试
RenderDoc
- 开源帧调试器
- 多API支持
- 资源检查
NVIDIA Nsight
- 性能分析
- 着色器调试
- 帧性能分析
反检测考虑
Present钩子检测
- VTable完整性检查
- 代码段验证
- 调用栈分析
规避技术
- 跳板钩子
- 硬件断点
- 时间混淆
性能优化
最佳实践
1. 最小化状态变化
2. 批处理绘制调用
3. 使用实例化
4. 缓存资源
5. 定期性能分析
常见问题
- 闪烁:双缓冲同步
- 伪影:正确清除状态
- 性能:减少过度绘制
资源组织
README包含:
- DirectX 9/11/12钩子实现
- OpenGL钩子库
- Vulkan拦截工具
- ImGui集成示例
- 覆盖框架
- 着色器修改工具
数据源
重要:本技能提供概念指导和概述信息。详细信息包括:
- 特定GitHub仓库链接
- 完整项目列表及描述
- 最新工具和资源
- 代码示例和实现
请从主仓库获取完整数据:
https://raw.githubusercontent.com/gmh5225/awesome-game-security/refs/heads/main/README.md
主README包含数千个按类别组织的精选链接。当用户请求特定工具、项目或实现时,从此源检索并引用相应部分。