TORN@DO presents: cRACKER's n0TES

Sistemas de Protección comerciales: VBox



VBox 4.0.3 (+Xoanon)
Como Marigold dice, y como nosotros fácilmente podemos ver, las protecciónes VBox consta de 3 DLLs que se copian en tu directorio \\WINDOWS\\SYSTEM. Estos DLLs son: VBOXP403.DLL - VBOXB403.DLL - VBOXT403.DLL. Todos estos DLLs excepto el primero están empaquetados , así que nosotros enfocaremos nuestra atención en VBOXP403.DLL. Este DLL actúa como un loader/unpacker (n. del t.: cargador/desempaquetador) para los otros (entre las otras cosas, de nuevo simplemente mira el ensayo de marigold para una explicación completa), así que yo pensé esto: si encuentro el código que desempaqueta el DLL, justo después del desempaquetando, puedo parchear *desde dentro de VBOXP403.DLL* el código de la protección que reside en el espacio de memoria de VBOXT403.DLL.... y lo hice:) ¿No es un aproximamiento inteligente? :)

Nota: Esta manera de parchear puede hacerse muy fácilmente con un parche en memoria (mira el
ensayo de Stone), pero los parches en memoria siempre necesitan un loader, o un programa TSR-like que simplemente se cargue antes del objetivo. De esta manera, podemos obtener (como ya dije) un crack limpio y universal que sólo necesita ser copiado en lugar del DLL original ...

Así que, deja de hablar y adelante con el cracking ahora ...


En primer lugar, adelanta el reloj del sistema para que el objetivo caduque.

Ahora, tú EXE ha sido "VBoxeado" con protección de días de prueba, ¿correcto? Así que será vulnerable a BPX GETLOCALTIME de nuestro querido SoftICE. Aterrizarás en este código (después de PRET desde la rutina de API) dentro de VBOXP403.DLL. Después utilizaremos el espacio de este código para agregar nuestro código del parche de memoria.


    :0500E720    81ECCC000000     sub esp, 000000CC
    :0500E726    8D442410         lea eax, dword ptr [esp+10]
                                   * aquí agregaremos el parche de memoria después*
    :0500E72A    56               push esi
    :0500E72B    50               push eax
                                                               

    * Reference To: KERNEL32.GetLocalTime, Ord:00F5h
    |

    :0500E72C    FF1544C50105     Call dword ptr [0501C544]
    :0500E732    8D4C2404         lea ecx, dword ptr [esp+04]
    :0500E736    51               push ecx

                                                               
    * Reference To: KERNEL32.GetSystemTime, Ord:0135h
    |
                                                               
    :0500E737    FF1540C50105      Call dword ptr [0501C540]
    :0500E73D    668B4C240E        mov cx, word ptr [esp+0E]
    :0500E742    66390D32AC0105    cmp word ptr [0501AC32], cx
    :0500E749    7540              jne 0500E78B
    :0500E74B    668B44240C        mov ax, word ptr [esp+0C]
    :0500E750    66390530AC0105    cmp word ptr [0501AC30], ax
    :0500E757    7532              jne 0500E78B
 

Prosiguiendo con el traceado, encontrarás este código en VBOXT403.DLL qué chequea si el objetivo está caducado o no:


    :07005EFB    F6451408          cmp eax, [ebp+10]
    :07005EFE    7402              jz 7005F02
                                    * NOPealo *
 

y


    :7005FAA     3B45F0            cmp eax, [ebp+10]
    :7005FAD     751A              jnz 7005FC9
                                    * cámbialo a JMP 7005FC9 *

Ok, ahora teóricamente nuestro parche está hecho.... La pantalla de VBox ya no aparecerá PERO: ¿lo hicimos simplemente en memoria, cómo aplicarlo en el archivo si VBOXT403.DLL están empaquetado?

Aquí viene un poco Zen, como nuestro +teacher dice... Sabemos que esa DLL debe desempaquetarse en alguna parte, así que empezamos a buscar la rutina de desempaquetado poniendo un BPM 7005EFE W (breakpoint en rango d en rango de memoria en escritura). Esto significa que SoftICE romperá sólo cuando este espacio de memoria sea accedido para escritura (qué es, en nuestro caso, el desempaquetando de VBOXT403.DLL).

Ok, así que pon este breakpoint y relánzalo. Aterrizarás en nuestro querido VBOXP403.DLL aquí:


    :0500E856    8BD1              mov edx, ecx
    :0500E858    83E203            and edx, 00000003
    :0500E85B    C1E902            shr ecx, 02
    :0500E85E    F3                repz
    :0500E85F    A5                movsd
                                    * esto escribe el código desempaquetado a DS:EDI *
    :0500E860    FF249568E80005    jmp dword ptr [4*edx+0500E868]
    :0500E867    90                nop
 

Como notarás, esta rutina es ejecutada muchas veces, ya que el desempaquetando es hecho a pequeños pasos. Sin embargo, nosotros enfocaremos nuestra atención sólo cuando EDI alcance 07007000. ¿Por qué? bien, simple: puesto que nosotros queremos parchear en DS:7005xxx, si EDI alcanza 07007000 esto significa que el código que nosotros necesitamos ya está desempaquetado y preparado para nuestro ' saqueo' :).

Ahora, problema #2: necesitamos espacio para hacer nuestro parche de memoria. Fácil, mira aquí... este código no tiene ningún uso más, desde que la protección está eliminada. Así que podemos utilizar el espacio de memoria de este código de control de fecha para llevar a cabo nuestro parche de memoria.

En primer lugar, tenemos que localizar la llamada a esta rutina y NOPearlo, ya que nosotros queremos usarlo para nuestro propósito. Aquí está:


    :05002880    6A00              push 00000000
    :05002882    E899BE0000        call 0500E720
                                    * simplemente NOPea esto y la DLL no llamará
		la comprobación de fecha nunca más                   *
    :05002887    83C404            add esp, 00000004
    :0500288A    50                push eax
 

Ahora para el parche de memoria. Tenemos que saltar a nuestra rutina ¿correcto? así que nosotros necesitamos modificar este código correcto después de que VBOXT403.DLL es desempaquetado en memoria:

