暴力破解 Linux 密码程序

1,024 阅读1分钟
原文链接: haofly.net

这里介绍一下怎么用程序包里破解linux加密的 就写一个程序来实现如何暴力破解它。当然,这个程序的前提是你能够拿到对方的root权限并查看到/etc/shadow里面的内容,linux当然不会让你那么轻易地拿到的。所以这里只是出于兴趣破解一下本机上的密码而已。代码如下:

#define _GNU_SOURCE  
#include   
#include   
#include   
#include 
char letter[37] = "abcdefghijklmnopqrstuvwxyz0123456789"; // 存放所有可能的字符,不包含特殊字符以及大小写
char result[10]; 	// 存放最终结果,假设不超过十个字符  
int minlen = 1; 	// 密码的最小长度  
int maxlen = 10; 	// 密码的最大长度  
// 这是通过/etc/shadow所获取的加密后的文本  
char *encrypted = "$6$jMzjGK/$0QVw8FM87jd3yF0wvzgXPPe1l3FOfrIA7LhGPIVCbum9es5 /tQsGMJqmaQ78IY.Hv4h6UWnvTs4cLntrPMSfM/";  
char *salt = "$6$jMzjGK//$"; 	// 由上面的文本所得到的值,crypt函数的第二个参数
// 递归尝试  
void try_next(int index, int length)  
{  
	int i;  
	if(index == length)  
		return ; // 递归结束条件  
	for(i = 0; i< 36; i++) // 把当前位置的所有情况试完  
	{  
		result[index] = letter[i]; // 给当前位置赋值  
		memset(result + index +1, letter[0], length – index -1); // index之后,length之前的字符都用character[0]即a来代替  
		if(i != 0) // i=0的情况已经判断过了  
		{  
			printf("尝试:%s\n", result);  
			if(! strcmp(encrypted, crypt(result, salt)))  
			{  
				printf("发现密码:%s\n", result);  
				exit (0);  
			}  
		}  
		try_next(index + 1, length); // 递归替换下一个位置的字符,直到找到密码或者index==length为止  
	}  
}
void try(int length, int begin, int end)  
{  
	int i;  
	for(i = begin; i<= end;="" i++)="" {="" result[0]="letter[i];" 这一步只确定第一个字符="" memset(result="" +="" 1,="" letter[0],="" length-1);="" 第一个字符后面length前面的字符就用character[0]即a来代替="" printf("尝试:%s\n",="" result);="" if(!strcmp(encrypted,="" crypt(result,="" salt)))="" 如果这时候就能够匹配那么直接推出="" printf("发现密码:%s\n",="" exit="" (0);="" }="" try_next(1,="" length);="" 递归尝试第一个字符之后的字符="" int="" main()="" len;="" for(len="minlen;" len="" <="maxlen;" len++){="" printf("\n正在尝试长度为%d的密码\n",="" len);="" memset(result,="" 0,="" 10);="" 初始化result数组为全0,这里并不是指字符0="" try(len,="" 36);="" return="" 0;="" }<="" code="">

这是我第一次尝试暴力破解,虽然没有用多线程,但还是能明显感觉到其效率之低,以后得学学其他的方法。