NTLM 哈希生成器






4.64/5 (10投票s)
用纯 C/C++ 计算给定字符串的 NTLM 哈希值
引言
该项目是一个纯 C/C++ (不使用 Windows API 或库) 的 NTLM 哈希生成器。它对希望处理 Windows 身份验证相关项目、彩虹表等开发者很有用。
代码简洁易用。您可以完全自由地使用我的代码。
使用项目
使用代码
简而言之,您应该像这样调用 NTLM() 函数
NTLM("password");
printf("%s", hex_format); //hex_format contains the NTLM hash
使用编译的可执行文件
ntlm.exe STRING
代码解释
该项目仅包含两个函数:NTLM 和 main
第一个函数
void NTLM(char *key)
NTLM() 函数有一个 char 数组参数。它是应该计算 NTLM 哈希值的字符串。如果您想在您的代码中使用 NTLM() 函数,只需复制/粘贴它 (不要忘记复制我的全局定义)。
在开始哈希计算之前,有一段代码
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Prepare the string for hash calculation
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int i = 0;
int length = strlen(key);
memset(nt_buffer, 0, 16*4);
//The length of key need to be <= 27
for(; i<length/2; i++)
nt_buffer[i] = key[2 * i] | (key[2 * i + 1] << 16);
//padding
if(length % 2 == 1)
nt_buffer[i] = key[length - 1] | 0x800000;
else
nt_buffer[i] = 0x80;
//put the length
nt_buffer[14] = length << 4;
这段代码将字符串映射到十六个 unsigned int
。这就是哈希计算开始处理的方式。unsigned int
是哈希计算的输入。
NTLM 哈希的计算分为 3 个阶段,我在注释中标记了它们,如下所示
/* Round 1 */
a += (d ^ (b & (c ^ d))) + nt_buffer[0] ;a = (a << 3 ) | (a >> 29);
d += (c ^ (a & (b ^ c))) + nt_buffer[1] ;d = (d << 7 ) | (d >> 25);
c += (b ^ (d & (a ^ b))) + nt_buffer[2] ;c = (c << 11) | (c >> 21);
b += (a ^ (c & (d ^ a))) + nt_buffer[3] ;b = (b << 19) | (b >> 13);
a += (d ^ (b & (c ^ d))) + nt_buffer[4] ;a = (a << 3 ) | (a >> 29);
d += (c ^ (a & (b ^ c))) + nt_buffer[5] ;d = (d << 7 ) | (d >> 25);
c += (b ^ (d & (a ^ b))) + nt_buffer[6] ;c = (c << 11) | (c >> 21);
b += (a ^ (c & (d ^ a))) + nt_buffer[7] ;b = (b << 19) | (b >> 13);
如果您想深入了解 NTLM 哈希计算的阶段,您应该阅读关于 MD4 哈希的工作原理。因为 NTLM 是小端 UTF-16 Unicode 的 MD4。
在“第 3 轮”之后,哈希就准备好了。NTLM() 函数的最后一部分,将计算出的哈希转换为十六进制。因为十六进制对人类来说更易读。
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Convert the hash to hex (for being readable)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for(i=0; i<4; i++)
{
int j = 0;
unsigned int n = output[i];
//iterate the bytes of the integer
for(; j<4; j++)
{
unsigned int convert = n % 256;
hex_format[i * 8 + j * 2 + 1] = itoa16[convert % 16];
convert = convert / 16;
hex_format[i * 8 + j * 2 + 0] = itoa16[convert % 16];
n = n / 256;
}
}
//null terminate the string
hex_format[33] = 0;
当 NTLM() 函数返回时,哈希的十六进制格式位于 hex_format
数据成员中。您可以使用 printf() 或 MessageBox() 显示它,或者将其写入文件。
第二个函数
int main(int argc, char *argv[])
main() 函数只是将应用程序的参数传递给 NTLM() 函数
if(argc == 2)
{
NTLM(argv[1]);
printf("\r\nNTLM of %s is: %s\r\n", argv[1], hex_format);
}
else
printf("usage: ntlm.exe STRING_FOR_NTLM_HASH_CALCULATION");
return 0;
它是用于演示的。您可以删除它。
保证
您可以使用像这个这样的在线哈希计算器来检查我项目的准确性:OnlineHashCrack.com (我不想宣传这个网站。我通过 Google 找到了它)。