cambia


    :0500E860    FF249568E80005    jmp dword ptr [4*edx+0500E868]
 

a


    :0500E860    E9C1FEFFFF909090  jmp 500E726
                                    * ok, ahora esto salta al punto de entrada de
		nuestra rutina                            *
 

Aquí está la rutina del parche de memoria:


    :0500E726    81FF00700007      cmp edi, 07007000
                                    * comprueba si el código que nosotros necesitamos remendar está
		 desempaquetado ya                          *
    :0500E72C    7519              jne 0500E747
                                    * actúa normalmente si no                  *
    :0500E72E    66C787FEEEFFFF9090mov word ptr [edi+FFFFEEFE], 9090
                                    * parchea en EDI-1102 = 7005EFE           *
    :0500E737    C687ADEFFFFFEB    mov byte ptr [edi+FFFFEFAD], EB
                                    * parchea en EDI-1053 = 7005FA0           *
    :0500E73E    66C787A5EEFFFF9090 mov word ptr [edi+FFFFEEA5], 9090
                                    * parchea en EDI-115B = 7005EA5           *
                                                               
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0500E72C(C)
    |
    :0500E747    FF249568E80005    jmp dword ptr [4*edx+0500E868]
                                    * esto es el salto normalmente ejecutado
		después de desempaquetar                      *
    :0500E74E    90                nop
    :0500E74F    90                nop
 

Notas que yo he hecho otro parche en 0500E73E. ¿Para qué es? bien, el remienda este código

   
    :7005E9C     F6451408          test byte ptr [ebp+14],08
    :7005EA0     BE01000000        mov esi, 00000001
    :7005EA5     745B              jz 7005F02
                                    * NOPealo                              *

El cuál desvía el control del 'número de ejecuciones' (otra opción de VBox, pruébalo con el constructor).

Bien... eso es todo. VBox está totalmente muerto ahora, gracias a Marigold y tu pequeño xOANINO :) Parchea el VBOXP403.DLL según este ensayo, cópialo a tu \\WINDOWS\\SYSTEM borra el original y di ' CIAO CIAO' a WeiJuhn Li:)





VBox 4.10 (Marigold)


Esta versión tiene un manojo entero de nuevos rasgos:

Son autentificados los checksums para todos los archivos involucrados (para VBOXT410 dos veces) <----+
Son calculados los checksums para las imágenes de DLL en memoria (para VBOXT410 Ä dos veces) <- el crack R.I.P de Xoanon
La presencia de Debugger en memoria es descubierta <- Adiós, adiós espera para el restablecimiento de virginidad
Desensamblando VBOXP410.DLL cae W32DASM; IDA trabaja pero da un desensamblado erróneo


Al principio, yo fui impresionado profundamente (Tu sabes... un cuerpo muerto en un cuarto cerrado desde dentro... crimen perfecto). Yo me preparé para una pelea larga y dura: Yo desempaqueté VBOXT410.DLL, redirigí el cálculo de checksum del archivo al archivo original empaquetado, agregué una sección con una copia de código original inalterado y remití el cálculo de checksum de la imagen a él (esto sólo parece simple ...). Ves, yo imaginé, conociendo las maneras de Weijun Li, este chequeo para la presencia de debugger implicaba alguna modificación sutil dentro de la función unilateral, por ejemplo, y que no habría sido fácil, si alguna vez fue posible, encontrar y quitarlo. Así que, yo planeé usar esta modificada DLL para recolectar información, necesaria para desenvolver, sin usar SoftICE.

Entenderás mi desilusión cuando, después de ordenar las cosas fuera, yo encontré una función que simplemente pone un flag; entonces este flag es examinado,... salta... todo ese material primitivo... ' Un farol', en una palabra. La única esperanza, esta versión se debe de haberse hecho con prisas, y la próxima mostrará, por fin, a esos crackers una cosa o dos. ¡Bien, esperémoslo!

Aquí está esa llamada infame:


      :07006F4B 6A00                    push 00000000 
      :07006F4D 6AFF                    push FFFFFFFF 
      :07006F4F 683B9D0000              push 00009D3B 
      :07006F54 8D8D34FEFFFF            lea ecx, dword ptr [ebp+FFFFFE34] 
      :07006F5A E8E1220100              call 07019240 
      :07006F5F 8945BC                  mov dword ptr [ebp-44], eax 
          

En presencia de debugger esta función devuelve 26h, cambia eax a 0 y nunca verás de nuevo ese mensaje horrible: ' Si estás usando un debugger ...'

Otras cosas para mencionar:
El checksum de la Imagen es calculado aquí:


      :070066EA 8BC3                    mov eax, ebx 
      :070066EC 33FB                    xor edi, ebx 
      :070066EE F7D0                    not eax 
      :070066F0 3145B0                  xor dword ptr [ebp-50], eax 
      :070066F3 8D85F0FDFFFF            lea eax, dword ptr [ebp-210] <- Buffer para el checksum 
      :070066F9 50                      push eax 
      :070066FA 8D8520FFFFFF            lea eax, dword ptr [ebp-E0]  <- tabla de Relocalizacion 
      :07006700 81F7494C0000            xor edi, 00004C49 
      :07006706 50                      push eax 
      :07006707 57                      push edi                     <- longitud del código 
      :07006708 33F3                    xor esi, ebx 
      :0700670A FF75B0                  push [ebp-50] 
      :0700670D 81F64A570000            xor esi, 0000574A 
      :07006713 8975C4                  mov dword ptr [ebp-3C], esi 
      :07006716 89BD0CFFFFFF            mov dword ptr [ebp+FFFFFF0C], edi 
      :0700671C 56                      push esi                     <- Código RVA 
      :0700671D FF7584                  push [ebp-7C] 
      :07006720 E843120000              call 07007968 
       

y aquí (los parámetros son los mismos):


      :070071B2 8D8514FEFFFF            lea eax, dword ptr [ebp+FFFFFE14] 
      :070071B8 C645FC23                mov [ebp-04], 23 
      :070071BC 50                      push eax 
      :070071BD 8D8520FFFFFF            lea eax, dword ptr [ebp+FFFFFF20] 
      :070071C3 50                      push eax 
      :070071C4 FFB50CFFFFFF            push dword ptr [ebp+FFFFFF0C] 
      :070071CA FF75B0                  push [ebp-50] 
      :070071CD FF75C4                  push [ebp-3C] 
      :070071D0 FF7584                  push [ebp-7C] 
      :070071D3 E890070000              call 07007968

    

