2024-11-20-WinAPICrypt

2024-11-20-WinAPICrypt

十一月 20, 2024

Windows加密API CryptAcquire

函数一

CryptAcquireContextA 获取 CSP (获取加密服务提供者) 句柄,初始化加密操作。

1
2
3
4
5
6
7
BOOL CryptAcquireContextA(
HCRYPTPROV *phProv, // 指向加密提供者句柄的指针
LPCSTR pszContainer, // 密钥容器的名称
LPCSTR pszProvider, // 加密服务提供者的名称(如果为空,系统会使用默认值)
DWORD dwProvType, // 加密提供者的类型
DWORD dwFlags // 标志
);0

反汇编代码中

1
2
if ( !CryptAcquireContextA(&phProv, 0, 0, 1u, 0xF0000000) )
return 0;

CryptCreateHash 哈希对象可以在之后的操作中用于计算消息的哈希值

1
2
3
4
5
6
7
BOOL CryptCreateHash(
HCRYPTPROV hProv, // 提供者句柄
ALG_ID Algid, // 哈希算法标识符
HCRYPTKEY hKey, // 可选的密钥句柄
DWORD dwFlags, // 标志
HCRYPTHASH *phHash // 返回的哈希句柄
);

反汇编代码中

1
2
if ( CryptCreateHash(phProv, 0x8003u, 0, 0, &phHash) )
{

CryptHashData 用于将数据(如文件、消息等)传递给哈希对象以便进行哈希计算。

1
2
3
4
5
6
BOOL CryptHashData(
HCRYPTHASH hHash, // 哈希对象句柄
const BYTE *pbData, // 数据指针
DWORD dwDataLen, // 数据长度
DWORD dwFlags // 标志
);

反汇编代码中

1
2
if ( CryptHashData(phHash, pbData, dwDataLen, 0) )
{

CryptGetHashParam 用于获取哈希对象的参数(例如,计算的哈希值)。

1
2
3
4
5
6
7
BOOL CryptGetHashParam(
HCRYPTHASH hHash, // 哈希对象句柄
DWORD dwParam, // 参数类型
BYTE *pbData, // 输出缓冲区
DWORD *pdwDataLen, // 输出数据长度
DWORD dwFlags // 标志
);

反汇编代码中

1
2
3
4
5
6
7
8
9
10
CryptGetHashParam(phHash, 2u, v6, &pdwDataLen, 0);
*lpString1 = 0;
for ( i = 0; i < pdwDataLen; ++i )
{
wsprintfA(String2, "%02X", v6[i]);
lstrcatA(lpString1, String2);
}
CryptDestroyHash(phHash);
CryptReleaseContext(phProv, 0);
return 1;

完整加密过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int __cdecl sub_401040(BYTE *pbData, DWORD dwDataLen, LPSTR lpString1)
{
DWORD i; // [esp+4Ch] [ebp-24h]
CHAR String2[4]; // [esp+50h] [ebp-20h] BYREF
BYTE v6[16]; // [esp+54h] [ebp-1Ch] BYREF
DWORD pdwDataLen; // [esp+64h] [ebp-Ch] BYREF
HCRYPTHASH phHash; // [esp+68h] [ebp-8h] BYREF
HCRYPTPROV phProv; // [esp+6Ch] [ebp-4h] BYREF

if ( !CryptAcquireContextA(&phProv, 0, 0, 1u, 0xF0000000) )
return 0;
if ( CryptCreateHash(phProv, 0x8003u, 0, 0, &phHash) )
{
if ( CryptHashData(phHash, pbData, dwDataLen, 0) )
{
CryptGetHashParam(phHash, 2u, v6, &pdwDataLen, 0);
*lpString1 = 0;
for ( i = 0; i < pdwDataLen; ++i )
{
wsprintfA(String2, "%02X", v6[i]);
lstrcatA(lpString1, String2);
}
CryptDestroyHash(phHash);
CryptReleaseContext(phProv, 0);
return 1;
}
else
{
CryptDestroyHash(phHash);
CryptReleaseContext(phProv, 0);
return 0;
}
}
else
{
CryptReleaseContext(phProv, 0);
return 0;
}
}