65.9K
CodeProject 正在变化。 阅读更多。
Home

NTLM 哈希生成器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (10投票s)

2012年2月11日

CPOL

2分钟阅读

viewsIcon

65370

downloadIcon

1980

用纯 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

snapshot.JPG

代码解释

该项目仅包含两个函数: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 找到了它)。

不要害怕我的代码的准确性。它没有缺陷;尽管我已经测试了它一千次。

© . All rights reserved.