Recuerda, que cualquier BPX de SoftICE activo cambia el código realmente, así que elimínalos antes de estas llamadas.

El checksum del archivo (VBOXT410.DLL) es calculado aquí:


      :07006F62 8D458C                  lea eax, dword ptr [ebp-74] 
      :07006F65 50                      push eax 
      :07006F66 8D8504FFFFFF            lea eax, dword ptr [ebp+FFFFFF04] 
      :07006F6C 50                      push eax 
      :07006F6D A138FE0407              mov eax, dword ptr [0704FE38] 
      :07006F72 FF7028                  push [eax+28] 
      :07006F75 E836DF0000              call 07014EB0

    

Otro control es hecho dentro de VBOXB410.DLL, cuál le pasa el resultado a PreviewParadise como combinación de dos parámetros:


      :070072D8 8B450C                  mov eax, dword ptr [ebp+0C] 
      :070072DB 8B4D2C                  mov ecx, dword ptr [ebp+2C] 
      :070072DE F7D0                    not eax 
      :070072E0 33C8                    xor ecx, eax; 1=OK 
      :070072E2 7510                    jne 070072F4 

   

Cuando sabes todo esto, puedes restaurar la virginidad del objetivo de la misma manera que con la versión anterior. Hay algunos cambios menores en cabeceras de secciones empaquetadas y otras cosas... Si realmente vas a hacer esto, lo ordenarás fácilmente fuera.

¿Pero qué hay sobre un crack universal del estilo de Xoanon para todos los programas VBoxedados? Yo lo he conseguido como un derivado de solución a mi objetivo principal (total desenvolvimiento, recuerdas). El VBOXT410.DLL modificado que yo hice permite cualquier parcheado en su código ...
¿Alguna pregunta?





VBox 4.10 (Victor Porguen)


En el prólogo de Fravia a mi ensayo anterior, ' Derrotando Controles de Integridad de Archivo A través de Redireccion', él observó que 'la investigación viral aplicada al reversing tiene mucho que ofrecer... ' Este artículo describirá como las técnicas tradicionales de codificación viral son aplicadas al software de tiempo limitado. Específicamente, yo detallaré un concepto simple, sincero de redireccionamiento del código y lo aplicaré al sistema de protección VBOX 4.10 de Preview Systems. El parche resultante permitirá el uso completo de cualquier programa protegido de versión de ensayo o versión comercial del producto. Sin embargo, como una advertencia inicial yo señalaré que *todos* los archivos ' VBOXx410.DLL ' no son idénticos; de hecho, incluso no son compatibles entre ellos(pues sería ciertamente muy irritante si realmente hubieras comprado una aplicación protegida por VBOX que dependiera de una versión que fuera reemplazada como consecuencia de una sesión de 'prueba' de otro producto). Mientras la codificación específica descrito aquí dentro puede aplicarse fácilmente a cualquier ' juego de archivos' VBOXx410.DLL, y de hecho yo lo he probado con éxito en cada juego que pude encontrar, es importante que el lector comprenda que hay diferencias entre estos juegos.


Como un asunto de cortesía profesional, referiré al lector al reciente ensayo de Marigold, a quien yo contemplo con respeto, titulado 'VBOX el Hellraiser o un farol' (por un momento fugaz yo estuve tentado a subtitular este ensayo ' Hellraiser II, el Crack de Tontos' pero juicios mejores me superaron). El lector debe notar las referencias contenidas en ese artículo al ' control de debugger' usado por VBOX en luz del hecho de que la técnica de parcheado que yo perfilo dejará ese código intacto, así los programas protegidos con VBox continuarán no funcionando si un debugger está en segundo plano. El derrotando de esa rutina no es difícil, sin embargo, pero yo le dejaré esa ocupación al lector.

Las Metas - yo empecé este ensayo con tres metas en mente: 1) idear un crack simple que derrotase completamente todas las aplicaciones protegidas con VBOXx410; 2) Hacerlo así con una cantidad mínima de cambios de bytes, digamos no más de 250; y 3) en vista de que los chequeos de integridad son desenfrenados en VBOX, no hacer ningún cambio al código del programa. Esta meta última puede parecer imposible (quizás lo es si uno toma una interpretación verdaderamente estricta del significado), pero la meta se logró de hecho a través del uso del redireccionamiento del API (y el borrando de algún texto sin usar).

Qué pueden Enseñarnos los Virus - Cuando nosotros empezamos escribiendo virus de computación inicialmente, y usando ' las técnicas del sigilo' para esconder su presencia, lo hicimos así reemplazando la dirección para los manipuladores de DOS int 21 y BIOS Int 13 en la tabla del vector de interrupción (IVT). Las llamadas de verificación de integridad de programas para abrir y leer archivos o sectores podría interceptarse entonces y el código viral ser reemplazado con el código original. Sin embargo, simplemente enganchar la dirección en el IVT no era de ninguna ayuda si la rutina de control de integridad ya había enganchado la interrupción y así había estado sentándose debajo de nosotros (FluShot era un ejemplo, como donde un gran numero de programas de ' protege tu disco duro de escritura' que enganchaban interrupción 13). Nuestro primer esfuerzo por superar este obstáculo fue el virus 4096 en el que nosotros pusimos un JMP LEJANO al principio para el código viral del manipulador de la interrupción 21 que entonces reemplazaría los cinco bytes ' interruptor ' permitiéndonos acceso completo a las rutinas de DOS. La trampa flag estaba entonces poniendo el CPU en modo paso a paso. Unas instrucciones en una llamada de DOS nuestra rutina de interrupción 1entonces reinsertaría los cinco bytes 'interruptor' manteniendo así siempre el control encima del sistema operativo DOS.
Descubrir el 'punto' más bajo ('lowest point') de la cadena de vector de interrupción del DOS o de la BIOS fue logrado fácilmente poniendo el flag trampa y enviando una llamada inocua a través de la cadena y observando la dirección en la pila durante la rutina de interrupción 1.
Por qué Esto es Importante - La rutina de disimulo llevada a cabo por el virus 4096 tuvo bastante éxito (tanto así, de hecho, que él ' escapó' dentro del salvaje antes de que tuviéramos una oportunidad para completarlo totalmente... pero eso es otra historia). Si puedes tomar control del sistema operativo, no hay virtualmente ninguna restricción en tus habilidades. Llevando a cabo el JMP LEJANO del virus 4096 modificamos el sistema operativo de DOS realmente. Nosotros podemos hacer lo mismo con una aplicación WIN95 muy protegida, con limitación de tiempo,(bien, casi - no modificaremos el sistema operativo directamente debido a los problemas de transición de anillo, sin embargo lo haremos también). Tomando dominio de los APIs apropiados nosotros repartir fuera los valores de retorno requeridos a la aplicación así como también ' alimentar' los parámetros correctos a la aplicación y al propio sistema operativo - esto es lo que yo quiero decir en ' Logrando Redireccionamiento A través del engaño al API.'

