Delphi 最新版本使用各种系统 dll 的静态链接(例如 WinApi.Windows 单元中的 version.dll)。 这会导致在单元初始化之前加载 version.dll。 这会打开一个安全漏洞,可以通过将受感染的 version.dll 放在应用程序旁边来利用该漏洞。
我可以通过安全预加载 version.dll 来弥补这个漏洞。 问题是 - 我没有看到任何 Delphi 本机方法可以在静态链接加载之前进行预加载。
更新 2022-09-06:我的目标是避免从我的证书签名的应用程序中执行非我的代码。
更新2022-09-07:我刚刚发现我的问题实际上是这个问题
的重复要关闭静态加载端 DLL 安全漏洞,您可以使用 Windows 提供的并行程序集加载,使用清单文件 (https://learn.microsoft.com/en-us/dotnet/standard/ assembly/manifest) 在 Delphi 中,您可以指定一个自定义清单文件,链接器会将其嵌入到 exe 中。
在可执行文件旁边创建一个名为 .manifest 的文件。此清单将包含基本的配置详细信息。
在清单的 部分中,介绍:
<file name="version.dll" loadFrom="%SystemRoot%\system32\" />
此指令明确通知 Windows 仅从受信任的系统目录加载 version.dll。
此操作将程序集清单嵌入到可执行文件中,确保在运行时遵循其指导。
构建您的 Delphi 应用程序以反映更改(重要的是构建而不仅仅是编译)。
程序集清单现在保证从授权系统目录安全且受控地加载 version.dll。
这是包含所有静态加载 dll 的完整示例清单文件。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="mpr.dll" loadFrom="%SystemRoot%\system32\" />
<file name="netapi32.dll" loadFrom="%SystemRoot%\system32\" />
<file name="netutils.dll" loadFrom="%SystemRoot%\system32\" />
<file name="textshaping.dll" loadFrom="%SystemRoot%\system32\" />
<file name="version.dll" loadFrom="%SystemRoot%\system32\" />
<file name="winhttp.dll" loadFrom="%SystemRoot%\system32\" />
<file name="CoreMessaging.dll" loadFrom="%SystemRoot%\system32\" />
<file name="DWMAPI.DLL" loadFrom="%SystemRoot%\system32\" />
<file name="WINSTA.DLL" loadFrom="%SystemRoot%\system32\" />
<file name="wtsapi32.DLL" loadFrom="%SystemRoot%\system32\" />
<file name="CoreUIComponents.DLL" loadFrom="%SystemRoot%\system32\" />
<file name="winspool.drv" loadFrom="%SystemRoot%\system32\" />
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>