Creacion de un Server Builder con recursos

8:25 0 Comments A+ a-



-- =================--------

0x01 : Introduccion
0x02 : Creacion del builder
0x03 : Creacion del stub
0x04 : Probando el programa
0x05 : Builder Tools

-- =================--------

0x01 : Introduccion

En este manual les voy a enseñar como hacer un Server Builder en Delphi usando recursos , en el manual anteior les enseñe como hacerlo mediante EOF , algo que no era muy seguro porque los datos estaban en texto plano y se podian leer facilmente , mediante recursos es diferente y para asegurarlo vamos a usar XOR para eso.

Empecemos ...

0x02 : Creacion del builder

Primero vamos hacer el builder , para eso vamos a "File->New->VCL Forms Application" como lo hice en la imagen :



Ahora creamos dos edit y boton con el texto de "Make Server" como en la siguiente imagen :



Despues deben cambiar el titulo del formulario a "Builder" y cambiarle el nombre por defecto que tienen los edits de la siguiente forma :

Edit1 -> ip
Edit2 -> port

Una vez hecho , hacemos doble click en el boton y agregamos el siguiente codigo :

Código: Delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   archivo: string; // Declaramos la variable "archivo" como string
  4.   datos: string; // Declaramos la variable "datos" como string
  5.   clave: integer; // Declaramos la variable "clave" como integer
  6. begin
  7.   archivo := 'stubnow.exe';
  8.   // Establecemos la variable "archivo" como el nombre del ejecutable
  9.   // que vamos abrir
  10.   datos := '[ip]' + ip.Text + '[ip]' + '[port]' + port.Text + '[port]';
  11.   // Establecemos los datos que contiene la IP y el puerto separados por etiquetas
  12.   // y los guardamos en la variable "datos"
  13.   clave := 123; // Establecemos la variable "clave" como "123"
  14.   escribir_recurso(archivo, datos, clave);
  15.   // Escribimos el recurso usando la funcion
  16.   // "escribir_recurso" usando como argumentos las variables que acabamos de establecer
  17.   ShowMessage('Done'); // Mostramos un mensaje en pantalla
  18. end;

Fuera del codigo de la funcion "click" del boton agregamos el codigo de estas dos funciones :

Código: Delphi
  1. function xor_now(texto: string; clave: integer): string;
  2. // Funcion xor_now con el argumento
  3. // del texto a crifrar y la clave a usar
  4. var
  5.   numero: integer; // Declaramos la variable "numero" como entero
  6.   contenido: string; // Declaramos la variable "contenido" como string
  7. begin
  8.   contenido := ''; // Vaciamos la variable contenido
  9.   for numero := 1 to Length(texto) do // Realizamos un for del "1"
  10.   // a la longitud de la variable texto
  11.   begin
  12.     contenido := contenido + Char(integer(texto[numero]) xor clave);
  13.     // Realizamos el cifrado xor
  14.   end;
  15.   Result := contenido; // Devolvemos como resultado la variable "contenido"
  16. end;
  17. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  18. var
  19.   escribiendo: THandle; // Declaramos la variable "escribiendo" como THandle
  20. begin
  21.   datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
  22.     '-0x646F646479206861636B6D616E-', clave);
  23.   // Ciframos los datos usando la funcion xor_now
  24.   // Los parametros que usamos en la funcion xor_now son la variable "datos" como el texto
  25.   // a cifrar , los "datos" estan entre dos delimitadores para facilitar su busqueda y
  26.   // tambien usamos la variable "clave" como key en el cifrado xor
  27.   escribiendo := BeginUpdateResource(pchar(ruta), False);
  28.   // Empezamos el inicio de de la creacion
  29.   // del recurso usando la variable "ruta"
  30.   UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
  31.     pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
  32.   // Escribimos el recurso usando
  33.   // la variable "datos" como el contenido del recurso y como nombre del recurso usamos
  34.   // "CONFIGURATION"
  35.   EndUpdateResource(escribiendo, False); // Terminamos de crear el recurso
  36.   Result := True; // Devolvemos True como resultado de la funcion
  37. end;

Les deberia quedar algo asi :



Con eso ya estaria el builder entonces guardamos el proyecto como "builder_now" o como quieran para terminar el builder.

0x03 : Creacion del stub

Ahora vamos a codear el Stub para eso vamos a "File->New->VCL Forms Application" como lo hice en la imagen :



La idea es buscar el recurso en el ejecutable mismo , entonces para eso vamos a crear dos edits y un boton con el texto de "Get Values".

Despues deben poner como titulo del formulario "Stub" y cambiar los names de los edits de la siguiente forma :

Edit1 -> ip
Edit2 -> port

El formulario les deberia quedar algo asi :



Ahora hacemos doble click en el boton y ponemos el siguiente codigo :