VBOXx410: Cómo Crackearlo, paso a paso - El primer paso crackeando cualquier programa con tiempo limitado es lograr una ejecución exitosa de la aplicación, aun dentro de un debugger, después de que la limitación de tiempo ha expirado; sólo entonces puede el ' crack teórico' ser escrito al ejecutable. El sistema de protección VBOX, sin embargo, usa una rutina para descubrir la presencia de un debugger y Marigold lo describe en su ensayo. Mientras puede llevar tiempo localizar semejante rutina solamente con herramientas de software, ejecutando la aplicación simultáneamente en máquinas idénticas, un equipó con SoftICE y el otro con un hardware basado en el emulador del circuito, fácilmente resalta la diferencia en el valor de retorno de EAX desde CALL 7019240 en offset 7006F5A. Es comprensible que la inmensa mayoría de lectores no tiene acceso a herramientas de hardware basado en debugging y es suficiente con solo tener presente que un BMPB 7006F5A X seguido por una ejecución de la LLAMADA y poniendo manualmente EAX a cero mientras está bajo SoftICE nos bastará para permitir al programa ejecutar normalmente bajo un debugger. El lector es avisado que, debido a las rutinas de código de integridad de VBOX, sólo debe usarse breakpoints de registro de debug (excepto, por supuesto, dentro de nuestra rutina de disimulo) como opuesto a tradicionales CC breakpoints.

Caminando a través del código llegamos a la llamada a DialogBoxParamA en offset 70025C3 en la versión ' Trial' o en offset 8002912 en la versión 'Comercial' que despliega la pantalla de Limitación de tiempo de VBOX. El valor del retorno para ' Try' es cero, el valor para ' Quit' es uno. De nuevo, pulsando ' el botón de Quit' y entonces poniendo manualmente el valor de EAX a cero mientras estamos bajo SoftICE el programa nos permitirá continuar. El procedimiento final es caminar a través del código hasta que alcancemos la llamada de RaiseException en offset 7035629 qué despliega un mensaje de expiración y termina. Si nosotros simplemente ' caminamos sobre' esta llamada, y ajustamos la pila en consecuencia, el programa se ejecuta perfectamente. Así, el crack al sistema de protección de VBOX entera, tanto si es la edición de Prueba o la Comercial es hacer a la llamada de DialogBoxParamA devolver cero y hacer a la llamada de RaiseException volver sin ejecutar. Nada podría ser más simple; la parte desafiante, sin embargo, es llevar a cabo el crack en vista de las variadas y diversas rutinas de protección que VBOX lleva a cabo (es decir, empaquetado, verificación de la imagen de memoria, encifrado, etc.)

Obviamente nosotros no podemos NOPear simplemente el código, ya que está empaquetado y repetidamente verificado. Sin embargo, ¿requiere VBOX que las Llamadas sean ejecutadas completamente? Sabemos que la respuesta es ' No' para la llamada de RaiseException, pero ¿tiene la llamada de DialogBoxParamA que ser ejecutada o VBOX sólo verifica el registro de EAX en el retorno? De nuevo nosotros caminamos a través del código con SoftICE (recordando tratar con la rutina de control de debug) y rompe en DialogBoxParamA. En lugar de ejecutar la LLAMADA, le ponemos el registro EIP manualmente en el offset de la instrucción que sigue a la LLAMADA y ajustamos la pila en consecuencia. Entonces ponemos EAX a cero y permitimos la ejecución del programa... y el programa falla. Ahora sabemos que la llamada de DialogBoxParamA debe ejecutarse para satisfacer el sistema de protección de VBOX.

El paso próximo es determinar donde nuestro ' espacio de trabajo' residirá. Mirando a través de VBOXP410.DLL vemos se compiló con Microsoft Visual C++ Run Time Library la que cortésmente incluye una variedad de código desaprovechado e inútil y de texto. Un área que inmediatamente aparece como un posible área de trabajo es la inmensa lista de sitios geográficos que comienza alrededor del offset 206D4 o así del archivo. Comenzando con el querido hogar de Turquía (en offset 20718 del archivo) borramos dos o trescientos bytes de texto simplemente con ceros y ejecutamos el programa - y corre perfectamente. VBOX no está verificando esta porción de archivo ni en memoria ni en disco; así que ahora tenemos sitio suficiente en el que insertar nuestra ' cautelosa rutina de cracking'. Una vez más, arrancamos SoftICE y rompemos (recordando sólo usar registros de debug debido a las rutinas de control de integridad) en el punto de la entrada a VBOXP410.DLL que está en offset 5001F99 de memoria . Esto corresponde al offset 1399 de archivo y es donde nosotros insertaremos nuestro ' interruptor ' para la rutina de disimulo.

