注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

做个暴力破解NTHASH小程序  

2015-03-06 12:30:11|  分类: 一些练习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
花了两天做了个暴力破解nthash密码的小程序,运行如下:
C:\TEMP\vc>lmnthash xp@4
=== 计算 xp@4 的LM NT HASH ===
lmhash=4BD766D8544D1478AAD3B435B51404EE
nthash=4787AC803E45E90217140E59C302D8E8

C:\TEMP\vc>cracknthash 4787AC803E45E90217140E59C302D8E8
[*] 穷举NTHASH: 4787AC803E45E90217140E59C302D8E8 的密码...
[+] PASSWORD = xp@4

尽管我很鄙视暴力破解,但是在算法上如何枚举密码空间,确花去了好多时间。
我这里用迭代的方法,枚举每位长度的可能值。
编程练手用的。

cracknthash.cpp源码如下:
//NTHASH爆力破解
//cl cracknthash.cpp
#include <windows.h>
#include <stdio.h>

//#define DBG

//密码字符集
char set[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_=~/*-+.,;:<>";

int N; //密码字符集长度

//密码最小长度最大长度
#define MIN 1
#define MAX 10

char pwd[100];
char pass[100];
unsigned char hashbuf[16];
unsigned char hash[16];

#ifdef DBG
int count=0;
#endif

typedef struct _UNICODE_STRING {
  USHORT  Length;
  USHORT  MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef void (WINAPI *NTHASH)(PUNICODE_STRING puPassword, unsigned char * Buffer);

NTHASH nthash;

int init(void)
{
HMODULE h;
h=LoadLibrary("advapi32.dll");
if (h==0) return 0;
nthash=(NTHASH)GetProcAddress(h,"SystemFunction007");
return 1;
}

void get_nthash(char * str, unsigned char * buf)
{
int i;
unsigned char buffer[0x400];

UNICODE_STRING us;

us.Length = 2*strlen(str);
us.MaximumLength = sizeof(buffer);
us.Buffer = (PWSTR)buffer;

memset(buffer, 0, sizeof(buffer));

for (i=0; i<strlen(str); i++) //输入不要超过200h,否则溢出
{
buffer[i*2] = str[i]; //简单转化成宽字符
}

nthash(&us,buf);
}

//n密码长度,p指向s中当前处理的地方
void crk(int n, char* p)
{
int i;

if (n==0)
{
p++;
*p=0;
strcpy(pass, pwd);

#ifdef DBG
count++;
if (count>20)
{
exit(0);
}
printf("[+] PASSWORD = %s\n", pass);
#endif

get_nthash(pass, hashbuf);

#ifdef DBG

for (int j=0; j<0x10; j++)
{
printf("%02X",hashbuf[j]);
}

printf("-------\n");
for (j=0; j<0x10; j++)
{
printf("%02X",hash[j]);
}

printf("=======\n");
#endif

if (memcmp(hashbuf, hash, 0x10)==0)
{
printf("[+] PASSWORD = %s\n", pass);
exit(0);
}
return;
}

for (i=0; i<N; i++)
{
*p = set[i];
crk(n-1, p+1);
}
}

void crack()
{
int len;

for (len=MIN; len<=MAX; len++) //从最小长度到最大长度
{
memset(pwd, 0, sizeof(pwd));
crk(len, pwd);
}
}

BOOL HexStr2Bin(char *hexstr,unsigned char *buff)
{
char str[100];

for (int i=0;i<16 ;i++ )
{
sscanf(hexstr+2*i,"%02x",str+i);
}

memcpy(buff, str, 16 );
return TRUE;
}

int main(int argc, char *argv[])
{
int i;

if (argc<2)
{
printf("[*] 帮助:NTHASH暴力破解\n");
printf("CRACKNTHASH nthash\n");
return 0;
}

if (strlen(argv[1])!=32)
{
printf("[-] NTHASH长度必须是32!\n");
return 0;
}

if (init()==0) return 0;

printf("[*] 穷举NTHASH: %s 的密码...\n", argv[1]);
HexStr2Bin(argv[1], hash);
N = strlen(set);

crack();

return 0;
}

  评论这张
 
阅读(1194)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017