Red Alert 2游戏在Windows 8上运行,但是一旦我注入DLL(通过ddraw.dll或其他DLL),它就会停止在主菜单上绘制按钮。有了DLL,它在窗口模式下仍然可以正常工作,并且在Windows 7上仍然可以正常工作。
DLL基本上只是
对于被DLL禁用的原始游戏,会激活一种自动兼容模式,但是如何找出导致这种情况的原因?
这很重要,因为DLL为游戏玩家提供了改进,这些改进也应在Windows 8上提供(及更多)。

评论

您是否总是注入相同的DLL?如果注入完全不同的DLL,是否会发生相同的事情?

可能是system32 / ddraw.dll在Windows 8上位于其他位置吗?这可能是您注入导致此问题的dll的方式。

这也可能是您注入导致此问题的dll的方式。我发现在注入dll文件时,总是最好在使用OpenProcess之前使用AdjustTokenPrivileges设置调试权限。也有时将dll分配到目标堆中根本不起作用,因为WriteProcessMemory受保护,但是再次分配dll的路径也可以。最后,请尝试使用CreateRemoteThread方法。检查挂钩的kernel32.dll LoadLibraryA在加载dll文件时是否正确运行。

也许使用另一种方法注入不需要DLL劫持的DLL?另外,在DLL的main函数中执行直接绘制代码也可能引起麻烦。也许创建一个线程并在那里做?

如果使用填充片使游戏正常运行,则可能是因为您选择了SxS中所述DLL的其他版本或您不知道发生了某些修补。有一些工具可以调查所应用的垫片,这应该为您提供了一个在哪里看的线索...

#1 楼



查看是否应用了兼容性SHIM的最简单方法是检查进程的进程环境块(PEB)并检查__COMPAT_LAYER环境变量(如果已设置)。如果设置,它将应用以空格分隔的SHIM名称。您可以使用诸如Process Explorer,Process Hacker之类的工具在运行时右键单击EXE,选择“ Properties”并检查“ Environment”选项卡。当附加到进程时,还可以使用WinDbg和!peb命令找到此文件。 ,它是Windows ADK的一部分,使用Compatibility Administrator,您可以查看/创建SHIM。对于32位进程,此工具位于“ C:\ Program Files(x86)\ Windows Kits \ 10 \ Asssment and Deployment Kit \ Application Compatibility Toolkit \ Compatibility Administrator(32-bit)\ Compatadmin.exe”和“ C: \ Program Files(x86)\ Windows Kits \ 10 \ Asssment and Deployment Kit \ Application Compatibility Toolkit \ Compatibility Administrator(64-bit)\ Compatadmin.exe“,用于64位进程。




您可以自己通过Microsoft应用程序兼容性数据库开发人员说明中引用的API来自动查询应用程序兼容性数据库,或使用此开源应用程序Sdb2Xml。数据库中的查询将帮助您确定原因。这些数据库位于C:\ Windows \ apppatch和C:\ Windows \ apppatch \ CustomSDB中,并具有SDB文件扩展名。如果您可以重命名EXE或更改EXE上的版本信息,以便它在数据库中不匹配,则会阻止它获取SHIM。您还可以尝试连接到较低级别的API(有时未记录),以确保您不会被SHIM覆盖,尽管这需要一个较低级别的了解。


根据应用程序的反调试技术,这可能不起作用,但是我已经能够使用WinDbg的“时间旅行调试”功能解决复杂的挂钩问题。