Pero antes de que modifiquemos el ejecutable en disco debemos determinar primero si VBOX está verificando la integridad del código reemplazado del propio archivo del disco (no estamos interesados en si VBOX verifica el código en memoria porque lo habremos restaurado). Sin embargo, ya que nuestra rutina de disimulo estará cambiando memoria, debemos modificar la cabecera de PE para que las secciones .text y .rdata sean escribibles. Actualmente, las características para .text son Código, Ejecutable, Leíble (60000020) mientras .rdata tiene las características de Datos Inicializados, Leíble (40000040). Estas dos entradas de 'double word' deben modificarse para que las secciones sean escribibles (de otra forma nuestras disimuladas modificaciones crearán fallos de página). La determinación de si VBOX está verificando la integridad de éstas áreas del código desde el archivo del disco sé hace fácilmente: Simplemente cambia la cabecera en el archivo del disco y entonces borra el ' interruptor ' con cinco NOPs, ponemos un BMPB 5001F99 X y ejecutamos la aplicación. Cuando SoftICE rompe en la carga de VBOXP410.DLL en 5001F99 insertamos el código original manualmente y permitimos a la aplicación continuar cargando y ejecutando normalmente(recordando todavía el código de descubrimiento de debug). El programa se ejecuta normalmente y así confirma que VBOX no está verificando la integridad de la cabecera o la situación del código del interruptor del archivo desde el disco - esto es todo esencialmente ' colina abajo' desde aquí .

Para facilitar la comprensión, lo siguiente es el interruptor y las rutinas de disimulo en formato' código fuente'. Apéndice A tiene el volcado de SoftICE de los valores del byte reales que corresponden a offsets de memoria y valores del byte del código. Este es el crack que derrota a VBOX 4.10:


    Entry_Point 
       jmp Restore_Original_Code 

    ^ 
    | 
    |--- VBOXP410.DLL el código está aquí  
    | 
    v 

    Restore_Original_Code:    
       mov dword ptr [Entry_Point],020496B8 
       mov byte ptr [Entry_Point+4],05 
       mov eax,[KERNEL32!EnterCriticalSection] 
       mov dword ptr [KERNEL32!EnterCriticalSection],New_Critical_Handler 
       mov [Critical_Section_Hdlr],eax 
       jmp Entry_Point 

    Counter: 
       dw 0 
    Critical_Section_Hdlr: 
       dd 0 
    DLG_Hdlr: 
       dd 0 
    DLG_Procedure_Hdlr: 
       dd 0 
    Return_From_DLG: 
       dd 0 

    New_Critical_Handler: 
       inc word ptr [Counter] 
       cmp word ptr [Counter],4000 
       jz Hook_DialogBox_for_VBOXC410 
       cmp word ptr [Counter],2EOO 
       jnz True_Critical_Handler 
    Hook_APIs_for_VBOXT410: 
       mov dword ptr [KERNEL32!RaiseException],New_Exception_Handler 
       mov eax,[USER32!DialogBoxParamA] 
       mov [DLG_Hdlr],eax 
       mov dword ptr [USER32!DialogBoxParamA],New_Dialog_Handler 
       jmp True_Critical_Handler 
    Hook_DialogBox_for_VBOXC410: 
       mov eax,[USER32!DialogBoxParamA] 
       mov [DLG_Hdlr],eax 
       mov dword ptr [USER32!DialogBoxParamA],New_Dialog_Handler 
    True_Critical_Handler: 
       jmp [Critical_Section_Hdlr] 

    New_Exception_Handler: 
       ret 10 

    New_Dialog_Handler: 
       mov eax,[esp+1O] 
       mov [DLG_Procedure_Hdlr],eax 
       mov dword ptr [esp+1O],New_DLG_Procedure_Handler 
       pop dword ptr [Return_From_DLG] 
       push Back_From_DLG_Call 
       jmp [Dlg_Hdlr] 
    Back_From_DLG_Call: 
       xor eax,eax 
       mov word ptr [New_Critical_Handler],4feb 
       jmp [Return_From_DLG] 
    New_DLG_Procedure_Handler: 
       cmp dword ptr [esp+08],18 
       jnz True_DLG_Procedure_Handler 
       mov dword ptr [esp+08],111 
       mov dword ptr [esp+OC],495 
    True_DLG_Procedure_Handler: 
       jmp [DLG_Procedure_Hdlr]
 

Una Explicación del Código - El punto de entrada es la situación de los cinco bytes, el código ' interruptor ' y, específicamente, está localizado en el offset 1399 de archivo y en el offset 5001F99 de memoria. Al cargar el DLL, este código interruptor es restaurado por la rutina de RestoreOriginalCode inmediatamente, así todo el código de VBOX es idéntico ahora a la versión no parcheada. Hemos logrado la Meta #3 y por consiguiente todas las rutinas de control de memoria de VBOX confirmarán la integridad de ese código. La rutina de RestoreOriginalCode también sirve para otro propósito: ' engancha' el EnterCriticalSection API que VBOX debe llamar para permitir la sincronización de la exclusión mutua y debe reemplazarlo con New_Critical_Handler.

La rutina New_Critical_Handler es responsable de espera por VBOXT410.DLL (y VBOXC410.DLL, para la versión comercial)para desempaquetar y entonces enganchará el RaiseException y DialogBoxParamA APIs que son el punto focal de nuestro crack. El RaiseException API es vectorado a la instrucción RET 10, qué por supuesto no hace nada más que RETORNAR con un bit de limpieza de la pila. DialogBoxParamA es vectorado a New_Dialog_Handler que es un poco más inteligente.

La rutina de New_Dialog_Handler logra dos tareas: 1) reemplaza el valor de RETORNO en la pila con el offset de Back_From_DLG_Call; y 2) engancha DialogBoxProcedure que procesa los mensajes enviados a la caja de diálogo con New_DLG_Procedure_Handler. New_DLG_Procedure_Handler mira por el mensaje de ShowWindow para ser enviado por el sistema operativo a la caja de diálogo y lo reemplaza con el mensaje y parámetro necesario para cerrar la caja. El control es devuelto a Back_From_DLG_Call que pone un cero en el registro EAX y entonces ' cierra la puerta' en New_Critical_Handler poniendo un JMP a la instrucción True_Critical_Handler (EB 4F) como primera instrucción de esa rutina. Nosotros entonces JMP atrás al código de VBOX que siguió a la LLAMADA DialogBoxParamaA que había transferido control a nuestro New_Dialog_Handler. Brevemente después de esto VBOX intentará desplegar el mensaje de 'expired' por vía de RaiseException API. Por supuesto, nosotros hemos enganchado ese código con New_Exception_Handler y volveremos cortésmente a VBOX sin ejecutar la LLAMADA. El programa se ejecutará entonces normalmente.


