TORN@DO presents: cRACKER's n0TES

Sistemas de Protección Comerciales: SalesAgent



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.




 
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.