有没有办法从我的Windows OpenGL应用程序检测是否正在使用调试器(如gDEBugger)来捕获OpenGL调用?如果找到调试器,我希望能够检测到并终止我的应用程序,以避免破坏着色器代码和纹理。该应用程序是在C ++ Builder 6中开发的。
答案 0 :(得分:8)
即使你能找到一种方法,这也是徒劳的尝试,因为可以随时通过简单地调用glGetShaderSource()
来询问着色器源。
外部流程可以使用CreateRemoteThread()
将流程注入流程,然后使用ReadProcessMemory()
复制结果。通过microsoft的detours库,这个过程非常简单(只需几行)。
或者,如果创建一个远程线程太麻烦了,可以使用像Ollydgb这样的反汇编程序将一段代码注入到正常执行路径中,该路径只是将着色器代码保存到文件之前。调用
最后,在激活它之前,着色器的文本需要位于可执行文件的某个位置,并且可以通过使用IDAPro之类的工具对可执行文件进行静态检查来提取它。如果加密或压缩它或其他任何东西都没关系,如果它在某个时刻存在并且程序可以提取它,那么就可以确定足够的裂缝。你永远不会赢。
答案 1 :(得分:1)
总的来说,没有办法检测每一个这样的“调试器”。始终可以编写自定义OpenGL32.dll(或平台的等效文件);如果没有其他办法,可以专门设计虚拟图形卡以便翻录纹理。
但是,Graphic Remedy确实有一些用于调试的API作为自定义OpenGL命令提供。它们作为OpenGL扩展提供;所以,如果GetProcAddress()
在这些函数调用上返回NULL
,你可以合理地确定它不是gDEBugger。但是,已经有几个调试器,并且如前所述,编写一个专门用于剥离资源的调试器是微不足道的。
也许最接近你可以直接加载C:\ windows \ system32 \ opengl32.dll,但是这可能会在未来的Windows版本中破坏你的游戏,所以我建议反对它。 (这仍然无法保护您免受那些足以取代系统范围的OpenGL32.dll或者可能正在使用其他操作系统的人的攻击。)
答案 2 :(得分:-1)
我不是百分百肯定,但我相信Graphic Remedy用他们自己的opengl32.dll文件替换Windows opengl32 dll以挂接gl调用。
因此,如果是这种情况,您只需检查dll版本并终止,如果它不符合您的预期。