Un Resumen, Por favor - Aquí está el fluir de la lógica: 1) cargas VBOXP410.DLL; el código del interruptor salta a la rutina de disimulo que reemplaza el código del interruptor, engancha EnterCriticalSection, y encadena atrás a VBOXP410.DLL. 2) el New_Critical_Handler espera por VBOX para ' bajar sus pantalones' y entonces engancha el RaiseException y DialogBoxParamA. 3) el New_Dialog_Handler entonces ' engaña ' al fin de la caja de diálogo, y devuelve valores a la aplicación, para alimentar al procedimiento de caja de diálogo de VBOX con los valores que le gustaría ver, en exactamente el momento correcto que le gustaría verlos, e interceptando el retorno. 4) El RaiseException llamado por VBOX es interceptado entonces y Retorna sin hacer nada.

Una Demanda Para El Lector - por supuesto, este ensayo no está pensado para animar al robo de programas de software, o cualquier propiedad intelectual de esa materia. En cambio está diseñado para fomentar un entendimiento mejor de las técnicas de ingeniería inversa y los sistemas de protección del software. Yo espero que hayas disfrutado con la lectura de este ensayo, y que quizás hayas aprendido algo también. Si lo hiciste, yo apreciaría que si me dejaras caer un email que me permita conocer tus pensamientos. Yo disfrutaría muchísimo oyéndolo de ti.

Apéndice A - Valores de Bytes y Offsets de Memoria


    ; (El Código del Interruptor) Esto corresponde al offset 1399 de Archivo en VBOXP410.DLL 

    5001F99  E97AF90100           JMP 05021918 
      
    ^ 
    | 
    |--- VBOXP410.DLL el código está aquí 
    | 
    v 
      
    ;(La Rutina de Disimulo) Esto corresponde al offset 20718 de Archivo en VBOXP410.DLL 

    5021918  C705991F0005B8960402 MOV DWORD PTR [05001F99],020496B8 
    5021922  C6059D1F000505       MOV BYTE PTR [05001F9D],05 
    5021929  A1AOB50205           MOV EAX,[0502B5A0] 
    502192E  C705AOB5020554190205 MOV DWORD PTR [0502B5A0],05021954 
    5021938  A344190205           MOV [05021944],EAX 
    502193D  E95706FEFF           JMP 05001F99 
    5021942  0000 
    5021944  0000 
    5021946  0000 
    5021948  0000 
    502194A  0000 
    502194C  0000 
    502194E  0000 
    5021950  0000 
    5021952  0000 
    5021954  66FF0542190205       INC WORD PTR [05021942] 
    502195B  66813D421902050040   CMP WORD PTR [05021942],4000 
    5021964  742B                 JZ  05021991 
    5021966  66813D42190205002E   CMP WORD PTR [05021942],2EOO 
    502196F  7534                 JNZ 050219A5 
    5021971  C70590890507AB190205 MOV DWORD PTR [07058990],050219AB 
    502197B  A1348A0507           MOV EAX,[07058A34] 
    5021980  A348190205           MOV [05021948],EAX 
    5021985  C705348A0507AE190205 MOV DWORD PTR [07058A34],050219AE 
    502198F  EB14                 JMP 050219A5 
    5021991  A1E8760808           MOV EAX,[080876E8] 
    5021996  A348190205           MOV [05021948],EAX 
    502199B  C705E8760808AE190205 MOV DWORD PTR [080876E8],050219AE 
    50219A5  FF2544190205         JMP [05021944] 
    50219AB  C21000               RET 0010 
    50219AE  8B442410             MOV EAX,[ESP+10] 
    50219B2  A34C190205           MOV [0502194C],EAX 
    50219B7  C7442410E1190205     MOV DWORD PTR [ESP+10],050219E1 
    50219BF  8F0550190205         POP DWORD PTR [05021950] 
    50219C5  68D0190205           PUSH 050219DO 
    50219CA  FF2548190205         JMP [05021948] 
    50219DO  33CO                 XOR EAX,EAX 
    50219D2  66C70554190205EB4F   MOV WORD PTR [05021954],4FEB 
    50219DB  FF2550190205         JMP [05021950] 
    50219E1  837C240818           CMP DWORD PTR [ESP+08],18 
    50219E6  7510                 JNZ 050219F8 
    50219E8  C744240811010000     MOV DWORD PTR [ESP+08],00000111 
    50219FO  C744240C95040000     MOV DWORD PTR [ESP+OC],00000495 
    50219F8  FF254C190205         JMP [0502194C]    
    




VBox 4.20 (PLUMe)


Herramientas requeridas
TRW y MKPE
SoftICE


Puedes haber oído hablar ya de TR&TRW. Es un debugger maravilloso proporcionado por Liutaotao. Yo no podría decir lo mucho que me gusta. VBOXT410.DLL no puede encontrar TRW en absoluto. No podría darte un parche para VBox. Simplemente puedo decirte cómo trabaja VBox.

En primer lugar, instala el constructor de VBox (necesitas recibir un archivo .prv desde su webserver, así que conecta a internet para esto y llena el impreso necesario). Entonces escoge un archivo .EXE para proteger (también podrías escoger un .DLL o un .OCX, pero escoge un .EXE porque es mejor y más fácil para los propósitos de cracking. Yo escogí los Official phrozen crew trial crackme) y envuélvelo con VBox usando el constructor (escoge ahora la protección de días de Prueba).

Ahora empieza la diversión. Y como podemos ver fácilmente, el esquema entero de protección de VBox consiste en sólo un dll que es copiado en tu directorio \\WINDOWS\\VBox\\command. El nombre de nuestro blanco DLL es VBOXT402.DLL. Está empaquetado.


Paso 1
Aquí te mostraré cómo usar TRW.
Ejecuta TRW, selecciona el botón 'hide'.


Entonces aparece un icono verde en la esquina derecha.


