Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测是否正在使用OpenGL调试器?_Opengl_Debugging - Fatal编程技术网

如何检测是否正在使用OpenGL调试器?

如何检测是否正在使用OpenGL调试器?,opengl,debugging,Opengl,Debugging,是否有任何方法可以从我的Windows OpenGL应用程序中检测是否使用了调试器(如gDEBugger)来捕获OpenGL调用?我希望能够检测到这一点,并在找到调试器时终止我的应用程序,以避免着色器代码和纹理被破坏。该应用程序是在C++ Builder 6开发的。p> 即使您可以找到一种方法来实现这一点,但这将是徒劳的尝试,因为只需随时调用着色器源即可获得着色器源 外部进程可以使用CreateRemoteThread()将线程注入进程,然后使用ReadProcessMemory()复制回结果。

是否有任何方法可以从我的Windows OpenGL应用程序中检测是否使用了调试器(如gDEBugger)来捕获OpenGL调用?我希望能够检测到这一点,并在找到调试器时终止我的应用程序,以避免着色器代码和纹理被破坏。该应用程序是在C++ Builder 6开发的。p> 即使您可以找到一种方法来实现这一点,但这将是徒劳的尝试,因为只需随时调用着色器源即可获得着色器源

外部进程可以使用
CreateRemoteThread()
将线程注入进程,然后使用
ReadProcessMemory()
复制回结果。这个过程可以通过microsoft的库变得非常简单(只需几行)

或者,如果创建远程线程太麻烦,可以使用Ollydgb之类的反汇编程序将一段代码注入到正常执行路径中,该路径只需在调用着色器代码之前将其保存到文件中


最后,着色器的文本需要在激活它之前位于可执行文件中的某个位置,并且可能仅通过使用IDAPro之类的工具对可执行文件进行静态检查就可以提取该文本。不管你是加密还是压缩它,如果它在某个时刻存在,程序可以提取它,那么一个有决心的黑客也可以。你永远不会赢。

即使你能找到这样做的方法,这也将是徒劳的尝试,因为只需随时调用着色器源即可获得着色器源

外部进程可以使用
CreateRemoteThread()
将线程注入进程,然后使用
ReadProcessMemory()
复制回结果。这个过程可以通过microsoft的库变得非常简单(只需几行)

或者,如果创建远程线程太麻烦,可以使用Ollydgb之类的反汇编程序将一段代码注入到正常执行路径中,该路径只需在调用着色器代码之前将其保存到文件中


最后,着色器的文本需要在激活它之前位于可执行文件中的某个位置,并且可能仅通过使用IDAPro之类的工具对可执行文件进行静态检查就可以提取该文本。不管你是加密还是压缩它,如果它在某个时刻存在,程序可以提取它,那么一个有决心的黑客也可以。你永远不会赢。

我不是100%肯定,但我相信图形修复会用自己的opengl32.dll文件替换Windows opengl32 dll,用于挂接gl调用


因此,如果是这种情况,您只需检查dll版本,如果不是您所期望的,则终止。

我不是100%确定,但我相信图形修复会用自己的opengl32.dll文件替换Windows opengl32 dll,以便挂接gl调用


因此,如果是这种情况,您只需检查dll版本,如果不是预期的版本,则终止该版本。

总体而言,无法检测每一个此类“调试器”。始终可以编写自定义OpenGL32.dll(或平台的等效文件);如果没有其他方法,可以专门设计一个虚拟图形卡来剥离纹理

然而,Graphic Remedy确实有一些API作为自定义OpenGL命令提供用于调试。它们作为OpenGL扩展提供;因此,如果
GetProcAddress()
在这些函数调用中返回
NULL
,您可以合理地确定它不是gDEBugger。然而,已经有好几个调试器了,而且,正如前面提到的,编写一个专门为剥离资源而设计的调试器是很简单的


也许你能得到的最接近的是直接加载C:\windows\system32\opengl32.dll,但是这会在windows的未来版本中严重破坏你的游戏,所以我建议不要这样做。(这仍然无法保护您免受那些敢于替换系统级OpenGL32.dll的人,或者可能正在使用其他操作系统的人的攻击)。

总的来说,无法检测每一个这样的“调试器”。始终可以编写自定义OpenGL32.dll(或平台的等效文件);如果没有其他方法,可以专门设计一个虚拟图形卡来剥离纹理

然而,Graphic Remedy确实有一些API作为自定义OpenGL命令提供用于调试。它们作为OpenGL扩展提供;因此,如果
GetProcAddress()
在这些函数调用中返回
NULL
,您可以合理地确定它不是gDEBugger。然而,已经有好几个调试器了,而且,正如前面提到的,编写一个专门为剥离资源而设计的调试器是很简单的


也许你能得到的最接近的是直接加载C:\windows\system32\opengl32.dll,但是这会在windows的未来版本中严重破坏你的游戏,所以我建议不要这样做。(这仍然不能保护您免受那些有足够的进取心来取代系统级OpenGL32.dll的人,或者可能正在使用其他操作系统的人的伤害)。

我同意。如果有人想得到着色器和纹理,而他们有这个软件,你是无法阻止他们的。我提到的所有软件都是免费的。我同意。如果有人想要得到着色器和纹理,而他们有这个软件,你是无法阻止他们的。我提到的所有软件都是免费的。