找回密码
 加入
搜索
查看: 9414|回复: 12

[原创] Win32 API - CryptHashCertificate验证文件MD5

[复制链接]
发表于 2009-9-15 02:13:00 | 显示全部楼层 |阅读模式
; Win32 API - CryptHashCertificate验证文件MD5

; CryptHashCertificate,定义于Crypt32.dll中,函数原型如下:
#cs
BOOL WINAPI CryptHashCertificate(
  __in     HCRYPTPROV_LEGACY hCryptProv,
  __in     ALG_ID Algid,
  __in     DWORD dwFlags,
  __in     const BYTE *pbEncoded,
  __in     DWORD cbEncoded,
  __out    BYTE *pbComputedHash,
  __inout  DWORD *pcbComputedHash
);
#ce

; 返回值为布尔型,对应au3中的int。
; hCryptProv - 没有用处,留空。
; Algid - 指定验证方式,可以是MD5或者是SHA1或其他验证方式,如果是MD5,此处添$CALG_MD5 (0x8003)。
; dwFlags - 留空。
; *pbEncoded - 指针型,指向要验证的数据。
; cbEncoded - 要验证的数据的长度。
; *pbComputedHash - 指向一个缓存区,用于存放验证结果。
; *pcbComputedHash - 输入输出型参数,作为输入时,指定pbComputedHash结构的长度,作为输出时,此值被设为所需要的缓存区域的长度。

Const $CALG_MD2 = 0x8001
Const $CALG_MD4 = 0x8002
Const $CALG_MD5 = 0x8003
Const $CALG_SHA1 = 0x8004

$sFile = @WindowsDir & "\Explorer.exe" ; 指定要验证的文件。
$hFile = FileOpen($sFile, 16)
$bData = FileRead($hFile) ; 读取文件中的数据。
$iLength = BinaryLen($bData) ; 数据长度
FileClose($hFile)
; NOTE: 此处必须先要用FileOpen以2进制模式打开文件,否则编译后或者在SCITE中运行得到的结果将不正确。


$tBuffer = DllStructCreate("byte[" & $iLength & "]")
$pBuffer = DllStructGetPtr($tBuffer)
DllStructSetData($tBuffer, 1, $bData)

$iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _
                "hWnd", 0, _        ; 留空。
                "dword", $CALG_MD5, _        ; 以MD5方式验证。
                "dword", 0, _        ; 留空。
                "ptr", $pBuffer, _                ; 要验证的数据指针。
                "dword", $iLength, _        ; 数据长度。
                "ptr", 0, _                        ; 输出结果,第一次调用传递空值,$iResult[7]被设为所需长度。
                "dword*", 0)        ; 此值被设为所需要的结构大小,因为也用作输出,所以加*。

$tResult = DllStructCreate("byte[" & $iResult[7] & "]") ; 定义一个如此长度的缓冲区,用于存放验证结果。
$pResult = DllStructGetPtr($tResult)

$iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _; 第二次调用,函数将结果填充到$tResult中。
                "hWnd", 0, _
                "dword", $CALG_MD5, _
                "dword", 0, _
                "ptr", $pBuffer, _
                "dword", $iLength, _
                "ptr", $pResult, _
                "dword*", $iResult[7])
If $iResult[0] <> 0 Then Msgbox(0, $sFile, StringTrimLeft(DllStructGetData($tResult, 1), 2))

$tBuffer = 0
$tResult = 0

评分

参与人数 2金钱 +15 贡献 +15 收起 理由
小菜kks + 5
bing614 + 15 + 10 非常好的API教程。

查看全部评分

发表于 2009-9-15 03:46:09 | 显示全部楼层
早起的鸟儿有沙发,哈哈
发表于 2009-9-15 06:32:20 | 显示全部楼层
1# pusofalse

顶下
发表于 2009-9-15 06:33:53 | 显示全部楼层
pusofalse似乎对api很熟悉
发表于 2009-9-15 09:35:38 | 显示全部楼层
非常好感谢楼主pusofalse 提供的教程。
发表于 2010-9-2 08:44:58 | 显示全部楼层
谢谢,正找MD5验证文件呢,楼主辛苦了。。。
发表于 2010-9-2 08:59:52 | 显示全部楼层
支持一下。。多多益善哈
发表于 2010-9-3 16:30:15 | 显示全部楼层
这个要啃下来
发表于 2010-9-5 01:02:03 | 显示全部楼层
看看                                ok
发表于 2011-2-13 07:47:40 | 显示全部楼层
   有点意思
发表于 2012-6-7 21:28:34 | 显示全部楼层
P版的代码一定要顶!
发表于 2012-6-8 10:38:12 | 显示全部楼层
代码不错,只是有一个小缺点,如果校验的文件过大,那么程序占用的内存将非常可观。
发表于 2019-6-24 10:00:33 | 显示全部楼层
有没有64位系统版本的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 13:51 , Processed in 0.082525 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表