You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证BPL(运行时包)文件的数字签名?

验证BPL文件数字签名的方法

你的现有VerifyEmbeddedSignature函数完全可以直接用来验证BPL文件,原因如下:

BPL是Delphi的运行时包文件,本质上属于PE(可移植可执行文件)格式,和EXE、DLL的文件结构完全一致,数字签名的嵌入方式、验证逻辑和EXE/DLL没有区别。Windows在加载BPL时的签名检查机制,也和加载普通DLL/EXE遵循相同的规则。

使用说明

  • 直接将BPL文件的完整路径传入VerifyEmbeddedSignature函数即可,无需修改函数逻辑
  • 如果需要在BPL被加载前完成验证,要确保在调用LoadPackage(或系统自动加载依赖包)之前执行该函数
  • 若需要更严格的验证(比如检查证书链的吊销状态),可以将wintrustdata.fdwRevocationChecks的值从WTD_REVOKE_NONE改为WTD_REVOKE_WHOLECHAIN,但这会依赖网络连接,且可能影响验证性能

你的验证函数代码(可直接复用)

function VerifyEmbeddedSignature(const filename: string): boolean;
var
  wintrustdata: WINTRUST_DATA;
  fileinfo: WINTRUST_FILE_INFO;
  policyguid: TGUID;
  status: LongInt;
begin
  ZeroMemory(@fileinfo, SizeOf(fileinfo));
  fileinfo.cbStruct := SizeOf(fileinfo);
  fileinfo.pcwszFilePath := PWideChar(filename);
  fileinfo.hFile := 0;
  fileinfo.pgKnownSubject := nil;

  ZeroMemory(@wintrustdata, SizeOf(wintrustdata));
  wintrustdata.cbStruct := SizeOf(wintrustdata);
  wintrustdata.dwUIChoice := WTD_UI_NONE;
  wintrustdata.fdwRevocationChecks := WTD_REVOKE_NONE;
  wintrustdata.dwUnionChoice := WTD_CHOICE_FILE;
  wintrustdata.dwStateAction := WTD_STATEACTION_VERIFY;
  wintrustdata.pFile := @fileinfo;
  wintrustdata.dwProvFlags := WTD_SAFER_FLAG;

  policyguid := WINTRUST_ACTION_GENERIC_VERIFY_V2;

  status := WinVerifyTrust(0, policyguid, @wintrustdata);

  wintrustdata.dwStateAction := WTD_STATEACTION_CLOSE;
  WinVerifyTrust(0, policyguid, @wintrustdata);

  result := (status = ERROR_SUCCESS);
end;

内容的提问来源于stack exchange,提问作者complete_stranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:12:04