unit TrustCheck;

interface

uses
Windows,SysUtils,jwaWinTrust,JwaWinCrypt; function CheckFileTrust(const FileName: WideString; var Signner: WideString): Boolean; implementation const
WINTRUST_ACTION_GENERIC_VERIFY_V2: TGUID = '{00AAC56B-CD44-11d0-8CC2-00C04FC295EE}'; function CryptCATAdminAcquireContext(var HCatAdmin: THandle; pgSubsystem: PGUID; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminReleaseContext(hAdmin: THANDLE; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminCalcHashFromFileHandle(hFile: THANDLE; var dwSize: DWORD; buf: PByte; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminEnumCatalogFromHash(hAdmin: THANDLE; pbHash: PByte; pHashSize: DWORD; dwFlags: DWORD; phPrevCatInfo: PHandle): THANDLE; stdcall;external 'wintrust.dll' ;
function CryptCATCatalogInfoFromContext(hCatInfo: THANDLE; psCatInfo: PWintrustCatalogInfo; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminReleaseCatalogContext(hAdmin: THANDLE; hCatInfo: THANDLE; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function WinVerifyTrust(hwnd: THANDLE; pgActionID: PGUID; pWintrustData: PWINTRUST_DATA): Longint; stdcall; external 'wintrust.dll' ; function bf2s(bf: PByte; len: Integer): WideString;
begin
Result := '';
while len > do
begin
Result := Result + IntToHex(bf^,);
Inc(bf);
Dec(len);
end;
end; function GetSignner(hWVTStateData: THANDLE): WideString;
var
provider: PCRYPT_PROVIDER_DATA;
signner: PCRYPT_PROVIDER_SGNR;
cert: PCRYPT_PROVIDER_CERT;
S: string;
i: Integer;
begin
provider := WTHelperProvDataFromStateData(hWVTStateData);
if provider = nil then
Exit;
signner := WTHelperGetProvSignerFromChain(provider,,False,);
if signner = nil then
Exit;
cert := WTHelperGetProvCertFromChain(signner, );
if cert = nil then
Exit;
i := CertGetNameString(cert.pCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, , nil, nil, );
SetLength(S,i);
CertGetNameString(cert.pCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, , nil, @s[], Length(s));
Result := S;
end; function CheckFileTrust(const FileName: WideString; var Signner: WideString): Boolean;
var
buf: array[..]of Byte;
cb: DWORD;
hAdmin: THandle;
hCtx: THandle;
hFile: THandle;
I,Ret: Integer;
S: WideString;
WTrustData: WINTRUST_DATA;
WTDFileInfo: TWintrustFileInfo;
CatalogInfo: TWintrustCatalogInfo;
WTDCatalogInfo: WINTRUST_CATALOG_INFO;
begin
Result := False;
Signner := '';
if not FileExists(FileName) then
Exit;
hAdmin := ;
hCtx := ;
hFile := INVALID_HANDLE_VALUE;
try
if not CryptCATAdminAcquireContext(hAdmin,nil,) then
Exit;
hFile := CreateFileW(PWideChar(FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,);
if hFile = INVALID_HANDLE_VALUE then
begin
I := GetLastError;
sleep(I * );
Exit;
end;
cb := SizeOf(buf);
if not CryptCATAdminCalcHashFromFileHandle(hFile,cb,@buf[],) then
Exit;
S := bf2s(@buf[],cb);
hCtx := CryptCATAdminEnumCatalogFromHash(hAdmin,@buf[],cb,,nil);
FillChar(WTrustData,SizeOf(WTrustData),); WTrustData.dwUIChoice := WTD_UI_NONE;
WTrustData.fdwRevocationChecks := WTD_REVOKE_NONE;
WTrustData.dwStateAction := WTD_STATEACTION_VERIFY;
WTrustData.dwProvFlags := WTD_REVOCATION_CHECK_NONE;
if hCtx = then
begin
FillChar(WTDFileInfo,SizeOf(WTDFileInfo),);
WTDFileInfo.cbStruct := SizeOf(WTDFileInfo);
WTDFileInfo.pcwszFilePath := PWideChar(FileName);
WTrustData.cbStruct := SizeOf(WTrustData);
WTrustData.dwUnionChoice := WTD_CHOICE_FILE;
WTrustData.InfoUnion.pFile := @WTDFileInfo;
end
else
begin
CryptCATCatalogInfoFromContext(hCtx, @CatalogInfo, );
FillChar(WTDCatalogInfo,SizeOf(WTDCatalogInfo),);
WTDCatalogInfo.cbStruct := SizeOf(WTDCatalogInfo);
WTDCatalogInfo.pcwszCatalogFilePath := CatalogInfo.pcwszCatalogFilePath;
WTDCatalogInfo.pcwszMemberFilePath := PWideChar(Filename);
WTDCatalogInfo.pcwszMemberTag := PWideChar(S);
WTrustData.cbStruct := SizeOf(WTrustData);
WTrustData.dwUnionChoice := WTD_CHOICE_CATALOG;
WTrustData.InfoUnion.pCatalog := @WTDCatalogInfo;
end;
Ret := WinVerifyTrust(INVALID_HANDLE_VALUE,@WINTRUST_ACTION_GENERIC_VERIFY_V2,@WTrustData);
Result := Ret = ;
if Result and (WTrustData.hWVTStateData > ) then
Signner := GetSignner(WTrustData.hWVTStateData);
WTrustData.dwStateAction := WTD_STATEACTION_CLOSE;
WinVerifyTrust(INVALID_HANDLE_VALUE,@WINTRUST_ACTION_GENERIC_VERIFY_V2,@WTrustData);
finally
if hCtx > then
CryptCATAdminReleaseCatalogContext(hAdmin,hCtx, );
if hAdmin <> then
CryptCATAdminReleaseContext(hAdmin,);
if hFile <> INVALID_HANDLE_VALUE then
CloseHandle(hFile);
end;
end; end.

delphi数字签名验证及能够获取数字签名文件信息(利用wintrust.dll的导出函数,翻译一下)的更多相关文章

  1. Delphi使用两种不同方法获取系统端口信息--(装载)

    Delphi使用两种方法获取windows系统的端口,还可测试发送消息,点击获取端口信息后,可依次得到如下信息:DCB结构大小.波特率大小.XON的临界值.XOFF的临界值.字符位数.奇偶检验位.停止 ...

  2. delphi 简单的删除字符串尾部数字的代码

    delphi  简单的删除字符串尾部数字的代码 方式一: function FilterShowName(const sName: String): String; var I: Integer; b ...

  3. 【PE结构】恶意代码数字签名验证

    说明 恶意代码数字签名验证功能,WinverityTrust.CryptQueryObject 代码实现 WinVerifyTrust //------------------------------ ...

  4. certbot 获取数字证书失效问题

    title: certbot 获取数字证书失效问题 author: Narule date: 2021-02-18 10:45:00 +0800 categories: [Technology^技术, ...

  5. NGK Global首尔站:内存是未来获取数字财富的新模式

    近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...

  6. list 分批导入db, 每1000条数据一批 , 从字符串中获取数字,小数, 版本号比较

    //这个有个弊端: 分组后分批导入, 是阻塞的,我没有导入完成,别人就不能导入, 这里可以优化成异步,线程池 public static void main(String[] args) { Rand ...

  7. 和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)

    转自http://blog.csdn.net/bluishglc/article/details/7585965 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统 ...

  8. 转!!通俗理解数字加密,数字签名,数字证书和https

    原博文地址:https://www.jianshu.com/p/4932cb1499bf 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应. ...

  9. 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain

    AToken数字货币钱包 超容易上手支持五大主流币种   互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载     国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...

随机推荐

  1. .Net时间计算函数,统计某一天是一年的第几周,这一周从哪天开始到哪天结束

    /// <summary> /// 计算某年第一周的天数         /// </summary>         /// <param name="dt& ...

  2. php在apache中运行模式

    php在apache中运行模式 (2011-12-18 02:38:27) 标签: 杂谈 分类: 服务器及软件 一.php在php在三种工作方式:Apache 模块DLL) 以下分别比较: 1. ph ...

  3. Linux进程间通信总结

    刚请完婚假,请假期间做了些技术总结,其中一个就是Linux进程间通信方式的总结. Linux提供了多种进程间通信的方式,列举如下: PIPE(管道) FIFO(先进先出,也称为有名管道) domain ...

  4. openstack 源码分析

    Nova对于底层Hypervisor(如KVM/QEMU等)的调用与管理主要通过LibvirtDriver类,nova/virt/libvirt/driver.py Libvirt对Hyperviso ...

  5. javascript的函数相关属性和方法

    作为一名前端初学者,应该坚持每天去学习,去总结 ,去复习,去接触更新鲜的事物.但是这段时间很浮躁,虽说也是在一直学习,自己能吸收的少之又少.今日在这突然冒出来,实感惭愧. 1.函数名.name 获得函 ...

  6. spring IOC简单入门

    spring的核心是ioc和aop 先介绍一下IOC(inverse of control控制反转)又叫DI(Dependency injection依赖注入) 个人理解为把对象的控制权由类转移到配置 ...

  7. 我用过的linux命令--安装JDK

    首先,我的测试环境是CentOS的linux虚拟机,如果想安装JDK,首先要有一个JDK.利用的软件就是WinSCP,把JDK从windows中传送到Linux中去. 1. JDK从Windows到L ...

  8. CSS Select 标签取选中文本值

    $("#userDep").find("option:selected").text()

  9. MYSQL存储过程事务列子

    CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int) BEGIN #Routine body goe ...

  10. IOS 学习笔记(6) 控件 文本域(UITextField)的使用方法

    UITextField控件的诸多特性都和UITextView相似,比如成为输入文本焦点时键盘自动显示,支持长按弹出动作选项,能够接收输入事件(开始输入,修改内容,结束输入和点击回车等). 1.特有的特 ...