Creacion de un Server Builder con recursos
-- =================--------
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
- procedure TForm1.Button1Click(Sender: TObject);
- var
- archivo: string; // Declaramos la variable "archivo" como string
- datos: string; // Declaramos la variable "datos" como string
- clave: integer; // Declaramos la variable "clave" como integer
- begin
- archivo := 'stubnow.exe';
- // Establecemos la variable "archivo" como el nombre del ejecutable
- // que vamos abrir
- datos := '[ip]' + ip.Text + '[ip]' + '[port]' + port.Text + '[port]';
- // Establecemos los datos que contiene la IP y el puerto separados por etiquetas
- // y los guardamos en la variable "datos"
- clave := 123; // Establecemos la variable "clave" como "123"
- escribir_recurso(archivo, datos, clave);
- // Escribimos el recurso usando la funcion
- // "escribir_recurso" usando como argumentos las variables que acabamos de establecer
- ShowMessage('Done'); // Mostramos un mensaje en pantalla
- end;
Fuera del codigo de la funcion "click" del boton agregamos el codigo de estas dos funciones :
Código: Delphi
- function xor_now(texto: string; clave: integer): string;
- // Funcion xor_now con el argumento
- // del texto a crifrar y la clave a usar
- var
- numero: integer; // Declaramos la variable "numero" como entero
- contenido: string; // Declaramos la variable "contenido" como string
- begin
- contenido := ''; // Vaciamos la variable contenido
- for numero := 1 to Length(texto) do // Realizamos un for del "1"
- // a la longitud de la variable texto
- begin
- contenido := contenido + Char(integer(texto[numero]) xor clave);
- // Realizamos el cifrado xor
- end;
- Result := contenido; // Devolvemos como resultado la variable "contenido"
- end;
- function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
- var
- escribiendo: THandle; // Declaramos la variable "escribiendo" como THandle
- begin
- datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
- '-0x646F646479206861636B6D616E-', clave);
- // Ciframos los datos usando la funcion xor_now
- // Los parametros que usamos en la funcion xor_now son la variable "datos" como el texto
- // a cifrar , los "datos" estan entre dos delimitadores para facilitar su busqueda y
- // tambien usamos la variable "clave" como key en el cifrado xor
- escribiendo := BeginUpdateResource(pchar(ruta), False);
- // Empezamos el inicio de de la creacion
- // del recurso usando la variable "ruta"
- UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
- pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
- // Escribimos el recurso usando
- // la variable "datos" como el contenido del recurso y como nombre del recurso usamos
- // "CONFIGURATION"
- EndUpdateResource(escribiendo, False); // Terminamos de crear el recurso
- Result := True; // Devolvemos True como resultado de la funcion
- 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
- procedure TForm1.Button1Click(Sender: TObject);
- var
- clave: integer; // Declaramos la variable "clave" como integer
- datos: string; // Declaramos la variable "datos" como string
- ip_found: string; // Declaramos la variable "ip_found" como string
- port_found: string; // Declaramos la variable "port_found" como string
- begin
- clave := 123; // Establecemos la variable "clave" como 123
- datos := leer_recurso(clave); // Leemos el recurso usando el key que esta
- // en la variable clave y guardamos los datos en la variable "datos"
- ip_found := regex(datos, '[ip]', '[ip]');
- // Usamos la funcion regex() para buscar
- // la ip y la guardamos en la variable "ip_found"
- port_found := regex(datos, '[port]', '[port]');
- // Usamos la funcion regex() para
- // buscar el puerto y lo guardamos en la variable "port_found"
- ip.text := ip_found; // Mostramos en el edit "ip" la IP
- port.text := port_found; // Mostramos en el edit "port" el puerto
- ShowMessage('Loaded'); // Mostramos en pantalla un mensaje
- end;
Despues ponemos las siguientes funciones fuera del codigo del boton :
Código: Delphi
- function regex(text: string; deaca: string; hastaaca: string): string;
- begin
- Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
- SetLength(text, AnsiPos(hastaaca, text) - 1);
- Result := text;
- end;
- function xor_now(texto: string; clave: integer): string;
- // Funcion xor_now con el argumento
- // del texto a crifrar y la clave a usar
- var
- numero: integer; // Declaramos la variable "numero" como entero
- contenido: string; // Declaramos la variable "contenido" como string
- begin
- contenido := ''; // Vaciamos la variable contenido
- for numero := 1 to Length(texto) do // Realizamos un for del "1"
- // a la longitud de la variable texto
- begin
- contenido := contenido + Char(integer(texto[numero]) xor clave);
- // Realizamos el cifrado xor
- end;
- Result := contenido; // Devolvemos como resultado la variable contenido
- end;
- function leyendo_recurso: string;
- var
- leyendo1: HRSRC; // Establecemos la variable "leyendo1" como HRSRC
- leyendo2: DWORD; // Establecemos la variable "leyendo2" como DWORD
- leyendo3: THandle; // Establecemos la variable "leyendo3" como THandle
- leyendo4: pointer; // Establecemos la variable "leyendo4" como Pointer
- begin
- leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
- // Buscamos el recurso
- // "CONFIGURATION"
- leyendo2 := SizeofResource(hInstance, leyendo1);
- // Calculamos la tamaño del recurso
- leyendo3 := LoadResource(hInstance, leyendo1); // Cargamos el recurso
- leyendo4 := LockResource(leyendo3);
- // Bloqueamos el recurso para poder leerlo despues
- if leyendo4 <> nil then // Si "leyendo4" no esta null ...
- begin
- SetLength(Result, leyendo2 - 1); // Cambiamos la longitud de Result
- CopyMemory(@Result[1], leyendo4, leyendo2);
- // Copiamos los datos al resultado de la funcion
- FreeResource(leyendo3); // Liberamos el recurso
- end;
- end;
- function leer_recurso(clave: integer): string;
- var
- datos: string; // Declaramos la variable "datos" como string
- begin
- datos := xor_now(leyendo_recurso, clave);
- // Realizamos el cifrado xor con los datos que usamos
- // como argumentos de la funcion leer_recurso()
- datos := regex(datos, '-0x646F646479206861636B6D616E-',
- '-0x646F646479206861636B6D616E-');
- // Usamos la funcion regex() para cortar los delimitadores
- // y encontrar asi los datos del recurso para despues guardar el
- // resultado en la variable "datos"
- Result := datos;
- // Devolvemos como resultado lo que contiene la variable "datos"
- 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
- // Unit : Builder Tools
- // Version : 0.2
- // (C) Doddy Hackman 2015
- // Credits : Resources based in http://www.hackforums.net/showthread.php?tid=1422700
- // Examples :
- // escribir_eof('stub.exe','-delimitador-','-delimitador-','test',123);
- // leer_eof('stub.exe','-delimitador-','-delimitador-',123);
- // escribir_recurso('stub.exe','test',123);
- // leer_recurso(123);
- unit builder_tools;
- interface
- uses SysUtils, Windows;
- function leer_eof(ruta, delimitador1, delimitador2: string;
- clave: integer): string;
- function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
- clave: integer): bool;
- function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
- function leyendo_recurso: string;
- function leer_recurso(clave: integer): string;
- function xor_now(texto: string; clave: integer): string;
- function regex(text: string; deaca: string; hastaaca: string): string;
- implementation
- function xor_now(texto: string; clave: integer): string;
- var
- numero: integer;
- contenido: string;
- begin
- contenido := '';
- for numero := 1 to Length(texto) do
- begin
- contenido := contenido + Char(integer(texto[numero]) xor clave);
- end;
- Result := contenido;
- end;
- function regex(text: string; deaca: string; hastaaca: string): string;
- begin
- Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
- SetLength(text, AnsiPos(hastaaca, text) - 1);
- Result := text;
- end;
- function leer_eof(ruta, delimitador1, delimitador2: string;
- clave: integer): string;
- var
- ob: THandle;
- code: Array [0 .. 9999 + 1] of Char;
- nose: DWORD;
- resultado: string;
- begin
- ob := INVALID_HANDLE_VALUE;
- code := '';
- ob := CreateFile(pchar(ruta), GENERIC_READ, FILE_SHARE_READ, nil,
- OPEN_EXISTING, 0, 0);
- if (ob <> INVALID_HANDLE_VALUE) then
- begin
- SetFilePointer(ob, -9999, nil, FILE_END);
- ReadFile(ob, code, 9999, nose, nil);
- CloseHandle(ob);
- end;
- resultado := regex(code, delimitador1, delimitador2);
- resultado := xor_now(resultado, clave);
- Result := resultado;
- end;
- function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
- clave: integer): bool;
- var
- linea: string;
- aca: THandle;
- code: Array [0 .. 9999 + 1] of Char;
- nose: DWORD;
- marca_uno: string;
- marca_dos: string;
- begin
- aca := INVALID_HANDLE_VALUE;
- nose := 0;
- begin
- linea := delimitador1 + xor_now(texto, clave) + delimitador2;
- StrCopy(code, pchar(linea));
- aca := CreateFile(pchar(ruta), GENERIC_WRITE, FILE_SHARE_READ, nil,
- OPEN_EXISTING, 0, 0);
- if (aca <> INVALID_HANDLE_VALUE) then
- begin
- SetFilePointer(aca, 0, nil, FILE_END);
- WriteFile(aca, code, 9999, nose, nil);
- CloseHandle(aca);
- Result := True;
- end
- else
- begin
- Result := False;
- end;
- end;
- end;
- function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
- var
- escribiendo: THandle;
- begin
- datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
- '-0x646F646479206861636B6D616E-', clave);
- escribiendo := BeginUpdateResource(pchar(ruta), False);
- UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
- pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
- EndUpdateResource(escribiendo, False);
- Result := True;
- end;
- function leyendo_recurso: string;
- var
- leyendo1: HRSRC;
- leyendo2: DWORD;
- leyendo3: THandle;
- leyendo4: pointer;
- begin
- leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
- leyendo2 := SizeofResource(hInstance, leyendo1);
- leyendo3 := LoadResource(hInstance, leyendo1);
- leyendo4 := LockResource(leyendo3);
- if leyendo4 <> nil then
- begin
- SetLength(Result, leyendo2 - 1);
- CopyMemory(@Result[1], leyendo4, leyendo2);
- FreeResource(leyendo3);
- end;
- end;
- function leer_recurso(clave: integer): string;
- var
- datos: string;
- begin
- datos := xor_now(leyendo_recurso, clave);
- datos := regex(datos, '-0x646F646479206861636B6D616E-',
- '-0x646F646479206861636B6D616E-');
- Result := datos;
- end;
- end.
- // The End ?
Eso seria todo.
Version PDF.
Autor: Doddy