Código: Delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   clave: integer; // Declaramos la variable "clave" como integer
  4.   datos: string; // Declaramos la variable "datos" como string
  5.   ip_found: string; // Declaramos la variable "ip_found" como string
  6.   port_found: string; // Declaramos la variable "port_found" como string
  7. begin
  8.   clave := 123; // Establecemos la variable "clave" como 123
  9.   datos := leer_recurso(clave); // Leemos el recurso usando el key que esta
  10.   // en la variable clave y guardamos los datos en la variable "datos"
  11.   ip_found := regex(datos, '[ip]', '[ip]');
  12.   // Usamos la funcion regex() para buscar
  13.   // la ip y la guardamos en la variable "ip_found"
  14.   port_found := regex(datos, '[port]', '[port]');
  15.   // Usamos la funcion regex() para
  16.   // buscar el puerto y lo guardamos en la variable "port_found"
  17.   ip.text := ip_found; // Mostramos en el edit "ip" la IP
  18.   port.text := port_found; // Mostramos en el edit "port" el puerto
  19.   ShowMessage('Loaded'); // Mostramos en pantalla un mensaje
  20. end;

Despues ponemos las siguientes funciones fuera del codigo del boton :

Código: Delphi
  1. function regex(text: string; deaca: string; hastaaca: string): string;
  2. begin
  3.   Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  4.   SetLength(text, AnsiPos(hastaaca, text) - 1);
  5.   Result := text;
  6. end;
  7. function xor_now(texto: string; clave: integer): string;
  8. // Funcion xor_now con el argumento
  9. // del texto a crifrar y la clave a usar
  10. var
  11.   numero: integer; // Declaramos la variable "numero" como entero
  12.   contenido: string; // Declaramos la variable "contenido" como string
  13. begin
  14.   contenido := ''; // Vaciamos la variable contenido
  15.   for numero := 1 to Length(texto) do // Realizamos un for del "1"
  16.   // a la longitud de la variable texto
  17.   begin
  18.     contenido := contenido + Char(integer(texto[numero]) xor clave);
  19.     // Realizamos el cifrado xor
  20.   end;
  21.   Result := contenido; // Devolvemos como resultado la variable contenido
  22. end;
  23. function leyendo_recurso: string;
  24. var
  25.   leyendo1: HRSRC; // Establecemos la variable "leyendo1" como HRSRC
  26.   leyendo2: DWORD; // Establecemos la variable "leyendo2" como DWORD
  27.   leyendo3: THandle; // Establecemos la variable "leyendo3" como THandle
  28.   leyendo4: pointer; // Establecemos la variable "leyendo4" como Pointer
  29. begin
  30.   leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
  31.   // Buscamos el recurso
  32.   // "CONFIGURATION"
  33.   leyendo2 := SizeofResource(hInstance, leyendo1);
  34.   // Calculamos la tamaño del recurso
  35.   leyendo3 := LoadResource(hInstance, leyendo1); // Cargamos el recurso
  36.   leyendo4 := LockResource(leyendo3);
  37.   // Bloqueamos el recurso para poder leerlo despues
  38.   if leyendo4 <> nil then // Si "leyendo4" no esta null ...
  39.   begin
  40.     SetLength(Result, leyendo2 - 1); // Cambiamos la longitud de Result
  41.     CopyMemory(@Result[1], leyendo4, leyendo2);
  42.     // Copiamos los datos al resultado de la funcion
  43.     FreeResource(leyendo3); // Liberamos el recurso
  44.   end;
  45. end;
  46. function leer_recurso(clave: integer): string;
  47. var
  48.   datos: string; // Declaramos la variable "datos" como string
  49. begin
  50.   datos := xor_now(leyendo_recurso, clave);
  51.   // Realizamos el cifrado xor con los datos que usamos
  52.   // como argumentos de la funcion leer_recurso()
  53.   datos := regex(datos, '-0x646F646479206861636B6D616E-',
  54.     '-0x646F646479206861636B6D616E-');
  55.   // Usamos la funcion regex() para cortar los delimitadores
  56.   // y encontrar asi los datos del recurso para despues guardar el
  57.   // resultado en la variable "datos"
  58.   Result := datos;
  59.   // Devolvemos como resultado lo que contiene la variable "datos"
  60. end;

El codigo les deberia quedar asi :



Guardan el proyecto con el nombre que quieran y con eso ya estaria listo el stub.

0x04 : Probando el programa

Para probarlo cargamos el builder y llenamos los campos de IP y Puerto como quieran , un ejemplo de como los complete yo seria  :



Despues presionan el boton "Make Server" y listo.

Ahora cargamos el stub y le damos al boton "Get Values" , deberian ver como resultado algo como esto :



Si no ven algo como en la imagen es porque hicieron algo mal en el codigo.

0x05 : Builder Tools

Como regalo les dejo esta Unit que hice en Delphi sobre como hacer un Builder , contiene funciones para EOF y Recursos , en los dos casos uso XOR para encriptar los datos , tambien viene con ejemplos de uso.

Solo deben agregar "builder_tools" en el parte de "uses" del codigo y listo , podran usar las funciones.

El codigo :

