- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 3d 桌面游戏中绘制自定义 opengl 叠加层(例如 steam 就是这样做的)。这个覆盖图基本上应该能够显示用户需要的一些变量的状态可以通过按一些键来影响。把它想象成一个游戏教练。目标首先是在屏幕上的特定点绘制一些图元。后来我想在游戏窗口中有一个看起来不错的“gui”组件。游戏使用 GDI32.dll 中的“SwapBuffers”方法。目前我能够将自定义 DLL 文件注入(inject)游戏并 Hook “SwapBuffers”方法。我的第一个想法是将覆盖图插入到该函数中。这可以通过将游戏的 3d 绘图模式切换为 2d 来完成,然后在屏幕上绘制 2d 叠加层并再次切换回来,如下所示:
//SwapBuffers_HOOK (HDC)
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0.0, 640, 480, 0.0, 1.0, -1.0);
//"OVERLAY"
glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2f(0, 0);
glVertex2f(0.5f, 0);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.0f, 0.5f);
glEnd();
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
SwapBuffers_OLD(HDC);
但是,这对游戏没有任何影响。
任何类似的提示、源代码或教程也很受欢迎。顺便说一下,这款游戏是反恐精英 1.6,我不打算在线作弊。
谢谢。
编辑:
我可以通过使用“derHass”提议的新 opengl 上下文设法在游戏窗口中绘制一个简单的矩形。这是我所做的:
//1. At the beginning of the hooked gdiSwapBuffers(HDC hdc) method save the old context
GLboolean gdiSwapBuffersHOOKED(HDC hdc) {
HGLRC oldContext = wglGetCurrentContext();
//2. If the new context has not been already created - create it
//(we need the "hdc" parameter for the current window, so the initialition
//process is happening in this method - anyone has a better solution?)
//Then set the new context to the current one.
if (!contextCreated) {
thisContext = wglCreateContext(hdc);
wglMakeCurrent(hdc, thisContext);
initContext();
}
else {
wglMakeCurrent(hdc, thisContext);
}
//Draw the quad in the new context and switch back to the old one.
drawContext();
wglMakeCurrent(hdc, oldContext);
return gdiSwapBuffersOLD(hdc);
}
GLvoid drawContext() {
glColor3f(1.0f, 0, 0);
glBegin(GL_QUADS);
glVertex2f(0,190.0f);
glVertex2f(100.0f, 190.0f);
glVertex2f(100.0f,290.0f);
glVertex2f(0, 290.0f);
glEnd();
}
GLvoid initContext() {
contextCreated = true;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 640, 480, 0.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0, 0, 0, 1.0);
}
结果如下: cs overlay example它仍然非常简单,但我会尝试向其中添加更多细节、文本等。
谢谢。
最佳答案
如果游戏使用的是 OpenGL,那么原则上挂接到 SwapBuffers
是可行的方法。理论上,可能有几个不同的可绘制对象,您可能必须在交换缓冲区函数中决定哪些是正确的修改对象。
不过,这种 OpenGL 拦截有几个问题:
OpenGL 是一个状态机。应用程序可能已经修改了现有的任何 GL 状态变量。您提供的代码远未完成,无法保证绘制某些内容。例如,如果应用程序碰巧启用了着色器,则所有矩阵设置可能都没有效果,屏幕上真正显示的内容取决于着色器。如果开启了深度测试,您的片段可能位于已绘制的内容后面。如果启用了多边形剔除,则您的图元可能会针对当前剔除模式错误缠绕。如果颜色 mask 设置为 GL_FALSE
或绘图缓冲区未设置为您期望的位置,则不会显示任何内容。
另请注意,您“重置”矩阵的尝试也是错误的。您似乎假设当前矩阵模式是 GL_MODELVIEW
。但这不一定是这种情况。它也可以是 GL_PROJECTION
或 GL_TEXTURE
。您还可以将 glOrtho
应用于当前投影矩阵,而无需先加载恒等式,因此仅此一项就是屏幕上不显示任何内容的充分理由。
由于 OpenGL 是一个状态机,您还必须恢复您所触及的所有状态。您已经使用矩阵堆栈压入/弹出尝试过此操作。但是,例如,您未能恢复精确的矩阵模式。正如您在 1 中看到的,将需要更多的状态更改,因此恢复它会更复杂。由于您使用旧版 OpenGL,glPushAttrib()
在这里可能会派上用场。
SwapBuffers
不是 GL 函数,而是操作系统的 API 之一。它获取一个可绘制对象作为参数,并且仅间接引用任何 GL 上下文。 它可能会在另一个 GL 上下文绑定(bind)到线程时被调用,或者根本没有。如果你想安全地玩它,你还必须拦截 GL 上下文创建函数以及设为电流
。在最坏的(尽管不太可能)情况下,应用程序在调用 SwapBuffers
时将 GL 上下文绑定(bind)到另一个线程,因此您无需更改 Hook 函数即可获取上下文.
将这些放在一起打开了另一种选择:您可以创建自己的 GL 上下文,在 Hook 的 SwapBuffers
调用期间临时绑定(bind)它,然后再次恢复原始绑定(bind)。这样,您根本不会干扰应用程序的 GL 状态。您仍然可以增加应用程序呈现的图像内容,因为帧缓冲区是可绘制对象的一部分,而不是 GL 上下文。这样做可能会对性能产生负面影响,但影响可能很小,您甚至都不会注意到。
由于您只想对单个特定应用程序执行此操作,另一种方法是通过观察应用程序在 SwapBuffers 调用期间实际设置的 GL 状态来找出所需的最小状态更改。类似 apitrace 的工具可以帮助您。
关于c++ - dll 注入(inject) : drawing simple game overlay with opengl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34406076/
我正在尝试测试依赖于其他服务 authService 的服务 documentViewer angular .module('someModule') .service('docu
如果我的网站上线(不要认为它会,目前它只是一个学习练习)。 我一直在使用 mysql_real_escape_string();来自 POST、SERVER 和 GET 的数据。另外,我一直在使用 i
我有以下代码,它容易受到 SQL 注入(inject)的攻击(我认为?): $IDquery = mysqli_query($connection, "SELECT `ID` FROM users W
我一直在自学如何创建扩展,以期将它们用于 CSS 注入(inject)(以及最终以 CSS 为载体的 SVG 注入(inject),但那是以后的问题)。 这是我当前的代码: list .json {
这个简单的代码应该通过 Java Spring 实现一个简单的工厂。然而结果是空指针,因为 Human 对象没有被注入(inject)对象(所以它保持空)。 我做错了什么? 谢谢 配置 @Config
我正在编写一个 ASP.NET MVC4 应用程序,它最终会动态构建一个 SQL SELECT 语句,以便稍后存储和执行。动态 SQL 的结构由用户配置以用户友好的方式确定,具有标准复选框、下拉列表和
首先让我说我是我为确保 SQL 注入(inject)攻击失败而采取的措施的知己。所有 SQL 查询值都是通过事件记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如
这是 SQL 映射声称可注入(inject)的负载: user=-5305' UNION ALL SELECT NULL,CONCAT(0x716b6b7071,0x4f5577454f76734
我正在使用 Kotlin 和 Android 架构组件(ViewModel、LiveData)构建一个新的 Android 应用程序的架构,并且我还使用 Koin 作为我的依赖注入(inject)提供
假设 RequestScope 处于 Activity 状态(使用 cdi-unit 的 @InRequestScope) 给定 package at.joma.stackoverflow.cdi;
我有一个搜索表单,可以在不同的提供商中搜索。 我从拥有一个基本 Controller 开始 public SearchController : Controller { protected r
SQLite 注入 如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
使用 NInject 解析具有多个构造函数的类似乎不起作用。 public class Class1 : IClass { public Class1(int param) {...} public
我有一个 MetaManager 类: @Injectable() export class MetaManager{ constructor(private handlers:Handler
我是 Angular 的新手,我不太清楚依赖注入(inject)是如何工作的。我的问题是我有依赖于服务 B 的服务 A,但是当我将服务 A 注入(inject)我的测试服务 B 时,服务 B 变得未定
我正在为我的项目使用 android 应用程序启动、刀柄和空间。我在尝试排队工作时遇到错误: com.test E/WM-WorkerFactory: Could not instantiate co
我不确定这是什么糖语法,但让我向您展示问题所在。 def factors num (1..num).select {|n| num % n == 0} end def mutual_factors
简单的问题,我已经看过这个了:Managing imports in Scalaz7 ,但我不知道如何最小化注入(inject) right和 left方法到我的对象中以构造 \/ 的实例. 我确实尝
在我的 Aurelia SPA 中,我有一些我想在不同模块中使用的功能。它依赖于调用时给出的参数和单例的参数。有没有办法创建一个导出函数,我可以将我的 Auth 单例注入(inject)其中,而不必在
我是一名优秀的程序员,十分优秀!