Como remover manualmente una protección VBOX 4.3.

Publicado por +Tsehp, 26 de marzo, 2000.
Traducido por ^[G]oLe[E]^, 25 de Enero, 2001

 

 

 

 

*Nota de Tsehp : Este Ensayo trabaja sobre el constructor VBOX version 4.3.

Realmente no trabaja en versiones anteriores, como netfusion 5 por ejemplo.

 

 


-----------------------------------------------------------

   Un tutorial escrito por dEZZY / Beber o Morir

 

General

-------

Este documento está escrito como una guia para remover manualmente una

protección vbox 4.3. Este es un protector comercial muy difícil

que envolverá un programa desprotegido en un sistema donde

puede ser distribuido en Internet como un software de prueba. Info

sobre VBOX puede ser encontrada en http://www.previewsystems.com.

 

Herramientas usadas

----------

* SoftICE 4.01 (o TRW2000 v1.13)

* SoftICE Backdoor Keeper

* Procdump 1.6.2 FINAL de G-RoM (hola compañero!)

Todas las herramientas pueden ser descargadas de http://protools.cjb.net

 

Comenzando

---------------

Si tienes parchado SoftICE con icepatch o sice backdoor

keeper, salta a la siguiente sección. Si no, tienes que vencer

la rutina de detección de sice manualmente.

 

Nota: También puedes evitar esta molesta detección usando

TRW2000 con Faults=off.

 

Evitando la detección del SoftICE

---------------------------

Carga el programa usando Sice o trw con la opción "faults = on" fijada.

El programa caerá en una parte del código que se ve así:

 

 MOV ECX,ESP

 MOV EAX,ECX  <-- Cae Aquí

 POP EDI

 POP ESI

 POP EBP

 RET

 Y el debugger te da el siguiente mensaje:

"Break Due on Fault 03"

 

 Rastrea al RET y saldrás a la rutina que se ve así:

070049D9 8B45F8      MOV EAX,[EBP-08]

070049DC 8B4024      MOV EAX,[EAX+24]

070049DF 8945FC      MOV [EBP-04],EAX      <-- BMP aquí

070049E2 68EA490007  PUSH DWORD 070049EA

070049E7 FF65FC      JMP NEAR [EBP-04]

070049EA 33C0        XOR EAX,EAX           <-- Ordenamos aquí

070049EC 5F          POP EDI

070049ED 5E          POP ESI

070049EE 5B          POP EBX

070049EF C9          LEAVE

070049F0 C3          RET

 

Ahora, fija un bpm para la ejecución en 070049DF (bpm cs:070049DF x) y reinicia el programa.  Una vez que llegué allí, mueve 0 a EAX (r eax 0)

Y continua leyendo el tutorial presionando F5.

 

 

Nota: Si no puede encontrar la rutina mencionada arriba, fija un bpx en

Kernel32!RaiseException, una vez aparezca sice, depura el siguiente

CALL [alguna dirección], y luego dentro del siguiente CALL, y dentro de un

INT 2E y sigue depurando hasta que alcances el IRETD, F8 para ir dentro y

Aparecerás en un RET justo despues del INT 2E.  Ahora mantente depurando hasta que salgas a un CALL VirtualFree.  Bien, mira 50 o 60 líneas abajo en la ventana de código y verás la rutina.

 

Omitindo la Encriptación IAT (Nueva desde VBOX v4.2)

--------------------------------------------

"El código principal de VBOX v4.3 es muy parecido a la vieja versión 4.2.

La única diferencia es que ahora VBOX encripta el IAT mientras carga el programa .  Y redirige las direcciones de las funciones importadas a la rutina en VBOXT430.DLL que las desencripta.  De esta forma el programa depende de VBOXT430.DLL para trabajar y un volcado normal resulta´ra en un IAT inservible.  Así que también lo crackearemos."

 

Antes de que presiones el botón Try, ingresa a SICE y fija un

'bpx GetProcAddress'.  Cuando SICE aparece dentro de GetProcAddress,

has un 'p ret' para salir.  Ahora deberías estar viendo el siguiente código:

 

015F:0700BB36  PUSH      DWORD PTR [EBP-20]                                   