Código: Delphi
  1. // Unit : Builder Tools
  2. // Version : 0.2
  3. // (C) Doddy Hackman 2015
  4. // Credits : Resources based in http://www.hackforums.net/showthread.php?tid=1422700
  5. // Examples :
  6. // escribir_eof('stub.exe','-delimitador-','-delimitador-','test',123);
  7. // leer_eof('stub.exe','-delimitador-','-delimitador-',123);
  8. // escribir_recurso('stub.exe','test',123);
  9. // leer_recurso(123);
  10. unit builder_tools;
  11. interface
  12. uses SysUtils, Windows;
  13. function leer_eof(ruta, delimitador1, delimitador2: string;
  14.   clave: integer): string;
  15. function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
  16.   clave: integer): bool;
  17. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  18. function leyendo_recurso: string;
  19. function leer_recurso(clave: integer): string;
  20. function xor_now(texto: string; clave: integer): string;
  21. function regex(text: string; deaca: string; hastaaca: string): string;
  22. implementation
  23. function xor_now(texto: string; clave: integer): string;
  24. var
  25.   numero: integer;
  26.   contenido: string;
  27. begin
  28.   contenido := '';
  29.   for numero := 1 to Length(texto) do
  30.   begin
  31.     contenido := contenido + Char(integer(texto[numero]) xor clave);
  32.   end;
  33.   Result := contenido;
  34. end;
  35. function regex(text: string; deaca: string; hastaaca: string): string;
  36. begin
  37.   Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  38.   SetLength(text, AnsiPos(hastaaca, text) - 1);
  39.   Result := text;
  40. end;
  41. function leer_eof(ruta, delimitador1, delimitador2: string;
  42.   clave: integer): string;
  43. var
  44.   ob: THandle;
  45.   code: Array [0 .. 9999 + 1] of Char;
  46.   nose: DWORD;
  47.   resultado: string;
  48. begin
  49.   ob := INVALID_HANDLE_VALUE;
  50.   code := '';
  51.   ob := CreateFile(pchar(ruta), GENERIC_READ, FILE_SHARE_READ, nil,
  52.     OPEN_EXISTING, 0, 0);
  53.   if (ob <> INVALID_HANDLE_VALUE) then
  54.   begin
  55.     SetFilePointer(ob, -9999, nil, FILE_END);
  56.     ReadFile(ob, code, 9999, nose, nil);
  57.     CloseHandle(ob);
  58.   end;
  59.   resultado := regex(code, delimitador1, delimitador2);
  60.   resultado := xor_now(resultado, clave);
  61.   Result := resultado;
  62. end;
  63. function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
  64.   clave: integer): bool;
  65. var
  66.   linea: string;
  67.   aca: THandle;
  68.   code: Array [0 .. 9999 + 1] of Char;
  69.   nose: DWORD;
  70.   marca_uno: string;
  71.   marca_dos: string;
  72. begin
  73.   aca := INVALID_HANDLE_VALUE;
  74.   nose := 0;
  75.   begin
  76.     linea := delimitador1 + xor_now(texto, clave) + delimitador2;
  77.     StrCopy(code, pchar(linea));
  78.     aca := CreateFile(pchar(ruta), GENERIC_WRITE, FILE_SHARE_READ, nil,
  79.       OPEN_EXISTING, 0, 0);
  80.     if (aca <> INVALID_HANDLE_VALUE) then
  81.     begin
  82.       SetFilePointer(aca, 0, nil, FILE_END);
  83.       WriteFile(aca, code, 9999, nose, nil);
  84.       CloseHandle(aca);
  85.       Result := True;
  86.     end
  87.     else
  88.     begin
  89.       Result := False;
  90.     end;
  91.   end;
  92. end;
  93. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  94. var
  95.   escribiendo: THandle;
  96. begin
  97.   datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
  98.     '-0x646F646479206861636B6D616E-', clave);
  99.   escribiendo := BeginUpdateResource(pchar(ruta), False);
  100.   UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
  101.     pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
  102.   EndUpdateResource(escribiendo, False);
  103.   Result := True;
  104. end;
  105. function leyendo_recurso: string;
  106. var
  107.   leyendo1: HRSRC;
  108.   leyendo2: DWORD;
  109.   leyendo3: THandle;
  110.   leyendo4: pointer;
  111. begin
  112.   leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
  113.   leyendo2 := SizeofResource(hInstance, leyendo1);
  114.   leyendo3 := LoadResource(hInstance, leyendo1);
  115.   leyendo4 := LockResource(leyendo3);
  116.   if leyendo4 <> nil then
  117.   begin
  118.     SetLength(Result, leyendo2 - 1);
  119.     CopyMemory(@Result[1], leyendo4, leyendo2);
  120.     FreeResource(leyendo3);
  121.   end;
  122. end;
  123. function leer_recurso(clave: integer): string;
  124. var
  125.   datos: string;
  126. begin
  127.   datos := xor_now(leyendo_recurso, clave);
  128.   datos := regex(datos, '-0x646F646479206861636B6D616E-',
  129.     '-0x646F646479206861636B6D616E-');
  130.   Result := datos;
  131. end;
  132. end.
  133. // The End ?

Eso seria todo.

Version PDF.


Autor: Doddy