Creacion de un Joiner

Transcripción

Creacion de un Joiner
[Titulo] : Creacion de un Joiner
[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.
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 :
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.

Documentos relacionados