如何验证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
相关产品推荐
相关产品推荐

