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 :)
|
|