Puedes hacer click con el botón derecho en él. Aparece así.




Paso 2
Cambiemos el tiempo a 30 días después. Ahora puedes ejecutar CRACKME.EXE. Cuando la ventana de VBox aparece, CTRL-N, entra en TRW. Puedes usar 'hwnd' para encontrar el hwnd de ventana de VBox. Algo como xxxx.

bpmsg xxxx wm_destroy - simplemente como en SoftICE
g - regresas a VBox

Aprieta el botón de 'quit'.
Ahora estás en TRW.

bc * - elimina los breakpoints

Aprieta F12 unas veces, hasta que vengas aquí en VBOXT402.DLL



    07006079: call [dword dialogparama] 
    0700607f: mov esi,eax               ; si presionas 'try' eax=0, 'quit' eax=1; Así que
                                          cambia eax a 0 ... r eax 0. 
    

Ahí tienes algunos otros controles


    07001c03: cmp [ebp-10],eax          ; si eax=[ebp-10], el dialogo de error aparecerá; así que
                                          cambia eax
    07001c06: jne 07001c2c 
    07001c08: lea eax,[ebp+10] 
    07001c0b: lea ecx,[ebp-74] 
    07001c0e: push eax 
    07001c0f: mov [ebp-78],ebx 
    07001c12: call 0702e7d0 
    07001c17: lea eax,[ebp-7c] 
    07001c1a: push 07070568 
    07001c1f: push eax 
    07001c20: mov [dword ebp-7c],0706e004 
    07001c27: call 070570a0 
    07001c2c: lea ecx,[ebp-28] 
    07001c2f: mov [byte ebp-040,04 
    07001c2c: lea ecx,[ebp-28] 
    07001c2f: mov [byte ebp-04],04 
    07001c33: call 0702d440 
    07001c38: lea ecx,[ebp-18] 
    07001c3b: mov [byte ebp-04],02 
    07001c3f: call 0702d440 
     .......
    07001c7c: call 07032570 
    07001c71: cmp [ebp-10],eax             ; otro control. 
    07001c74: jne 07001f9b                 ; si eax=[ebp-10], el dialogo de error aparecerá; así que
                                             cambia eax
 

Ok, ahora teóricamente nuestro parche esta hecho ...


 1. 07006079: call [dword dialogparama] parch. a 
    07006079: xor eax,eax 
    0700607b: nop 
    0700607c: nop 
    0700607d: nop 
    0700607e: nop 

2. 07001c06: jne 07001c2c parch. a
   07001c06: jmp 07001c2c 

3. 07001c74: jne 07001f9b parch. a
   07001c74: jmp 07001f9b 

La pantalla de VBox ya no aparecerá PERO: lo hicimos sólo en memoria que no es permanente, como todos conocen muy bien... Debemos aplicar nuestro parche ahora en el archivo real. ¿Pero VBOXT403.DLL está empaquetado?


Paso 3 Cierra TRW. (La función bpm de TRW parece no trabajar allí)
Ejecutemos SoftICE. (VBox desempaqueta el código primeramente, entonces comprueba SoftICE)

Carga crackme.exe

bpm xxxx: 07006079 w;

Ok, así poniendo este breakpoint y rearrancando. Aterrizaras en VBOXT410.DLL aquí:


009c01b7: repz movsd 
009c01b9: mov ecx,edx 
009c01bb: and ecx,03 
 .......
   

¡Oh DIOS mío! Está encriptado antes de correr. Por lo tanto no podrás encontrar éste código dentro de VBOXT410.DLL.

bpm xxxx: 009c01b7 w;

Así que pon este breakpoint y re-enciende. Aterrizaras aquí:


00a001b7:repz movsd 
00a001b9:mov ecx,edx 
00a001bb:and ecx,03 
 .......

Prueba de nuevo.

bpm xxxx:00a001b7 w;

Así que pon este breakpoint y re-enciende. Aterrizaras aquí:


07093c27:mov [edi],al 
07093c23:inc edi 
07093c24:inc ebp 
 .......

Prueba de nuevo.

bpm xxxx:070093c27 w;

Así que pon este breakpoint y re-enciende. Aterrizaras aquí:


 :07093422 03D0      add edx, eax
 :07093424 C1E902    shr ecx, 02
 :07093427 F3        repz
 :07093428 A5        movsd                         ; ¡aquí!
 :07093429 8BCD      mov ecx, ebp
 :0709342B 89542414  mov dword ptr [esp+14], edx
 :0709342F 83E103    and ecx, 00000003
 :07093432 F3        repz
 :07093433 A4        movsb
 :07093434 8B4344    mov eax, dword ptr [ebx+44]

Si, puedes encontrar este código en VBOTT410.DLL

Francamente, no encontré una manera elegante de parchearlo. Se modifica mucho. Si encuentras una manera elegante de parchearlo, por favor
házmelo saber.


Ahora intento conseguir una rutina limpia usando otro acercamiento. Pero no siempre funciona, ¡ten cuidado!



Así que olvidémonos de nuestros VBOXT402.DLL durante algún tiempo. Simplemente queremos una rutina limpia.

Corre TRW.

Cambia eax en:


1. 07006079: call [dword dialogparama] 
2. 07001c06: jne 07001c2c 
3. 07001c74: jne 07001f9b 

Así que solamente ejecuto nuestro 'Official phrozen crew trial crackme' una ventana aparece. Aprieta ' ok', entra en la ventana de su rutina principal.

Ahora encuentra su hwnd (sabes hacer esto, espero :-), y entonces sólo bpmsg en él dentro de TRW.

Ahora: g; te remontas a la ventana de phrozen, presiona 'exit'.

Justo como antes TRW aparece. Aprieta F12 tanto como sea necesario para encontrar el código pertinente ...



00401029: push 00 
00401030: push 00401046 
00401032: push 00 
00401034: push 01 
0040103a: push dword 0402dd87 
0040103f: call 00401313 
00401041: push 00                         ; aterrizas aquí 
00401046: call 0040127d 
 .......: ... 

Puedes ir directamente a xxxx:00401029 y puedes descargarlo de memoria usando el comando 'pedump'.

Entonces consigues dump1.exe.
MKPE dump1.exe -a -s -f -i3 -ldlllist.sam

FILEOUT.EXE es nuestra rutina 'limpia', y funciona muy bien... así que byebye VBox 4.2



Como puedes ver ahora -una vez más - las protecciones comerciales 'usar y listo' no son tan seguras como ellos afirman (mira en http
://www.previewsoftware.com).

Pero a veces mi aproximación de FILEOUT.EXE no trabaja... Yo me pregunto por qué ...
Desgraciadamente no encontré ningún modelo claro para invertir este pequeño misterio. Si entiendes esto, o si tienes cualquier otro método bueno para este objetivo, por favor
házmelo saber, modificaremos este ensayo juntos.





VBox 4.20 (alpine)


Herramientas requeridas
SoftICE
ProcDump


Paso 1: El truco del molesto anti-debug
Arranca tu OS sin habilitar SoftICE. Carga tu programa en TurboDebugger y ejecútalo (F9). Romperá en un INT 3. Mira en SI y DI y verás los valores mágicos (SI=4647h; DI=4A4Dh). Camina encima del INT 3 hasta que pases el RET. Apunta la dirección del Salto (jmp [ebp-07]). Puedes dejar TurboDebugger ahora.

ebp-07 apunta al buffer temporal donde se ejecutan los INT 3 y otras instrucciones. Ahora relanza con SoftICE habilitado.

El truco anunciado trabaja como lo siguiente:
VBox prepara SEH y entonces Llama nuestro INT 3. Si SoftICE está presente manejará el INT 3 sin levantar una excepción, por lo tanto VBox sabe que SoftICE está instalado. Si una excepción se levanta el programa continúa como normal.

Carga el programa en el Symbol Loader. Ahora pon un breakoint en esa dirección, que anotaste antes. Pero no uses BPX debido a los controles de CRC. Usa BPMB X. Ahora ejecútalo; atrás en SoftICE levantaremos una excepción. Modifica el valor guardado en [ebp-07] a 0 tecleando ed (ebp-07) 0. Eso causará una. Ahora aprieta F5 y no consigues ese mensaje molesto pero consigues un dialogbox. Aprieta ' Try' y serás lanzado atrás de nuevo a SoftICE.

Otra vez cambia el valor de [ebp-07] a 0. Antes de apretar F5... tenemos que poner un breakpoint


Paso 2: Encontrando el salto final
Para encontrar el Salto final nosotros tenemos que saber lo que el programa hará después. Por lo menos podemos suponerlo:) Tiene que conseguir las direcciones de APIs que usamos en nuestro programa. Esto está hecho a través de GetProcAddress. Rompe en eso usando BPX GetProcAddress. Ahora aprieta F5... atrás en SoftICE desactiva todos los breakpoints y sal de la LLAMADA de GetProcAddress apretando F12.

Ahora una clase de cosa molesta viene: caminando a través de las masas de código :)
No es tan duro... Lo abreviaré. Podrías buscar los código de operación para acortarlo:

     53,53,FF,D6,5B,85,C0,74,2E,68,00,80,00