015F:0700BB39  CALL      [KERNEL32!GetProcAddress]                            

015F:0700BB3F  MOV       EDI,EAX              <-- Estás aquí

015F:0700BB41  CMP       EDI,EBX                                               

015F:0700BB43  JZ        0700BCE6                                               

015F:0700BB49  MOV       ESI,[ESI+16]                                          

015F:0700BB4C  ADD       ESI,[EBP+08]                                          

015F:0700BB4F  CMP       [EBP-24],EBX         <-- llama a la función de encriptación?

015F:0700BB52  JZ        0700BB89             <-- salta si no

015F:0700BB54  LEA       EAX,[EBP-0114]      

015F:0700BB5A  PUSH      EAX                 

015F:0700BB5B  PUSH      DWORD PTR [EBP-20]  

015F:0700BB5E  PUSH      EDI                

015F:0700BB5F  CALL      0700BF61            

015F:0700BB64  ADD       ESP,0C              

015F:0700BB67  TEST      EAX,EAX             

015F:0700BB69  JZ        0700BB89            

015F:0700BB6B  PUSH      DWORD PTR [EBP+28]  

015F:0700BB6E  PUSH      EDI                 

015F:0700BB6F  PUSH      DWORD PTR [EBP+24]  

015F:0700BB72  PUSH      DWORD PTR [EBP+20] 

015F:0700BB75  CALL      0700BDFE           

015F:0700BB7A  ADD       ESP,10             

015F:0700BB7D  CMP       EAX,EBX            

015F:0700BB7F  JZ        0700BDD6              

015F:0700BB85  MOV       [ESI],EAX            <-- eax=encriptado

015F:0700BB87  JMP       0700BB8B             

015F:0700BB89  MOV       [ESI],EDI            <-- eax=no encriptado

015F:0700BB8B  INC       DWORD PTR [EBP-28]  

015F:0700BB8E  MOV       EAX,[EBP-28]                                          

015F:0700BB91  CMP       EAX,[EBP-4C]                                         

015F:0700BB94  JL        0700B9E3                                         

 

Este código trabaja como un cargador OS.  Después de obtener las direcciones de las funciones, algunas de estas están encriptadas antes de almacenarse en la IAT.  Lo que debemos hacer aquí es parchear la rutina para saltar la encripción de todas las direcciones.  Esto se hace cambiando la instrucción JZ en 700BB52 por un JMP 0700BB89.

 

Preparandote para el Volcado

----------------------------

Ahora puedes hacer muchas veces el 'p ret' hasta que regreses de un 'call edi'.

Fija un bmp en ejecución en él y sal de SICE.  Cuando llegue de nuevo, camina en esa llamada a función.  Notarás que el código cambia mientras rastreas dentro de él.  Eso está bien.  Camina en la primer llamada a función aquí.  Ahora busca un 'call eax' con EAX apuntando a GetProcAddress

Casi 50-70 líneas abajo.  Rastreala.  Luego camina en ella y dentro en la siguiente llamada a función.  Aquí verás el siguiente código cerca de 30 líneas abajo:

 

015F:011604E0  MOV       EDX,[EBP-08]

015F:011604E3  MOV       EAX,[EDX+14]   <-- obtiene el Punto de Entrada de la aplicación

015F:011604E6  MOV       [EBP-10],EAX

015F:011604E9  MOV       EBX,[EBP-10]   <-- El EP va a EBX

015F:011604EC  JMP       EBX            <-- Salta al Punto de Entrada Real

 

Rastrea hasta que alcances JMP EBX.  Ahora ensambla y escribe 'JMP EIP'

(a eip; jmp eip) así que se verá así:

 

015F:011604EC  JMP       011604EC       <-- bloqueado, salta a sí mismo

 

(En caso no puedas ensamblar, los bytes para JMP EIP son: EB FE)

 

Así, cuando salgas de SICE, el proceso se bloqueará en esta instrucción. 

Presiona F5 para seguir.

 

Inicia procdump.exe, ve a estas opciones.  En 'structure',

selecciona todo.  En imports, selecciona 'rebuild new import

table'. Selecciona el proceso en Procdump con el botón derecho del mouse,

