红色警戒 2 Windows 8 DirectDraw 兼容性

逆向工程 视窗 C++ dll注入 视窗-8
2021-06-29 07:35:34

游戏 Red Alert 2 在 Windows 8 上运行,但是一旦我注入 DLL(通过 ddraw.dll 或额外的 DLL),它就会停止在主菜单上绘制按钮。使用 DLL,它在窗口模式下仍然可以正常工作,并且在 Windows 7 上仍然可以正常工作。 DLL 基本上只是

typedef HRESULT(WINAPI* LPDIRECTDRAWCREATE)(GUID*, LPDIRECTDRAW*, IUnknown*);
HMODULE dd_dll = LoadLibrary("system32/ddraw.dll");
LPDIRECTDRAWCREATE dd_create = reinterpret_cast<LPDIRECTDRAWCREATE>(GetProcAddress(dd_dll, "DirectDrawCreate"));
return dd_create(lpGUID, lplpDD, pUnkOuter);

我猜为被 DLL 禁用的原始游戏激活了某种自动兼容模式,但我如何找出导致这种情况的原因?这很重要,因为 DLL 为游戏玩家提供了改进,这些改进也应该在 Windows 8(及更高版本)上可用。

1个回答
  1. 查看是否应用了兼容性 SHIM 的最简单方法是检查进程的进程环境块 (PEB) 并检查 __COMPAT_LAYER 环境变量是否已设置。如果已设置,它将应用空格分隔的 SHIM 名称。您可以使用诸如Process Explorer 之类的工具来完成此操作Process Hacker在运行时右键单击 EXE,选择属性并检查环境选项卡。当附加到进程时,您还可以使用带有!peb命令的WinDbg找到它

  2. 您可以使用应用程序兼容性工具包查看兼容性数据库以及创建/测试您自己的 SHIM 设置,该工具包是Windows ADK 的一部分,您可以使用兼容性管理器查看/创建 SHIM。对于 32 位进程和“C: \Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Application Compatibility Toolkit\Compatibility Administrator(64 位)\Compatadmin.exe”用于 64 位进程。

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

  2. 根据应用程序的反调试技术,这可能不起作用,但我已经能够使用WinDbgTime Travel Debugging 功能解决复杂的挂钩问题