Eso debería ser algo como esto:

    push ebx
    push ebx
    call esi
    

Sin embargo encontrarás tu camino hasta allí (1 min para caminar a esa situación). Remonta en CALL ESI allí encontrarás sólo una LLAMADA... camina dentro de ella

Entonces camina, camina, camina hasta que te encuentras con una LLAMADA EAX - no camines en ella... la LLAMADA próxima es la última en la que nosotros vamos a caminar. Rastrea... y encontrarás


    mov ebx,[ebp-14]
    jmp ebx
    

Eso es el Salto final (EBX es el punto de entrada de tu programa por supuesto).
Salto (apunta a EBX). Camina a él, pero no ejecuta el Salto. Ahora entra en una vuelta infinita con


    '  a eip'
    'jmp eip'
    

Paso 3: Descargando el paraíso
Abre ProcDump. Selecciona el programa de la lista de la tarea. Click-derecho en él y selecciona descarga completa - guárdalo. Abre el PE-Editor y cambia el punto de entrada a lo que viste en EBX (recuerda entrypoint = ' lo que viste en EBX'-'imagebase'). Ahora sólo hazle más compatible y abre el archivo en rebuild PE.



Tienes un programa ahora sin VBox :)






The cRACKER's n0tES esta dividido dentro de 12 partes principales:
 TX. Notas del Traductor
 00. INDICE
 01. Ensamblador para Cracker (CoRN2)
 02. SoftICE (Menú de arranque , Configuración, Comandos)
       
 1 Menú de arranque
       
 2 Configuración
       
 3 Comandos
 03. Breakpoints & Detalles de API de Windows
       
 1 Programas restringidos
       
 2 Cajas de diálogo
       
 3 Verificando el Tipo de unidad
       
 4 Acceso a archivos
       
 5 Acceso al Registro
       
 6 Cogiendo números de serie
       
 7 Accediendo a Tiempo & Fecha
       
 8 Generando ventanas
 04. Instrucciones de salto
 05. Instrucciones SET
 06. Tips & Trucos para Crackear
       
 1 Programas restringidos
       
 2 Dongles
       
 3 General
       
 4 Configuración de InstallSHIELD
       
 5 Protecciones con Archivo llave
       
 6 Pantallas molestas
       
 7 Límites de Runtime
       
 8 Serials
       
 9 Limites de Tiempo
       
10 Programas Visual BASIC
 07. Ventanas de Mensajes Para los Cracker
 08. Identificando funciones, Argumentos, y Variables (Rhayader)
 09. Los Sistemas de Protecciones de comerciales
       
 1 Armadillo
       
 2 C-Dilla SafeDISC
       
 3 SalesAgent
       
 4 SecuROM
       
 5 softSENTRY
       
 6 TimeLOCK
       
 7 VBox
 10. Bitmanipulation (Cruehead)
 11. Teoría general de Cracking
 12. FAQ

 +A. Cómo contactar conmigo
 +B. ¿Que es lo Nuevo?


 



The cRACKER's n0TES are Copyright 1998-2000 by TORN@DO of ID.
Todo los Derechos Reservados.
Traducido por
Revisado por X-Grimator.