y has un volcado (completo).  Dale un nombre (dump.exe).  Ahora, clic en

"PE Editor" y selecciona el archivo dump.exe.  En la caja "Entry

Point" deberías ingresar el Punto de Entrada correcto.  Recuerda que esto es

el valor de EBX en la última instrucción (JMP EBX) - ImageBase.

 PE Punto de Entrada = EBX - ImageBase (00400000)

Así, por ejemplo, si EBX era 450983, el punto de entrada que tienes que ingresar

en el encabezado PE de tu archivo dump.exe es:

 450983-400000 = 50983

Presiona Ok para grabar los cambios.

 

Ahora tienes un exe funcionando sin la protección vbox en tu Disco Duro.

Felicitaciones.

 

Ahora qué?

---------

Opcionalmente puedes reoptimizar el encabezado PE con MakePE o

algo.  Y para terminar puedes empacarlo con  PECompact o

algún otro empacador de ejecutables.

 

------------------------------------------------------

Addendum: Ultrarápido crackeo de Vbox 4.3 usando TRW2000

------------------------------------------------------

 Herramientas necesarias: solo la versión registrada de TRW2000 v1.11+

 Tiempo estimado: 30 secs

 

 1) ejecuta TRW2000 y presiona OK para dejarlo residiendo en memoria

 2) Ctrl+M para ir en TRW2000 y fija: Faults off

 3) ejecuta el programa Vboxeado hasta que vaya a la pantalla "Try"

 4) Ctrl+M y fija: bpx kernel32!getprocaddress

 5) presiona el botón "Try"

 6) en TRW2000, presiona F12 y F10 para salir del CALL

 

015F:0700BB39  CALL      [KERNEL32!GetProcAddress]                            

015F:0700BB3F  MOV       EDI,EAX              <-- estás aquí

015F:0700BB41  CMP       EDI,EBX                                               

015F:0700BB43  JZ        0700BCE6                                              

015F:0700BB49  MOV       ESI,[ESI+16]                                          

015F:0700BB4C  ADD       ESI,[EBP+08]                                          

015F:0700BB4F  CMP       [EBP-24],EBX         <-- llamada a la función de encriptación?

015F:0700BB52  JZ        0700BB89             <-- salta si no

 

 7) en TRW escribe: a cs:700bb52 (la dirección del Segundo JZ)

 y escribe en él: jmp short 0700bb89

 8) ahora ingresa: bl

 eso te mostrará los breakpoints actuales (solo 1 en GetProcAddress)

 algo como esto: bpx 015F:BFF79834

 ahora escribe: bpe 1 (para editarlo)

 haslo verse así: bpx 015F:BFF79834 if (eax==BFF79834)

 (nota que la dirección en eax es la misma que la dirección de GetProcAddress')

 9) presiona F5 para continuar.  Cada vez que TRW aparezca, presiona F12 y luego F10,

 y ve que saliste de un CALL EAX.

 10) repite el paso 9 (6 o 7 veces) hasta que veas código como este:

 

 CALL EAX

 TEST EAX,EAX         <-- estás aquí

 MOV [EBX+8C],EAX

 JNZ 01170233

 POP EDI

 POP ESI

 POP EBP

 

 11) Rastrea con F8 hasta el JZ y entra al siguiente Call. Este es el ultimo call que el programa real     

 ejecuta.  30 líneas abajo, verás:

 

015F:011604E0  MOV       EDX,[EBP-08]

015F:011604E3  MOV       EAX,[EDX+14]   <-- obtiene el punto de entrada del programa

015F:011604E6  MOV       [EBP-10],EAX

015F:011604E9  MOV       EBX,[EBP-10]   <-- el Punto de Entrada a EBX

015F:011604EC  JMP       EBX            <-- salta al Punto de Entrada Original

 

 12) continua rastreando con F8 y has el JMP EBX. Ahora estás en la primer instrucción

 del programa real,  escribe esto en TRW: makepe

 13) Voila! Ahora tienes un archivo llamado newpe.exe en el directorio default

 que es una copia desvboxeada del programa (con el Punto de Entrada correcto).

 

EL FIN

www.000webhost.com