搜搜地址栏的一些技术分析
如上篇blog中所述,由于朋友笔记本的性能问题,无意中发现QQ可能在用户的计算机上,留下了常驻内存的代码。为了验证该问题,笔者在新装的Windows XP SP2虚拟机上,进行了试验。
分析结果表明,在QQ2006 Beta3安装程序中,默认包含了搜搜地址栏。如果按照QQ安装向导的默认设置,完成安装,搜搜地址栏也会被安装到计算机上。而他们的反安装程序是独立的。因此如果用户从控制面板——添加/删除程序中仅仅卸载了QQ,搜搜地址栏会依然运行于用户的计算机上。由于该程序的存在,用户在IE地址栏中输入关键字时,将会被导向Tencent的Soso。
在添加/删除程序中,可以卸载掉搜搜地址栏。但与一般应用程序有所不同的是,搜搜地址栏具有反删除功能,如果用户没有注意到添加/删除程序中的卸载选项,而是想直接从文件系统中删掉相关程序文件的话,将会遇到很大的困难。因为即使删除了该系统的部分文件或者注册表启动选项之后,它也会自动恢复这些内容。
技术上,该系统的文件主要位于C:\Program Files\Tencent\Adplus目录下。根据测试的情况,部分文件的部分作用如下:
SSAddr.dll:以Shell Extension的形式驻留Explorer进程,作为URL Extension控制了IE地址搜索功能。
Adplus.dll:驻留Explorer以及其他用户进程。
stup.exe:进行某些初始化操作,使Adplus.dll能够驻留在各用户进程中。为了让stup在计算机启动时自动运行,在注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run中,存在名为stup的启动选项,值为C:\Program Files\Tencent\Adplus\stup.exe。
系统各模块相互作用,防止被清除。根据笔者的测试,如果删除了注册表中stup启动选项,它会被自动恢复;而在连入互联网的情况下,被删除的stup.exe文件也会重新生成。
在分析过程中,还有两个令笔者不安的发现:
---通过Windows提供的Task机制,腾讯在拥有Local System权限的service进程中运行了部分代码
---该应用读取并复制了Kernel32.dll
基于个人的经验,这两者更多的被用于病毒木马等恶意软件,很难想象普通的应用程序为何需要采取上述两种行为。说搜搜是病毒木马缺乏事实,不过它的行为的确有些邪气。一个能想出的理由是,IE地址栏就那么一个,盯着它的不仅仅是腾讯一家(比如3721什么的),未免大家有磕磕碰碰的时候。设计这么复杂一个东西出来,大概是为了对决或者群殴?
从朋友计算机的遭遇和网上的一些用户反馈来看,腾讯的这个遗留系统可能会导致用户的系统性能大幅度下降。如果需要使用QQ,最好在安装向导中仅仅选择安装QQ。至少在QQ2006 Beta3中,这种情况下不会安装搜搜。如果已经安装了QQ2006,可以查看控制面板——添加/删除程序中是否有卸载搜搜地址栏的选项。
本文后面部分是一些关键的测试和分析过程,如有troubleshooting类似问题的可以参考(在测试环境中的状况与我在朋友计算机上遇到的并不完全一致,估计是由于QQ不同的版本实现该系统的方式不完全一致。但总体方法上大致相同)。
试验环境是运行于Virtual PC上的Windows XP SP2虚拟机,干净的系统,默认状况下与互联网断开连接。
从www.qq.com下载新版的QQ,安装程序名称为qq2006beta3。
运行安装程序,看看许可协议:
按照安装向导的默认选项,完成安装。
运行msconfig,在注册表startup选项中,发现新增了两项与腾讯相关内容,其中之一名为stup,指向C:\Program Files\Tencent\Adplus\stup.exe。
重启计算机,从添加/删除程序中,卸载QQ(注意添加/删除程序中还有搜搜地址栏的卸载工具,如果也运行了该选项,可以将搜搜地址栏卸载,也不会出现下文的状况)。
卸载之后,运行msconfig,stup依然存在于注册表startup选项中。于是我清除掉了stup选项,以阻止它自动运行。在重启计算机后,运行msconfig,在注册表的启动选项中,又出现了新的stup!
显然是有驻留的应用程序在监控注册表中的startup选项,并且在发现stup项目被删除后,重新生成了该启动项目。我首先查看了msconfig中的“服务”标签,但是没有发现可疑的服务。
打开stup中指向的C:\Program Files\Tencent\Adplus目录,有启动选项中指定的stup.exe,以及其他几个文件,其中包括Adplus.dll、SSAddr.dll。
尝试删除Adplus目录,但系统报错,提示Adplus.dll访问被拒绝。
根据这种现象,猜测Tencent使用了Dll Injection技术,将Adplus.dll注入到其他进程中。导致系统无法删除该文件。
检查hkey_local_machine\software\microsoft\windows nt\currentversion\windows\Appinit_Dlls,没有发现相关的键值。
为了验证我的猜测,运行notepad,然后运行Process Explorer查看进程信息,有如下发现:
Adplus.dll驻留在进程notepad.exe中;Adplus.dll、SSAddr.dll驻留在进程explorer.dll中。
为了更多地了解Adplus被访问的情况,我关闭了刚刚打开的Notepad。下载并运行Filemon,监控文件系统的活动,然后运行Notepad。
从Filemon的输出显示,进程ID为872的svchost进程,也访问了Adplus.dll。从Process Explorer中,看出svchost.exe:872是host windows主要服务的进程。但是并没有Adplus.dll或者任何其他Tencent的dll驻留在该进程中。这意味着很可能svchost.exe是为了运行Adplus.dll中的代码而访问该文件。
而比较常见的在该svchost.exe环境下执行代码的方式,是通过Task Scheduler Service。为了验证我的猜测,我禁用掉了Task Scheduler Service,然后重新运行Notepad。在这种情况下,svchost.exe不再访问Adplus.dll。而一旦enable Task Scheduler,则Filemon中又显示出svchost.exe访问Adplus.dll的记录。由此推断,搜搜工具条通过Task Schedule运行了部分代码。
考虑到svchost.exe是运行在Local System帐号下,对于本地系统有相当高的特权,对于这一发现我感到不安。而在将Filemon的日志导入Excel作进一步分析的时候,我注意到了另外一个现象。Notepad进程读取并复制了kernel32.dll文件(复制文件名为s88..dll,而svchost曾经尝试访问该复制的kernel32.dll。同时,svchost还尝试访问过另外几个命名规则跟s88..dll类似的文件。
为进一步查明搜搜地址栏的启动流程,对于ADPLUS目录,我启用了NTFS文件审计,然后重启计算机,打开安全日志。重启之后Adplus下第一个被审核记录的文件,是stup.exe,由explorer.exe访问。
?
从Adplus中删除stup.exe,能够正常删除。等待三分钟,资源管理器中没有再次出现该文件,关闭计算机。几分钟之后重新开机。在Adplus目录中依然没有stup.exe(后来的测试表明,如果计算机连接到互联网上,那么stup.exe将会被重新生成)。
打开Notepad,运行Process Explorer,这次Adplus.dll没有出现在进程的dl列表中。但是,在Explorer.exe中,依然驻留着SSAddr.dll。
打开Filemon,设置Filter,使之仅仅显示包含adplus或者ssaddr的访问记录。运行Notepad,然后关闭。在Filemon的输出界面中,依然存在Adplus.dll的访问信息。
由于看到搜搜曾经复制过Kernel32.dll,我怀疑是否关键的Windows内核文件已经被更改。于是关闭QQ测试虚拟机,启动另外一台干净的XP虚拟机,将QQ测试机的硬盘挂上去。对比两台机器的Windows和Windows\System32目录下的文件,没有发现文件被篡改。
重新启动QQ测试机,下载并运行DriverView,检查内核驱动程序。发现名为nProtect的driver,位于Tencent\QQ目录下。根据网上的信息,应该是一个防止窃取键盘输入的驱动。反正QQ已经删除了,使用SRVINSTW工具将该驱动卸载。
重启计算机,运行Process Explorer,SSAddr.dll依然在Explorer进程中。猜测它可能是通过Shell Extension的方式驻留进程,下载并运行ShellExView,果然找到相关的Shell Extensions:
在ShellExView中Disable相关Shell Extensions,重启计算机。Explorer中没有SSAddr.dll驻留了。
此后顺利删除C:\Program Files\Tencent\Adplus目录下的文件和注册表中的stup启动项目。
posted on 2006-09-22 15:32:00 by johnxu 评论(43) 阅读(25962)
