elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  [Delphi] Creacion de un Server Builder con recursos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Delphi] Creacion de un Server Builder con recursos  (Leído 1,749 veces)
BigBear


Desconectado Desconectado

Mensajes: 545



Ver Perfil
[Delphi] Creacion de un Server Builder con recursos
« en: 9 Marzo 2015, 18:45 pm »

[Titulo] : Creacion de un Server Builder con recursos
[Lenguaje] : Delphi
[Autor] : Doddy Hackman

[Temario]

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

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
  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;
  19.  

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

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

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
  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;
  21.  

Despues ponemos las siguientes funciones fuera del codigo del boton :

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

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 cifrar 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
  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.  
  11. unit builder_tools;
  12.  
  13. interface
  14.  
  15. uses SysUtils, Windows;
  16.  
  17. function leer_eof(ruta, delimitador1, delimitador2: string;
  18.  clave: integer): string;
  19. function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
  20.  clave: integer): bool;
  21. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  22. function leyendo_recurso: string;
  23. function leer_recurso(clave: integer): string;
  24. function xor_now(texto: string; clave: integer): string;
  25. function regex(text: string; deaca: string; hastaaca: string): string;
  26.  
  27. implementation
  28.  
  29. function xor_now(texto: string; clave: integer): string;
  30. var
  31.  numero: integer;
  32.  contenido: string;
  33. begin
  34.  contenido := '';
  35.  for numero := 1 to Length(texto) do
  36.  begin
  37.    contenido := contenido + Char(integer(texto[numero]) xor clave);
  38.  end;
  39.  Result := contenido;
  40. end;
  41.  
  42. function regex(text: string; deaca: string; hastaaca: string): string;
  43. begin
  44.  Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  45.  SetLength(text, AnsiPos(hastaaca, text) - 1);
  46.  Result := text;
  47. end;
  48.  
  49. function leer_eof(ruta, delimitador1, delimitador2: string;
  50.  clave: integer): string;
  51. var
  52.  ob: THandle;
  53.  code: Array [0 .. 9999 + 1] of Char;
  54.  nose: DWORD;
  55.  resultado: string;
  56.  
  57. begin
  58.  
  59.  ob := INVALID_HANDLE_VALUE;
  60.  code := '';
  61.  
  62.  ob := CreateFile(pchar(ruta), GENERIC_READ, FILE_SHARE_READ, nil,
  63.    OPEN_EXISTING, 0, 0);
  64.  if (ob <> INVALID_HANDLE_VALUE) then
  65.  begin
  66.    SetFilePointer(ob, -9999, nil, FILE_END);
  67.    ReadFile(ob, code, 9999, nose, nil);
  68.    CloseHandle(ob);
  69.  end;
  70.  
  71.  resultado := regex(code, delimitador1, delimitador2);
  72.  resultado := xor_now(resultado, clave);
  73.  Result := resultado;
  74.  
  75. end;
  76.  
  77. function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
  78.  clave: integer): bool;
  79. var
  80.  linea: string;
  81.  aca: THandle;
  82.  code: Array [0 .. 9999 + 1] of Char;
  83.  nose: DWORD;
  84.  marca_uno: string;
  85.  marca_dos: string;
  86.  
  87. begin
  88.  
  89.  aca := INVALID_HANDLE_VALUE;
  90.  nose := 0;
  91.  
  92.  begin
  93.    linea := delimitador1 + xor_now(texto, clave) + delimitador2;
  94.    StrCopy(code, pchar(linea));
  95.    aca := CreateFile(pchar(ruta), GENERIC_WRITE, FILE_SHARE_READ, nil,
  96.      OPEN_EXISTING, 0, 0);
  97.    if (aca <> INVALID_HANDLE_VALUE) then
  98.    begin
  99.      SetFilePointer(aca, 0, nil, FILE_END);
  100.      WriteFile(aca, code, 9999, nose, nil);
  101.      CloseHandle(aca);
  102.      Result := True;
  103.    end
  104.    else
  105.    begin
  106.      Result := False;
  107.    end;
  108.  end;
  109. end;
  110.  
  111. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  112. var
  113.  escribiendo: THandle;
  114. begin
  115.  datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
  116.    '-0x646F646479206861636B6D616E-', clave);
  117.  escribiendo := BeginUpdateResource(pchar(ruta), False);
  118.  UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
  119.    pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
  120.  EndUpdateResource(escribiendo, False);
  121.  Result := True;
  122. end;
  123.  
  124. function leyendo_recurso: string;
  125. var
  126.  leyendo1: HRSRC;
  127.  leyendo2: DWORD;
  128.  leyendo3: THandle;
  129.  leyendo4: pointer;
  130. begin
  131.  leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
  132.  leyendo2 := SizeofResource(hInstance, leyendo1);
  133.  leyendo3 := LoadResource(hInstance, leyendo1);
  134.  leyendo4 := LockResource(leyendo3);
  135.  if leyendo4 <> nil then
  136.  begin
  137.    SetLength(Result, leyendo2 - 1);
  138.    CopyMemory(@Result[1], leyendo4, leyendo2);
  139.    FreeResource(leyendo3);
  140.  end;
  141. end;
  142.  
  143. function leer_recurso(clave: integer): string;
  144. var
  145.  datos: string;
  146. begin
  147.  datos := xor_now(leyendo_recurso, clave);
  148.  datos := regex(datos, '-0x646F646479206861636B6D616E-',
  149.    '-0x646F646479206861636B6D616E-');
  150.  Result := datos;
  151. end;
  152.  
  153. end.
  154.  
  155. // The End ?
  156.  

Eso seria todo.

--========--
  The End ?
--========--

Version PDF.

Version en VideoTutorial :



« Última modificación: 9 Marzo 2015, 18:47 pm por Doddy » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema con recursos de power builder
Programación General
XpandyX 0 1,934 Último mensaje 12 Mayo 2012, 14:00 pm
por XpandyX
Creación de builder
Dudas Generales
Slore 0 1,572 Último mensaje 14 Julio 2012, 02:04 am
por Slore
[Delphi] Creacion de un Server Builder « 1 2 »
Programación General
BigBear 11 5,961 Último mensaje 17 Julio 2013, 13:16 pm
por OmarHack
[C#] Creacion de un Server Builder
.NET (C#, VB.NET, ASP)
BigBear 0 2,104 Último mensaje 29 Agosto 2014, 21:13 pm
por BigBear
[C#] Creacion de un Server Builder con recursos
.NET (C#, VB.NET, ASP)
BigBear 0 1,694 Último mensaje 10 Marzo 2015, 18:08 pm
por BigBear
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines