Advertisement
Doddy

[Delphi] Creacion de un Server Builder con recursos

Mar 9th, 2015
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.95 KB | None | 0 0
  1. [Titulo] : Creacion de un Server Builder con recursos
  2. [Lenguaje] : Delphi
  3. [Autor] : Doddy Hackman
  4.  
  5. [Temario]
  6.  
  7. -- =================--------
  8.  
  9. 0x01 : Introduccion
  10. 0x02 : Creacion del builder
  11. 0x03 : Creacion del stub
  12. 0x04 : Probando el programa
  13. 0x05 : Builder Tools
  14.  
  15. -- =================--------
  16.  
  17. 0x01 : Introduccion
  18.  
  19. 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.
  20.  
  21. Empecemos ...
  22.  
  23. 0x02 : Creacion del builder
  24.  
  25. Primero vamos hacer el builder , para eso vamos a "File->New->VCL Forms Application" como lo hice en la imagen :
  26.  
  27. [img]http://doddyhackman.webcindario.com/images/uno.jpg[/img]
  28.  
  29. Ahora creamos dos edit y boton con el texto de "Make Server" como en la siguiente imagen :
  30.  
  31. [img]http://doddyhackman.webcindario.com/images/builder_2_1.jpg[/img]
  32.  
  33. Despues deben cambiar el titulo del formulario a "Builder" y cambiarle el nombre por defecto que tienen los edits de la siguiente forma :
  34.  
  35. Edit1 -> ip
  36. Edit2 -> port
  37.  
  38. Una vez hecho , hacemos doble click en el boton y agregamos el siguiente codigo :
  39.  
  40. [code]
  41. procedure TForm1.Button1Click(Sender: TObject);
  42. var
  43. archivo: string; // Declaramos la variable "archivo" como string
  44. datos: string; // Declaramos la variable "datos" como string
  45. clave: integer; // Declaramos la variable "clave" como integer
  46. begin
  47. archivo := 'stubnow.exe';
  48. // Establecemos la variable "archivo" como el nombre del ejecutable
  49. // que vamos abrir
  50. datos := '[ip]' + ip.Text + '[ip]' + '[port]' + port.Text + '[port]';
  51. // Establecemos los datos que contiene la IP y el puerto separados por etiquetas
  52. // y los guardamos en la variable "datos"
  53. clave := 123; // Establecemos la variable "clave" como "123"
  54. escribir_recurso(archivo, datos, clave);
  55. // Escribimos el recurso usando la funcion
  56. // "escribir_recurso" usando como argumentos las variables que acabamos de establecer
  57. ShowMessage('Done'); // Mostramos un mensaje en pantalla
  58. end;
  59. [/code]
  60.  
  61. Fuera del codigo de la funcion "click" del boton agregamos el codigo de estas dos funciones :
  62.  
  63. [code]
  64. function xor_now(texto: string; clave: integer): string;
  65. // Funcion xor_now con el argumento
  66. // del texto a crifrar y la clave a usar
  67.  
  68. var
  69. numero: integer; // Declaramos la variable "numero" como entero
  70. contenido: string; // Declaramos la variable "contenido" como string
  71. begin
  72. contenido := ''; // Vaciamos la variable contenido
  73. for numero := 1 to Length(texto) do // Realizamos un for del "1"
  74. // a la longitud de la variable texto
  75. begin
  76. contenido := contenido + Char(integer(texto[numero]) xor clave);
  77. // Realizamos el cifrado xor
  78. end;
  79. Result := contenido; // Devolvemos como resultado la variable "contenido"
  80. end;
  81.  
  82. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  83. var
  84. escribiendo: THandle; // Declaramos la variable "escribiendo" como THandle
  85. begin
  86. datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
  87. '-0x646F646479206861636B6D616E-', clave);
  88. // Ciframos los datos usando la funcion xor_now
  89. // Los parametros que usamos en la funcion xor_now son la variable "datos" como el texto
  90. // a cifrar , los "datos" estan entre dos delimitadores para facilitar su busqueda y
  91. // tambien usamos la variable "clave" como key en el cifrado xor
  92. escribiendo := BeginUpdateResource(pchar(ruta), False);
  93. // Empezamos el inicio de de la creacion
  94. // del recurso usando la variable "ruta"
  95. UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
  96. pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
  97. // Escribimos el recurso usando
  98. // la variable "datos" como el contenido del recurso y como nombre del recurso usamos
  99. // "CONFIGURATION"
  100. EndUpdateResource(escribiendo, False); // Terminamos de crear el recurso
  101. Result := True; // Devolvemos True como resultado de la funcion
  102. end;
  103. [/code]
  104.  
  105. Les deberia quedar algo asi :
  106.  
  107. [img]http://doddyhackman.webcindario.com/images/builder_2_2.jpg[/img]
  108.  
  109. Con eso ya estaria el builder entonces guardamos el proyecto como "builder_now" o como quieran para terminar el builder.
  110.  
  111. 0x03 : Creacion del stub
  112.  
  113. Ahora vamos a codear el Stub para eso vamos a "File->New->VCL Forms Application" como lo hice en la imagen :
  114.  
  115. [img]http://doddyhackman.webcindario.com/images/uno.jpg[/img]
  116.  
  117. 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".
  118.  
  119. Despues deben poner como titulo del formulario "Stub" y cambiar los names de los edits de la siguiente forma :
  120.  
  121. Edit1 -> ip
  122. Edit2 -> port
  123.  
  124. El formulario les deberia quedar algo asi :
  125.  
  126. [img]http://doddyhackman.webcindario.com/images/builder_2_3.jpg[/img]
  127.  
  128. Ahora hacemos doble click en el boton y ponemos el siguiente codigo :
  129.  
  130. [code]
  131. procedure TForm1.Button1Click(Sender: TObject);
  132. var
  133. clave: integer; // Declaramos la variable "clave" como integer
  134. datos: string; // Declaramos la variable "datos" como string
  135. ip_found: string; // Declaramos la variable "ip_found" como string
  136. port_found: string; // Declaramos la variable "port_found" como string
  137. begin
  138. clave := 123; // Establecemos la variable "clave" como 123
  139. datos := leer_recurso(clave); // Leemos el recurso usando el key que esta
  140. // en la variable clave y guardamos los datos en la variable "datos"
  141. ip_found := regex(datos, '[ip]', '[ip]');
  142. // Usamos la funcion regex() para buscar
  143. // la ip y la guardamos en la variable "ip_found"
  144. port_found := regex(datos, '[port]', '[port]');
  145. // Usamos la funcion regex() para
  146. // buscar el puerto y lo guardamos en la variable "port_found"
  147. ip.text := ip_found; // Mostramos en el edit "ip" la IP
  148. port.text := port_found; // Mostramos en el edit "port" el puerto
  149. ShowMessage('Loaded'); // Mostramos en pantalla un mensaje
  150. end;
  151. [/code]
  152.  
  153. Despues ponemos las siguientes funciones fuera del codigo del boton :
  154.  
  155. [code]
  156. function regex(text: string; deaca: string; hastaaca: string): string;
  157. begin
  158. Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  159. SetLength(text, AnsiPos(hastaaca, text) - 1);
  160. Result := text;
  161. end;
  162.  
  163. function xor_now(texto: string; clave: integer): string;
  164. // Funcion xor_now con el argumento
  165. // del texto a crifrar y la clave a usar
  166.  
  167. var
  168. numero: integer; // Declaramos la variable "numero" como entero
  169. contenido: string; // Declaramos la variable "contenido" como string
  170. begin
  171. contenido := ''; // Vaciamos la variable contenido
  172. for numero := 1 to Length(texto) do // Realizamos un for del "1"
  173. // a la longitud de la variable texto
  174. begin
  175. contenido := contenido + Char(integer(texto[numero]) xor clave);
  176. // Realizamos el cifrado xor
  177. end;
  178. Result := contenido; // Devolvemos como resultado la variable contenido
  179. end;
  180.  
  181. function leyendo_recurso: string;
  182. var
  183. leyendo1: HRSRC; // Establecemos la variable "leyendo1" como HRSRC
  184. leyendo2: DWORD; // Establecemos la variable "leyendo2" como DWORD
  185. leyendo3: THandle; // Establecemos la variable "leyendo3" como THandle
  186. leyendo4: pointer; // Establecemos la variable "leyendo4" como Pointer
  187. begin
  188. leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
  189. // Buscamos el recurso
  190. // "CONFIGURATION"
  191. leyendo2 := SizeofResource(hInstance, leyendo1);
  192. // Calculamos la tamaño del recurso
  193. leyendo3 := LoadResource(hInstance, leyendo1); // Cargamos el recurso
  194. leyendo4 := LockResource(leyendo3);
  195. // Bloqueamos el recurso para poder leerlo despues
  196. if leyendo4 <> nil then // Si "leyendo4" no esta null ...
  197. begin
  198. SetLength(Result, leyendo2 - 1); // Cambiamos la longitud de Result
  199. CopyMemory(@Result[1], leyendo4, leyendo2);
  200. // Copiamos los datos al resultado de la funcion
  201. FreeResource(leyendo3); // Liberamos el recurso
  202. end;
  203. end;
  204.  
  205. function leer_recurso(clave: integer): string;
  206. var
  207. datos: string; // Declaramos la variable "datos" como string
  208. begin
  209. datos := xor_now(leyendo_recurso, clave);
  210. // Realizamos el cifrado xor con los datos que usamos
  211. // como argumentos de la funcion leer_recurso()
  212. datos := regex(datos, '-0x646F646479206861636B6D616E-',
  213. '-0x646F646479206861636B6D616E-');
  214. // Usamos la funcion regex() para cortar los delimitadores
  215. // y encontrar asi los datos del recurso para despues guardar el
  216. // resultado en la variable "datos"
  217. Result := datos;
  218. // Devolvemos como resultado lo que contiene la variable "datos"
  219. end;
  220. [/code]
  221.  
  222. El codigo les deberia quedar asi :
  223.  
  224. [img]http://doddyhackman.webcindario.com/images/builder_2_4.jpg[/img]
  225.  
  226. Guardan el proyecto con el nombre que quieran y con eso ya estaria listo el stub.
  227.  
  228. 0x04 : Probando el programa
  229.  
  230. Para probarlo cargamos el builder y llenamos los campos de IP y Puerto como quieran , un ejemplo de como los complete yo seria :
  231.  
  232. [img]http://doddyhackman.webcindario.com/images/builder_2_5.jpg[/img]
  233.  
  234. Despues presionan el boton "Make Server" y listo.
  235.  
  236. Ahora cargamos el stub y le damos al boton "Get Values" , deberian ver como resultado algo como esto :
  237.  
  238. [img]http://doddyhackman.webcindario.com/images/builder_2_6.jpg[/img]
  239.  
  240. Si no ven algo como en la imagen es porque hicieron algo mal en el codigo.
  241.  
  242. 0x05 : Builder Tools
  243.  
  244. 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.
  245.  
  246. Solo deben agregar "builder_tools" en el parte de "uses" del codigo y listo , podran usar las funciones.
  247.  
  248. El codigo :
  249.  
  250. [code]
  251. // Unit : Builder Tools
  252. // Version : 0.2
  253. // (C) Doddy Hackman 2015
  254. // Credits : Resources based in http://www.hackforums.net/showthread.php?tid=1422700
  255. // Examples :
  256. // escribir_eof('stub.exe','-delimitador-','-delimitador-','test',123);
  257. // leer_eof('stub.exe','-delimitador-','-delimitador-',123);
  258. // escribir_recurso('stub.exe','test',123);
  259. // leer_recurso(123);
  260.  
  261. unit builder_tools;
  262.  
  263. interface
  264.  
  265. uses SysUtils, Windows;
  266.  
  267. function leer_eof(ruta, delimitador1, delimitador2: string;
  268. clave: integer): string;
  269. function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
  270. clave: integer): bool;
  271. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  272. function leyendo_recurso: string;
  273. function leer_recurso(clave: integer): string;
  274. function xor_now(texto: string; clave: integer): string;
  275. function regex(text: string; deaca: string; hastaaca: string): string;
  276.  
  277. implementation
  278.  
  279. function xor_now(texto: string; clave: integer): string;
  280. var
  281. numero: integer;
  282. contenido: string;
  283. begin
  284. contenido := '';
  285. for numero := 1 to Length(texto) do
  286. begin
  287. contenido := contenido + Char(integer(texto[numero]) xor clave);
  288. end;
  289. Result := contenido;
  290. end;
  291.  
  292. function regex(text: string; deaca: string; hastaaca: string): string;
  293. begin
  294. Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  295. SetLength(text, AnsiPos(hastaaca, text) - 1);
  296. Result := text;
  297. end;
  298.  
  299. function leer_eof(ruta, delimitador1, delimitador2: string;
  300. clave: integer): string;
  301. var
  302. ob: THandle;
  303. code: Array [0 .. 9999 + 1] of Char;
  304. nose: DWORD;
  305. resultado: string;
  306.  
  307. begin
  308.  
  309. ob := INVALID_HANDLE_VALUE;
  310. code := '';
  311.  
  312. ob := CreateFile(pchar(ruta), GENERIC_READ, FILE_SHARE_READ, nil,
  313. OPEN_EXISTING, 0, 0);
  314. if (ob <> INVALID_HANDLE_VALUE) then
  315. begin
  316. SetFilePointer(ob, -9999, nil, FILE_END);
  317. ReadFile(ob, code, 9999, nose, nil);
  318. CloseHandle(ob);
  319. end;
  320.  
  321. resultado := regex(code, delimitador1, delimitador2);
  322. resultado := xor_now(resultado, clave);
  323. Result := resultado;
  324.  
  325. end;
  326.  
  327. function escribir_eof(ruta, delimitador1, delimitador2, texto: string;
  328. clave: integer): bool;
  329. var
  330. linea: string;
  331. aca: THandle;
  332. code: Array [0 .. 9999 + 1] of Char;
  333. nose: DWORD;
  334. marca_uno: string;
  335. marca_dos: string;
  336.  
  337. begin
  338.  
  339. aca := INVALID_HANDLE_VALUE;
  340. nose := 0;
  341.  
  342. begin
  343. linea := delimitador1 + xor_now(texto, clave) + delimitador2;
  344. StrCopy(code, pchar(linea));
  345. aca := CreateFile(pchar(ruta), GENERIC_WRITE, FILE_SHARE_READ, nil,
  346. OPEN_EXISTING, 0, 0);
  347. if (aca <> INVALID_HANDLE_VALUE) then
  348. begin
  349. SetFilePointer(aca, 0, nil, FILE_END);
  350. WriteFile(aca, code, 9999, nose, nil);
  351. CloseHandle(aca);
  352. Result := True;
  353. end
  354. else
  355. begin
  356. Result := False;
  357. end;
  358. end;
  359. end;
  360.  
  361. function escribir_recurso(ruta: string; datos: string; clave: integer): bool;
  362. var
  363. escribiendo: THandle;
  364. begin
  365. datos := xor_now('-0x646F646479206861636B6D616E-' + datos +
  366. '-0x646F646479206861636B6D616E-', clave);
  367. escribiendo := BeginUpdateResource(pchar(ruta), False);
  368. UpdateResource(escribiendo, MakeIntResource(10), 'CONFIGURATION', 0,
  369. pchar(datos), (Length(datos) + 1) * SizeOf(datos[1]));
  370. EndUpdateResource(escribiendo, False);
  371. Result := True;
  372. end;
  373.  
  374. function leyendo_recurso: string;
  375. var
  376. leyendo1: HRSRC;
  377. leyendo2: DWORD;
  378. leyendo3: THandle;
  379. leyendo4: pointer;
  380. begin
  381. leyendo1 := FindResource(hInstance, 'CONFIGURATION', RT_RCDATA);
  382. leyendo2 := SizeofResource(hInstance, leyendo1);
  383. leyendo3 := LoadResource(hInstance, leyendo1);
  384. leyendo4 := LockResource(leyendo3);
  385. if leyendo4 <> nil then
  386. begin
  387. SetLength(Result, leyendo2 - 1);
  388. CopyMemory(@Result[1], leyendo4, leyendo2);
  389. FreeResource(leyendo3);
  390. end;
  391. end;
  392.  
  393. function leer_recurso(clave: integer): string;
  394. var
  395. datos: string;
  396. begin
  397. datos := xor_now(leyendo_recurso, clave);
  398. datos := regex(datos, '-0x646F646479206861636B6D616E-',
  399. '-0x646F646479206861636B6D616E-');
  400. Result := datos;
  401. end;
  402.  
  403. end.
  404.  
  405. // The End ?
  406. [/code]
  407.  
  408. Eso seria todo.
  409.  
  410. --========--
  411. The End ?
  412. --========--
  413.  
  414. [URL=http://doddyhackman.webcindario.com/descargas/creando_un_builder_con_recursos_en_delphi.pdf]Version PDF[/URL].
  415.  
  416. [URL=https://www.youtube.com/watch?v=RQw7NEG94go]Version VideoTutorial[/URL].
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement