Crackeando
SalesAgent 3.0 BUY NOW (Goth)
Bien,
asumo que has tomado todas las precauciones
obligatorias (backup del registro y tal...) ,
instalado nuestro objetivo y reiniciado Win95.
PARTE I - Mira lo que el gato arrastró
Primero mira cómo se comporta nuestro objetivo.
Empieza tu programa. Conseguirás la ventana del
usual ' Time Trial'. No nos molestaremos con '
Try first', derecho de cabeza a ' Buy now'.
Rellena algunas casillas y aprieta ' Next' hasta
que alcances la ventana de ' Select Payment
Method'. Ahora, ¿tienes la información de tu
tarjeta de crédito a mano? Si no, debes invertir
nuestro objetivo para ver qué números son
válidos o visitar algún sitio selecto de
hackers y conseguir un generador de tarjetas de
crédito (ej. CreditMaster) o simplemente
introduce:
Card: American Express
No.: 00000000
Exp.: 01/05
Name: Goth
Y
presiona ' Next' hasta que consigas la ventana '
Select Communication Methods". Por varias
razones es necesario asegurarse de que no puedes
conectar a nada, apaga tu módem, corta tu cable
o cualquier otra cosa y presiona ' Next'. Oops,
incapaz conectar, y así sucesivamente. Cancela
todo el ' Buy now'.
Ahora, podrías observar nuestro objetivo con el
periodo de prueba caducado. ¿Pero todos saben lo
que pasará, no lo hagas? Sí, el botón de' Try
first' desaparecerá y no regresará si pusiste
tu RTC (n.del t. Real Time Clock: reloj de
tiempo real) atrás. Bien, es una prueba de
tiempo. Así a estas alturas podrías tener la
brillante idea de lanzar a SoftICE, bpx
GetSystemTime, rastrear abajo los bytes para
parchear en el EXE/DLL y listo.
¡- NO, no lo hagas!
Lo que harás a estas alturas es presionar ' Buy
now' de nuevo. (A veces cuando tengo estos
extraños ataques de estupidez, no puedo creer
que haya un botón de ' Buy now' pero ninguna
manera de introducir cualquier código de
registro o alguna cosa así y lo intento de
nuevo... ;-)
Ves todos los campos de tu ventana de ' User
Registration' llenó de la información que has
introducido antes . Cierra el programa y empieza
de nuevo. La información todavía está allí.
¡SalesAgent guarda información del usuario en
alguna parte!
PARTE II - La Anatomía de SalesAgent 3.0
Debes examinar los archivos de nuestro objetivo
ahora para conseguir una tosca apreciación
global de qué está pasando. Bien, cinco veces
deben ser más que bastantes para que yo eché
una mirada profunda a las RSAGNT32.DLL. Usa BRW
y/o W32dasm. Mira las tablas de importación y
exportación, recursos, los encabezamientos y
así sucesivamente... Chequea si ellos están
encriptados/comprimidos. Usa tu imaginación.
¿Qué archivo puede realizar qué tarea? ¿Cómo
trabaja el esquema? SIÉNTELO...
Habiéndolo sentido bastante, debes llegar por lo
menos a estos resultados:
- Si tu programa tiene más de un EXE, todos
ellos tienen el mismo tamaño
=> no pueden ser los EXEs reales => algún
tipo de cargador
- ********.DL_s están encriptadas => el EXE
real será cargado, descifrado, cualquier cosa...
RSAGNT32.DLL conecta al servidor de Internet,
contiene recursos para ENTERING REGISTRATION CODE
(n.del t.: introduciendo código de registro)
¿Ahora, cómo parece que hace nuestro proceso de
arranque ?
Cuando empiezas el programa que usa RSAGNT32.DLL
verifica si estás en tu periodo de prueba y
entonces presenta ' la ventana de Trial'. Si
presionas ' Try first' el DL_ encriptado está
siendo temporalmente descifrado y comenzado. Si
presionas ' Buy now' RSAGNT32.DLL es usado para
conseguir información del usuario, conexión de
Internet y REGISTRO. Después del registro los
archivos * .DL_ deben descifrarse
permanentemente.
¿Así cómo conseguimos que RSAGNT32.DLL nos
permita registrarnos?
PARTE III - Falsificando una orden de mail/fax
yo he utilizado W32Dasm para desensamblar
RSAGNT32.DLL . Primero yo examiné la
tabla de importación para ver de lo que es capaz
y buscar importaciones sospechosas. Huh,
encontrarás mucho. Lo que debe hacer sonar tus
campanillas es que es capaz de modificar entradas
del registro pero también usa el material
obsoleto PrivateProfileString (* .INI). Esto
necesita una investigación extensa.
W32dasm encuentra la primera aparición de
GetPrivateProfileStringA aquí:
...
* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:0112h
|
:100015EE 8B35A8010210 mov esi, dword ptr [100201A8]
* Possible StringData Ref from Data Obj ->"rsagent.ini"
|
...
Oops,
intenta leer de un archivo llamado RSAGENT.INI
Y¿dónde están normalmente guardadas éstas
cosas * .INI? Correcto, nosotros lo encontraremos
en nuestro directorio 'Windows':
[ReleaseSoft]
firstName=Goth
lastName=Nosferatu
company=!
street1=!
street2=!
city=!
state=
zip=12345
country=United States
geoType=110
phoneNum=!
faxNum=!
email=!
personalCode=
toneDial=1
callWait=0
needAccess=0
accessCode=9
intlPrefix=
callWaitStr=
mailStat-975135=0
ATTN=AT
MTONEDIAL=T
PULSEDIAL=P
DIALTHIS=D
WORDRESULT=V1
HANGUP=H0
ADDINIT=E0
ESCAPE=+++
OKAY=OK
NOCARRIER=NO CARRIER
CONNECTED=CONNECT
NODIALTONE=NO DIALTONE
BUSY=BUSY
|
No estaba allí justo después de la
instalación. Así que se debe de haber sido
creado mientras nosotros intentábamos registrar
el objetivo en la parte I. Examinémoslo. Busca
algo que podría ayudarnos a registrarnos. Bien,
hasta ' el email =! ' (Sí, soy un perezoso
bastardo. Yo introducí todos éstos '! ')
nada de importancia. ¡Pero espera, '
personalCode = '!
¿Dónde hemos visto nosotros esto antes? Si
hiciste lo que yo te dije en la parte II sabrás
donde. Usa BRW. ¡Mira en dialog 2011! ¿Cuál es
el título de este diálogo? 'Complete Mail / Fax
Payment'! Hm, Mail?, Fax? no puedo recordar
ninguna posibilidad de orden por Mail / Fax
durante el procedimiento ' Buy now'. Echa una
mirada a dialog 2001. Nuestro viejo amigo de la
PARTE I 'Select Communication Method' pero este
diálogo permite pedir por teléfono y mail/fax.
¡Así que debe ser posible conseguir dialogar
2011 sin completar la conexión del
Internet/módem!
Todas las entradas son bastante explicativas por
si mismas pero ¿qué es lo que está sobre esta
entrada ' mailStat-975135=0 '? Cambiémoslo a 1,
reinicia NU (n. del t.:expresión para
apremiar, apurar) y prueba el procedimiento
de 'Buy now' de nuevo. ¿Cambió algo? ¡Por
supuesto! Nosotros estamos finalmente en diálogo
2011. Allí nosotros tenemos un ' Personal Code'
y lo que no tenemos es un ' Unlocking Code'. Pero
no por mucho tiempo...
PARTE IV - RSAGNT32.DLL's construyendo un
KeyGenerator
Nosotros sabemos que nuestro ' Unlock Code' será
recibido a través de dialog 2011. Así que debes
poner un bpx GetDlgItemTextA en SoftICE. Entra un
unlock code ficticio (ej. gothtog ) y
después de apretar F12 SoftICE aparecerá aquí:
:10005612 mov edi, 10032E20 <= nuestro unlock code
:10005617 or ecx, FFFFFFFF
:1000561A xor eax, eax
:1000561C repnz
:1000561D scasb
:1000561E not ecx
:10005620 dec ecx
:10005621 cmp ecx, 0000000A <="¿Tiene" 10 cars de largo?
:10005624 je 10005665 <="¡Si!" => Ir a control de validación!
:10005626 lea edx, dword ptr [esp+10] !No! => ...
* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is not valid for
this program."
|
:1000562A push 10023890
:1000562F push edx
:10005630 call 10014590
Camina
encima de las instrucciones próximas, cambia a
cero flag a 10005624 y camina hasta que alcanzas:
:100056A8 push ecx
:100056A9 push edx
:100056AA push eax
:100056AB call 1000B980 <= calcula el código real
:100056B0 add esp, 0000000C
:100056B3 lea ecx, dword ptr [esp+000000D8]
:100056BA push 10032E20 <="nuestro" código
:100056BF push ecx <="código" real
:100056C0 call 1001F5C0 <="comparación"
:100056C5 add esp, 00000008
:100056C8 test eax, eax <="si comparación falla (eax!= 0)"
:100056CA jne 1000597C <= Conseguimos 'Sorry, that...'
En
100056BA descargamos ecx y conseguimos un
perfecto código unlock de 10 cars de largo como:
¡' RQXKNKQJPP'
(Este código es sólo válido si tu personal
code era ' 1234567890 ' y el programa era
Dreamweaver!
A propósito, tú unlock codes cambia si
modificas tu entrada ' personalCode' y tu '
mailStat-975135 ' en RSAGENT.INI!)
Deja SoftICE (F5). Introduce el unlock code y
conseguimos una ventana de ' Enter your serial'.
(Raro!) ¡Aquí introducimos nuestro unlock code
de nuevo y está hecho!
PARTE V - Resumen y Suplemento
Nosotros no tendremos que tratar con ninguna
rutina de encriptación ya que SalesAgent 3.0
puede derrotarse en menos de 2 min.:
- cambia ' personalCode = ' a '
personalCode=1234567890 ' y ' mailStat-975135=0 '
a ' mailStat-975135=1 ' en RSAGENT.INI
(si no hay ningún RSAGENT.INI crea uno!)
- arrancas el procedimiento de ' Buy now' y
- entra ' RQXKNKQJPP' como unlock code
(sólo si estás crackeando Dreamweaver)
|
Crackeando SalesAgent 3.0 TRY FIRST (Víctor Porguen)
Atrás
en los 'viejos tiempos' nosotros creábamos virus
bastante engañosos que usaban ' las técnicas
del sigilo' para esconder cambios del código de
CRC y checksum. Simplemente poniendo, cuando la
rutina que comprueba la integridad abría el
archivo, o hacia un archivo de lectura, el
código viral sustituía el código correcto en
lugar del código modificado previendo
descubrimiento sin tener en cuenta la complejidad
del algoritmo de CRC. Este mismo concepto puede
aplicarse para crackear programas de tiempo
limitado que van al problema de controlar la
integridad el ejecutable del archivo del disco (como
opuesto a verificar el código mientras está en
memoria).
Programas protegidos por SalesAgent puede tener
el interface común de Try-Buy x-días que todos
nosotros hemos aprendido a amar. Un ejemplo de
esto podría ser WinFAX En pro de 9.0 de Symantec
que es el programa de ejemplo para este ensayo.
crackear la limitación de fecha mientras SoftICE
está cargado en memoria es un ejercicio bastante
trivial. No obstante nosotros debemos dirigir
primero el actual ' crack' antes de que podamos
examinar el aspecto más interesante de derrotar
el control de integridad de archivo. Los métodos
usuales de trazado a través del código, son
poniendo breakpoints apropiados, y así adelante
te llevará a la rutina que espera el ' click' en
'Buy Now', 'Try First' o en la opción ' Cancel'
- por supuesto, que la opción de 'Try First'
estará desactivado después de 30 días. Uno de
los métodos más simples para localizar este
área de código es poner un breakpoint en
DialogBoxParamA. Cuando SoftICE salta, F11
ejecutará la LLAMADA, pulsa en el botón 'Try
First' y SoftICE saltará una vez más, y
entonces F12 romperá en el Retorno del
subprograma que será OFFSET 00408BA7. Estarás
sentándote ahora justo de golpe en el medio de
la rutina que comprueba la fecha y el crack
necesario deben estar fácilmente claro. Aquí
está el desensamblado:
:00408B75 A3E8864300 MOV [004386E8],EAX
:00408B7A 892D14864300 MOV [00438614],EBP
:00408B80 E84B960100 CALL 004221DO
:00408B85 83C408 ADD ESP,08
:00408B88 85CO TEST EAX,EAX
:00408B8A 751D JNZ 00408BA9
:00408B8C 6868044300 PUSH 00430468
:00408B91 68A0834300 PUSH 004383AO
:00408B96 E835960100 CALL 004221DO
:00408B9B 83C408 ADD ESP,08
:00408B9E 85CO TEST EAX,EAX
:00408BAO 7507 JNZ 00408BA9
:00408BA2 E809D5FFFF CALL 004060BO
:00408BA7 EB05 JMP 00408BAE
:00408BA9 B801000000 MOV EAX,00000001
:00408BAE 83F8FF CMP EAX,-01
:00408BBI 55 PUSH EBP
:00408BB2 7514 JNZ 00408BC8
:00408BB4 FF1540D24200 CALL [USER32!PostQuitMessage]
Una
segunda revisión de este desensamblado revela el
hecho que si el programa ejecuta la instrucción
en 00408BA9 no habrá ninguna expiración del
programa.
Además, si el programa no ejecuta la LLAMADA en
00408BA2 el "nag screen" nunca se
visualizará.
De estos dos hechos fluye la conclusión obvia
que si la LLAMADA en 00408B80 devuelve EAX como
nada excepto cero, entonces el programa estará
crackeado.
Poniendo la fecha del sistema adelante para
caducar el programa y poniendo un breakpoint en
00408B8A y 'forzando el jump' a través de la
limpieza manual del flag de cero, mientras estás
bajo SoftIce confirma que esto es el crack
verdaderamente.
Cuando ataqué este programa por primera vez,
pensé para mí que estaba bastante
decepcionando...
' Hmm, sólo cinco minutos para crackear el
programa. '
Sin embargo, cuando yo hice el cambio del byte
actual en el en el archivo de disco FAXMNG32.EXE,
produjo fallo de página.
Asumí inmediatamente que tenía el parche
"empañado" (qué no era nada
más que hacer el salto condicional
incondicional)
.
Sin embargo, bajo SoftICE, el parche estaba
exactamente como debe ser - y no había ninguna
razón teórica para que este parche debiera
crear fallos de página involuntariamente, por
consiguiente los fallos de página debían de ser
a propósito
(y yo no podría estar más contento).
El primer paso, por supuesto, era poner un
breakpoint a un registro del debug para las
lecturas de memoria en el primer byte del parche
para ver si la rutina de integridad estuviera
verificando la memoria.
No era, así que, la única otra posibilidad era
que estaba verificando el archivo del disco.
Poniendo un punto de ruptura en CreateFileA y
repasando los nombres de los archivos que eran
abiertos confirmamos que el programa estaba
inspeccionándose en disco verdaderamente - y no
sólo una vez, estaba ejecutando un hilo en
segundo plano eso constantemente estaba
verificando la integridad del archivo.
Qué bonito. Simplemente renombrar el archivo y
guardar una copia del archivo original intacto no
era la solución ya que el programa era bastante
brillante para realmente abrir y verificar el
archivo bajo el nombre que estaba ejecutando así
como también el nombre correcto de FAXMNG32.EXE.
Es a estas alturas nos dirigimos al problema para
el que este ensayo realmente está designado:
derrotando Controles de Integridad de Archivo A
través del Redireccionamiento. El primer paso en
el proceso es determinar la dirección de la
LLAMADA que está abriendo FAXMNG32.EXE para
comprobar.
Poniendo un breakpoint en CreateFileA como
detallamos anteriormente encuentra la llamada en
un momentito.
Aquí debajo está el desensamblado de la llamada
que repetidamente abre FAXMNG32.EXE y qué
nosotros queremos ' interrumpir ':
:00421B72 55 PUSH EBP
:00421B73 51 PUSH ECX
:00421B74 53 PUSH EBX
:00421B75 52 PUSH EDX
:00421B76 50 PUSH EAX
:00421B77 FF1568D04200 CALL [KERNEL32!CreateFileA]
:00421B7D 8BF8 MOV EDI,EAX
El
paso próximo es encontrar una área de código
que sea conveniente para contener nuestra '
cautelosa ' rutina que sustituirá una copia
'íntegra' del archivo por la copia crackeada. Si
miramos atrás a que donde nosotros sabemos que
debemos insertar el crack vemos la LLAMADA
004221D0 a offset 00408B80, qué sabemos que es
la clave para derrotar el control de la fecha. Si
el código de esta rutina no es llamado en otra
parte del programa, podemos utilizar ese área
del código para alojar nuestra rutina y que esa
LLAMADA devuelva EAX como no cero (qué es el CRACK!)
. Poniendo un breakpoint en 004221D0 confirma
que la rutina sólo es usada para verificar la
fecha, así que nosotros tenemos espacio ahora
para trabajar. Primero, aplicamos el crack para
que la LLAMADA a offset 00408B80 siempre devuelva
EAX como no cero. Poniendo el valor de uno en AL
y RETornando lo hará muy bien. Así ahora
tenemos el siguiente código para un pequeño
crack a offset 004221D0:
:004221DO BOO1 MOV AL,01
:004221D2 C3 RET
Ahora
debemos crear la rutina, justo después del
código del pequeño crack, que verificará el
nombre del archivo que será abierto y, si es el
archivo FAXMNG32.EXE designado, cambia el nombre
del que será abierto a un archivo que sea
idéntico pero íntegro ("virgen"). Si
no es el archivo designado, simplemente abre
cualquier archivo nombrado y lo enlaza atrás al
código correcto. Si es el archivo designado,
abre el archivo 'virgen' que es idéntico al
FAXMNG32.EXE original íntegro, y entonces enlaza
atrás al código correcto. Para el archivo
"virgen" yo escogí nombrarlo
!AXMNG32.EXE debido a la simplicidad de cambiar
una letra en el nombre. Aquí está un
desensamblado de ése código
1) examina la dirección en la pila para cero,
indicando el extremo del path del nombre del
archivo,
2) comprueba el nombre del archivo, y si es el
archivo designado, reemplaza la primera letra del
nombre con un "!" que es el nombre del
archivo virgen
3) abre el archivo (tanto si el nombre fue
cambiado o no) y JMP atrás al código
correcto.
:004221D3 5B POP EBX
:004221D4 53 PUSH EBX
:004221D5 8A03 MOV AL,[EBX]
:004221D7 43 INC EBX
:004221D8 OACO OR AL,AL
:004221DA 75F9 JNZ 004221D5
:004221DC 83EBOD SUB EBX,OD
:004221DF 813B4641584D CMP DWORD PTR [EBX],4D584146
:004221E5 7515 JNZ 004221FC
:004221E7 817B044E473332 CMP DWORD PTR [EBX+04],3233474E
:004221EE 750C JNZ 004221FC
:004221FO 817B082E455845 CMP DWORD PTR [EBX+08],4558452E
:004221F7 7503 JNZ 004221FC
:004221F9 C60321 MOV BYTE PTR [EBX],21
:004221FC FF1568D04200 CALL [KERNEL32!CreateFileA]
:00422202 E976F9FFFF JMP 00421B7D
El paso final simplemente es escribir el código
' interruptor ' que no es nada más que
reemplazar la LLAMADA a CREATEFILEA con un jmp a
nuestra cautelosa rutina. Aquí está el
desensamblado del código que está anteriormente
listado después del parche ' interruptor ' de
seis bytes :
:00421B72 55 PUSH EBP
:00421B73 51 PUSH ECX
:00421B74 53 PUSH EBX
:00421B75 52 PUSH EDX
:00421B76 50 PUSH EAX
:00421B77 E957060000 JMP 004221D3
:00421B7C 90 NOP
:00421B7D 8BF8 MOV EDI,EAX
Eso lo es. El programa está completamente
crackeado ahora. El hilo en segundo plano que
continuamente verifica la integridad del archivo
es remitido a una copia virgen del ejecutable
cada vez que es llamado - qué por supuesto le
permite pasar cualquier CRC, checksum, o
algoritmo similar.
Como nota final, apuntaré al lector a http://www.releasesoft.com
que al parecer fue
el autor del ' sistema de comprobación de
integridad' que Symantec usó en WinFax.
Al parecer, el sistema de protección está
bastante extendido. Lastimoso, realmente.
|
|