pusofalse 发表于 2009-9-15 02:13:00

Win32 API - CryptHashCertificate验证文件MD5

; 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,
__inoutDWORD *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被设为所需长度。
                "dword*", 0)        ; 此值被设为所需要的结构大小,因为也用作输出,所以加*。

$tResult = DllStructCreate("byte[" & $iResult & "]") ; 定义一个如此长度的缓冲区,用于存放验证结果。
$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)
If $iResult <> 0 Then Msgbox(0, $sFile, StringTrimLeft(DllStructGetData($tResult, 1), 2))

$tBuffer = 0
$tResult = 0

sunafter 发表于 2009-9-15 03:46:09

早起的鸟儿有沙发,哈哈

netegg 发表于 2009-9-15 06:32:20

1# pusofalse

顶下

netegg 发表于 2009-9-15 06:33:53

pusofalse似乎对api很熟悉

bing614 发表于 2009-9-15 09:35:38

非常好感谢楼主pusofalse 提供的教程。

6678720 发表于 2010-9-2 08:44:58

谢谢,正找MD5验证文件呢,楼主辛苦了。。。

menfan1 发表于 2010-9-2 08:59:52

支持一下。。多多益善哈

小菜kks 发表于 2010-9-3 16:30:15

这个要啃下来{:face (356):}

fengzr 发表于 2010-9-5 01:02:03

看看                              ok

wggaijcm 发表于 2011-2-13 07:47:40

 有点意思

penguinl 发表于 2012-6-7 21:28:34

P版的代码一定要顶!

lvjing79 发表于 2012-6-8 10:38:12

代码不错,只是有一个小缺点,如果校验的文件过大,那么程序占用的内存将非常可观。

auto 发表于 2019-6-24 10:00:33

有没有64位系统版本的
页: [1]
查看完整版本: Win32 API - CryptHashCertificate验证文件MD5