Gracias, me alegro de que te guste, esa es la idea, que sea util.
Bueno pues os presento un crack que acabo de hacer para un juego bastante raro: What They Don't Teach You At Harvard Business School.
(https://i.postimg.cc/02sLMGv9/ventman-000.png) (https://i.postimg.cc/xT3BKkjM/ventman-001.png)
Es una especie de simulacion empresarial o algo asi. Contratas gente, vas a fiestas y hablas/bailas/ligas con otra peña del business, etc etc y todo ello en modo texto. Parece bastante currado y probablemente si consigues pillarle el punto tenga su aquel, pero debo confesar que yo no lo he probado mas de 5 o 10 minutos.
Ficha en Home Of The Underdogs: http://www.homeoftheunderdogs.net/game.php?id=2460
Podeis bajar juego y crack del listado principal.
Nota: Esto son notas del crack y no hay que hacer nada mas, el ejecutable ya esta crackeado. Para jugar sin claves simplemente ejecutar RUNME.BAT
Se incluye tambien el ejecutable original sin crackear renombrado a VENTMAN.EX_
----------------cut cut cut----------------
CS:02AC 9A0C008A1D call 1D8A:000C ; llamamos a rutina de comprobacion de claves
CS:02B1 8BE5 mov sp,bp
CS:02B3 85C0 test ax,ax ; ¿clave correcta? ¿AX=0?
CS:02B5 7404 je 02BB ; CHICO_BUENO
CS:02B7 33DB xor bx,bx
CS:02B9 EB03 jmp short 02BE ; CHICO_MALO
Los saltos anteriores corresponden a UNA posible clave de todas las que el juego comprueba.
Para crackearlo en todas las comprobaciones que el juego hace, tenemos que modificar dentro de la rutina de comprobacion de claves. Tenemos que hacer que justo antes de la instruccion RET, el registro AX sea cero, con lo cual el "test ax,ax" se cumplira y nos iremos por el camino chico_bueno.
==rutina comprobacion de claves:
(...)
CS:0076 8BE5 mov sp,bp
CS:0078 8B5E00 mov bx,[bp]
CS:007B 2BD8 sub bx,ax ; CRACK ~ SUB BX,BX (29 DB) ; BX=0
CS:007D 8BC3 mov ax,bx ; AX = BX = 0
CS:007F 83C404 add sp,0004
CS:0082 5D pop bp
CS:0083 CB retf ; retornamos con AX=0
hexedit VENTMAN.EXE y sustituir
8b e5 8b 5e 00 2b d8 8b c3 83 c4 04 5d cb
por
8b e5 8b 5e 00 29 db 8b c3 83 c4 04 5d cb
Añadido fix para poder usar el raton en Pereda Connection en versiones de DOSBox superiores a la 0.58. En el listado del primer mensaje.
(https://www.abandonsocios.org/wiki/images/thumb/7/76/Pereda_Connection_-_05.png/200px-Pereda_Connection_-_05.png) (https://www.abandonsocios.org/wiki/images/thumb/a/a1/Pereda_Connection_-_06.png/200px-Pereda_Connection_-_06.png) (https://www.abandonsocios.org/wiki/images/thumb/4/43/Pereda_Connection_-_12.png/200px-Pereda_Connection_-_12.png) (https://www.abandonsocios.org/wiki/images/thumb/1/1b/Pereda_Connection_-_13.png/200px-Pereda_Connection_-_13.png)
--- CTMOUSE.ASM 2002-10-01 02:09:00.000000000 +0200
+++ CTMOUSE.ASM.PATCHED 2019-10-28 22:07:11.006362000 +0100
@@ -1279,6 +1279,7 @@
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
graphcursor proc
+ shl ax,1
sub ax,[hotspot.X] ; virtual X
sub bx,[hotspot.Y] ; virtual Y
mov si,16 ; cursor height
Bueno, otro juego para el que que yo sepa nunca se ha publicado crack. Railroad Empire, un juego de 1989, predecesor del A-Train. El cabron tiene nada mas y nada menos que cuatro chequeos en el codigo.
(https://i.postimg.cc/YS29hFFW/rempire.jpg)
Descargas como siempre en el listado del hilo principal.
Feliz vicio!!
BP 0339:1B2E
0339:1BAB 0AC0 or al,al
0339:1BAD 75BD jne 1B6C ; CRACK ~ NOP NOP (90 90)
(...)
0339:1BD7 263800 cmp es:[bx+si],al
0339:1BDA 7408 je 1BE4 ; CRACK ~ JMP SHORT (EB 08)
(...)
0339:1BF3 26803800 cmp byte es:[bx+si],00
0339:1BF7 75D3 jne 1BCC ; CRACK ~ NOP NOP (90 90)
(...)
0339:1BFB 807AD600 cmp byte [bp+si-2A],00
0339:1BFF 75DB jne 1BDC ; CRACK ~ NOP NOP (90 90)
Genial!! :)
Bueno, pues ahi va otro juego para el que que yo sepa nunca se ha publicado crack. Champions of Krynn (1990).
(https://i.postimg.cc/cL0DVjWv/krynn00.jpg) (https://i.postimg.cc/9QbxVpXJ/krynn01.jpg) (https://i.postimg.cc/vmm0mVcM/krynn02.jpg) (https://i.postimg.cc/2jW23m8q/krynn03.png) (https://i.postimg.cc/nrqkWKwK/krynn04.jpg) (https://i.postimg.cc/G28zFnF5/krynn05.jpg) (https://i.postimg.cc/fbgBSR9d/krynn06.jpg) (https://i.postimg.cc/ZKhjdgCw/krynn07.png) (https://i.postimg.cc/Y95R8D8q/krynn08.jpg)
En este caso, como en otros tantos de la epoca, ademas de buscar con el debugger los bytes que necesitamos cambiar para crackearlo se añade la complicacion de no poder usar un editor hexadecimal para cambiar esos bytes de forma permanente, ya que el juego se descomprime/desempaqueta en memoria despues de cargarse, asi que los bytes que queremos cambiar no se encuentran en ningun archivo del juego.
Para desprotegerlo tenemos al menos dos opciones.
La opcion hardcore es volvernos locos intentando descifrar la rutina de descifrado/descompresion, y parchear en la posicion correspondiente los bytes que queremos conseguir pero _codificados_ de tal forma que cuando la rutina de descifrado empiece a descomprimir bytes en memoria los bytes resultantes sean los que anulan la proteccion.
Una opcion mas sana mentalmente es hacer un cargador en ASM que capture alguna INT que el juego use y cambie los bytes en memoria una vez el juego los ha descomprimido. Pues eso es lo que he hecho. Para quien le interese he incluido tambien el codigo fuente del cargador, es el archivo de texto CRACK.ASM
Los archivos como siempre en el listado del hilo principal. Cuando pueda le hago una ficha.
Feliz vicio!! :)
==breakpoints sugeridos
bpint 16
bp XXXX:031F ; se ha pulsado una tecla
bp YYYY:02C3 ; no me acuerdo, quizas para salir de algun bucle
bp YYYY:08CE ; se ha pulsado intro
==codigo
ZZZZ:0423 9AC90B7F0D call 0D7F:0BC9
ZZZZ:0428 7403 je 042D ($+3) ; CRACK ~ JMP SHORT (EB 03)
ZZZZ:043E 9AC90B7F0D call 0D7F:0BC9
ZZZZ:0443 7506 jne 044B ($+6) ; CRACK ~ NOP NOP (90 90)
==cracks
sm ZZZZ:428 eb 03
sm ZZZZ:443 90 90
Ahi va otro crack que acabo de hacer. Sensible Soccer: European Champions: 92/93 Edition, tambien conocido como Sensible Soccer v1.1 o el primer Sensible Soccer que salio para PC/DOS.
(https://i.postimg.cc/Fs16rKkW/00.gif) (https://i.postimg.cc/9FSnrjGW/01.gif) (https://i.postimg.cc/8z6nvnHL/02.gif)
Musica Sound Blaster. Teclas: Cursores y Z. Se puede reconfigurar ejecutando INSTALL.EXE
Las descargas, como siempre, en el hilo principal.
Es el mejor juego de futbol de la historia, cuando pueda le hago un hilo.
Feliz vicio :)
Nota: En internet hay una version que no esta del todo bien desprotegida: oldgames.ru, eXoDOS, Total DOS Collection... todos tienen el juego con un cargador hecho con el programa NeverLock, que no acepta una clave vacia (pulsar intro sin mas) como valida. ¿Por que? porque el crack de NeverLock solo anula uno de los dos saltos a chico_malo del juego, el segundo salto que aparece dentro del spoiler no lo anula.
==breakpoints sugeridos
bpint 9
bp XXXX:0494 ; se ha pulsado una tecla
bp XXXX:049B ; se ha pulsado intro
(Al llegar a la pantalla de claves entramos al debugger. El segmento donde caemos es XXXX)
==codigo
F3 A6 REPZ CMPSB ; compara DS:SI con ES:DI (clave correcta con clave introducida por usuario) hasta que CX=0 o algun caracter no coincida
74 03 JE ($+3) ; ¿las claves coinciden? => Saltar al juego
; CRACK ~ jmp ($+3) ~ eb 03
E9 C8 FB JMP ($-438) ; ¿no coinciden? => maldito pirata, fuera
(...)
8B 0E 87 5E MOV CX,[5E87] ; esta instruccion pone en CX el numero de caracteres de la clave y no queremos eso, porque para una clave vacia CX seria 0, con lo que nos iriamos por el segundo salto (maldito pirata, fuera)
; CRACK ~ xor cx,cx ~ 31 c9
; inc cx ~ 41
; nop ~ 90
0B C9 OR CX,CX ; ¿cx=0?
75 03 JNE ($+3) ; NO: chico_bueno
E9 EA FB JMP ($-416) ; SI: maldito pirata, fuera
==cracks
sm XXXX:04E9 31 c9 41 90
sm XXXX:0511 eb
Bueno, pues despues del crack del Sensible Soccer, os dejo uno para un juego al que le ocurre lo contrario al Sensible. Se trata del Mech Brigade (1987), un juego que solo acepta como valida una clave vacia (aparte de las correctas claro esta), el resto son incorrectas para el juego.
(https://www.mobygames.com/images/shots/l/280334-mech-brigade-dos-screenshot-title-screen.png) (https://www.mobygames.com/images/shots/l/280336-mech-brigade-dos-screenshot-assembling-my-army-for-world-domination.png)
El tema es que en la rutina de comprobacion de claves ambos juegos usan unas instrucciones similares para comprobar la clave caracter a caracter.
Sensible Soccer -> REPZ CMPSB ; compara DS:SI con ES:DI (clave correcta con clave introducida por usuario) hasta que CX=0 o algun caracter no coincida
Mech Brigade -> LODSB ; pone en AL el byte que hay en la direccion DS:SI (clave correcta)
REPZ SCASB ; compara AL con el byte que hay en ES:DI (clave correcta con clave introducida por usuario) hasta que CX=0 o algun caracter no coincida
==Sensible Soccer:
En Sensible Soccer esta muy bien hecho, porque con una clave vacia (CX comienza valiendo 0) aunque el juego no llame a la rutina de comprobacion de claves, salta a maldito_pirata_fuera.
Ademas si intentas anular el salto, el juego acaba en una violacion de segmento y salimos al DOS. Ese es el motivo por el que en lugar de cambiar el salto, que seria la solucion mas simple y por tanto la mejor, cambie la instruccion que guarda en CX la longitud de la clave (MOV CX,[5E87]) para que pusiera longitud=1.
Es decir, que con el crack la rutina de comprobacion de claves realmente solo comprueba un caracter de la palabra. Quizas es un poco mas intrusivo pero si queria que aceptara una clave vacia como valida no me quedaba opcion.
==Mech Brigade:
En Mech Brigade con una clave vacia (CX=0) el juego tampoco llama a la rutina de comprobacion de claves, peeero en vez de enviarnos por el camino maldito_pirata_fuera, salta al juego. :rolleyes:
Es una lastima, porque creo recordar que Mech Brigade como poco tiene un empaquetado propio, y eso siempre complica las cosas, a no ser que hagas un cargador. Pues eso es lo que hice. Se incluye -share or die- el codigo fuente del cargador en ensamblador: es el archivo de texto CRACK.ASM
Las descargas, como siempre, en el primer mensaje.
Feliz vicio :)
==breakpoints sugeridos
bpint 3F
bp cs:29A2 ; se ha pulsado una tecla
bp cs:473D ; se ha pulsado intro
bp cs:473D ; 1er chequeo de la clave
bp cs:44AD ; 2o chequeo
bp cs:BE8A ; 3er chequeo
==codigo
cs:473D 3C61 cmp al,61
cs:473F 7206 jc 4747 ; CRACK ~ JMP SHORT (EB 06)
(...)
cs:4745 245F and al,5F
cs:4747 C3 ret
cs:44AD 0AC0 or al,al ; CRACK ~ XOR AL,AL (30 C0)
cs:44AF E0E7 loopne 4498
cs:44B1 41 inc cx
cs:BE8A 0AC0 or al,al
cs:BE8C 75BE jne BE4C ; CRACK ~ NOP NOP (90 90)
==cracks
sm cs:473F eb 06 ; jc -> jmp short
sm cs:44AD 30 c0 ; or al,al -> xor al,al
sm cs:BE8C 90 90 ; jne -> nop nop
Wargame of the Century v2.05c (1987) [crack]
El crack esta pensado para la version 2.05c. Probablemente no funcione en otras.
(https://i.postimg.cc/26v7GQJT/empire-000.png) (https://i.postimg.cc/HWwt7tbk/empire-003.jpg) (https://i.postimg.cc/rpJCdVBF/empire-003.png) (https://i.postimg.cc/0j0dR89w/empire-002.png)
Descargas en el primer mensaje del hilo.
39 8F AA 0C cmp word ptr [bx+0caah], cx ; ¿clave correcta?
74 03 je ($+3) ; SI: saltar al juego ; CRACK ~ JMP SHORT ($+3) ~ EB 03
E9 40 FE jmp ... ; NO: maldito pirata fuera ; CRACK ~ NOP NOP NOP ~ 90 90 90
Actualizado el mensaje inicial con un nuevo crack. Breach 2 (https://www.abandonsocios.org/index.php?topic=17206.msg166502#msg166502), un juego de estrategia por turnos desarrollado por Omnitrend Software en 1990.
----
La proteccion es sencilla. Es suficiente con modificar un salto condicional a chico_bueno por un salto incondicional.
Ejecutamos el juego, y cuando nos pregunta por la clave entramos al debugger de DOSBox (ALT+PAUSA).
Para intentar caer lo mas cerca posible del punto donde el juego comprueba la clave introducida, ponemos un breakpoint a la INT 9 (INT de teclado de la BIOS). DOSBox debugger -> BPINT 9
Reanudamos la ejecucion (F5), y en el juego pulsamos Intro. Entonces saltara el debugger. Nos situamos en la primera instruccion de la INT 9 (debugger -> INTHAND 9) y vamos ejecutando instruccion por instruccion (F10).
Por alguna razon que no he analizado, al llegar a la instruccion IRET de la INT 9, podemos retornar a dos puntos distintos del codigo, segun la clave sea correcta o no. Bueno, vamos a probar con "la otra" INT de teclado: INT_16 (interrupcion de teclado del DOS). Salimos del juego y volvemos a empezar. debugger -> BPINT 16 y las cosas parecen mas favorables, ya que cuando retornamos con IRET, estamos en el mismo punto del codigo tanto si introducimos una clave correcta como incorrecta.
Bien, seguimos ejecutando paso a paso (F10) y bueno, si llegamos a algun CALL y, tras pulsar F10, el juego nos salta con el mensaje de "clave invalida", entonces significa que el chequeo de claves esta dentro de dicho CALL. Entonces saldremos de DOSBox y volveremos a empezar, y al llegar a ese CALL, en vez de pulsar F10 pulsaremos F11 para entrar en el. Esta es la parte aburrida, pero
no tardamos en llegar al meollo de la cuestion: un bucle repeat-until donde se comprueba la clave introducida con la correcta, caracter a caracter. La condicion que rompe el bucle es:
339:FC50 3BCE cmp cx,si ;¿hemos comprobado todos los caracteres de la clave?
339:FC52 77D4 ja FC28 ($-2c) ;NO: seguir con el siguiente caracter
339:FC54 ... ;buen sitio para poner un breakpoint
Cuando estamos en "cmp cx,si", CX=num_chars_por_comprobar. Justo despues viene el salto condicional "ja FC28", que rompera el bucle cuando no queden caracteres por comprobar.
Si queremos avanzar hasta cuando se haya comprobado toda la clave, un buen sitio para poner un breakpoint es la primera instruccion que se ejecuta justo despues de salir del bucle. En esta ejecucion seria -> BP 339:FC54. Reanudamos la ejecucion con F5 y unas pocas instrucciones despues llegamos al punto en que el codigo comprueba si la clave entera ha sido correcta o no. El flujo de ejecucion se divide en dos caminos.
CS:FC60 263987A21C cmp es:[bx+1CA2],ax ;¿chico bueno o chico malo?
CS:FC65 7443 je FCAA ($+43) ;chico_bueno (crack: JMP ~ EB 43)
CS:FC67 ... ;chico_malo
Si la clave es correcta -> al juego en si -> seguir ejecucion en CS:FCAA
Si no lo es -> poner mensaje de clave incorrecta y volver a pedir la clave, aqui no juega nadie hasta que la clave sea buena, y si fallas X veces, salir al DOS -> seguir ejecucion en CS:FC67
El salto condicional "je FCAA" se cumple para chico_bueno (clave introducida = clave correcta). Por lo tanto, para que chico_malo pueda jugar tambien, la solucion simple es modificar el salto condicional por un salto incondicional. Es decir, modificar "JE +43h" por "JMP +43h". Es decir, modificar los bytes "74 43" por "EB 43". En esta ejecucion seria -> SM 339:FC65 EB 43
Si seguimos la ejecucion paso a paso con unos cuantos F10, veremos que entramos al juego en si.
No nos hemos topado con ninguna comprobacion adicional, asi que parece que solo tenemos que modificar un byte para que el juego acepte cualquier clave como valida. :)
Abrimos BREACH2.EXE con un editor hexa y buscamos la cadena "263987A21C7443". Y... no la encontramos.
Resulta que el codigo en tiempo de ejecucion (en memoria) es distinto al codigo en el archivo ejecutable, pero no pasa nada, podemos seguir relajados, no hara falta hacer ningun cargador/TSR que modifique el codigo en tiempo de ejecucion.
El ejecutable esta empaquetado (comprimido) y cuando lo ejecutamos se desempaqueta (descomprime) en memoria. Asi que vamos a descomprimir el archivo. La herramienta UNP.EXE [1] (http://unp.bencastricum.nl/) es una buena primera opcion. No puede desempaquetar todo, pero es bastante todoterreno. Desde DOSBox:
UNP BREACH2.EXE
Y ya tenemos el ejecutable descomprimido. Volvemos a abrirlo con un editor hexa y buscamos la cadena "263987A21C7443", que ya si encontramos. La sustituimos por "263987A21CEB43" y ya esta. Ya hemos crackeado el juego. :)
Si en debugger escribimos:
SM segment:offset CF
dosbox-vanilla escribira el byte CF (iret), pero dosbox-x escribira 0 ó 1, en funcion del valor del flag de carry (CF). Hay una colision entre el nombre de algunos flags (AC, AF, CF y DF) y los valores en hexa.
Para solucionarlo yo lo que hice fue eliminar unas pocas lineas del codigo fuente de dosbox-x, y dejar un pequeño parche en Vogons [2] (https://www.vogons.org/viewtopic.php?p=806403#p806403)
En versiones posteriores de dosbox-x, se añadio la posibilidad de escribir los bytes entre "" para forzar que la cadena se tome como valores hexa.
Feliz cracking.
[1] http://unp.bencastricum.nl/
[2] https://www.vogons.org/viewtopic.php?p=806403#p806403
la verdad es que no recuerdo haber hecho nunca un nocd para DOS, asi que le estuve dando al Igor.
para comprobar si el CD esta insertado, el juego accede a una serie de archivos.
...
OpenFile-R/W: C:\IGOR\IGOR.DAT
OpenFile-R/W: D:\IGOR\IGOR.DAT
CreateFile : D:\IGOR\IGOR.SAV -> devuelve CF=1 y AX=5 Access denied
OpenFile-R/W: IGOR.CFG -> aqui hemos pasado el chequeo de cd
...
...
OpenFile-R/W: C:\IGOR\IGOR.DAT
OpenFile-R/W: D:\IGOR\IGOR.DAT
OpenFile-R/W: E:\IGOR\IGOR.DAT
OpenFile-R/W: F:\IGOR\IGOR.DAT
OpenFile-R/W: G:\IGOR\IGOR.DAT
OpenFile-R/W: H:\IGOR\IGOR.DAT
OpenFile-R/W: I:\IGOR\IGOR.DAT
OpenFile-R/W: J:\IGOR\IGOR.DAT
OpenFile-R/W: K:\IGOR\IGOR.DAT
OpenFile-R/W: L:\IGOR\IGOR.DAT
OpenFile-R/W: M:\IGOR\IGOR.DAT
OpenFile-R/W: N:\IGOR\IGOR.DAT
OpenFile-R/W: O:\IGOR\IGOR.DAT
OpenFile-R/W: P:\IGOR\IGOR.DAT
OpenFile-R/W: Q:\IGOR\IGOR.DAT
OpenFile-R/W: R:\IGOR\IGOR.DAT
OpenFile-R/W: S:\IGOR\IGOR.DAT
OpenFile-R/W: T:\IGOR\IGOR.DAT
OpenFile-R/W: U:\IGOR\IGOR.DAT
OpenFile-R/W: V:\IGOR\IGOR.DAT
OpenFile-R/W: W:\IGOR\IGOR.DAT
OpenFile-R/W: X:\IGOR\IGOR.DAT
y sale al DOS con el mensaje No se encontro CD de IGOR
pues bien, resulta que si cambiamos esta llamada:
OpenFile-R/W: D:\IGOR\IGOR.DAT
por esta otra:
OpenFile-R: C:\IGOR.DAT
habremos crackeado el juego. :) (C:\IGOR.DAT debe existir)
bpint 21 3d 2 ;breakpoint en INT 21/3d02
;pulsar F5 dos veces (nos interesa la segunda parada)
d ds:dx ;ds:dx tiene que apuntar a D:\IGOR\IGOR.DAT)
sm ds:dx 43 3a 5c 49 47 4f 52 2e 44 41 54 0 ;lo cambiamos por C:\IGOR.DAT (debe existir)
sr al 0 ;ponemos AL=0
bpdel 0 ;quitamos el breakpoint a INT 21/3d02
;pulsar f5 y entraremos al juego
conseguido desde el debugger, hice un TSR que captura la llamada a INT 21/3d que nos interesa y la modifica al vuelo.
;hook INT 21 3d ;¿Open File Using Handle?
;cuando
;DS:DX -> D:\IGOR\IGOR.DAT
;AL=2 ; read-write
;cambiar por
;DS:DX -> C:\IGOR.DAT
;AL=0 ;read-only
el tema es que cuando el juego llama a INT 21/3d , el cabron ya ha entrado en modo protegido, por lo tanto cuando la instruccion INT 21 se ejecuta, ya no salta al segment:offset de nuestra rutina INT 21 en modo real, puesto que en modo protegido ya no se usan los punteros de la interrupt vector table (IVT) para llamar a interrupciones, sino que hay IDT y otras cosas que tengo que estudiar.
sigo pensando que la mejor solucion es imgmount, pero si aprendo a capturar una INT en modo protegido a traves de dpmi (http://www.delorie.com/djgpp/doc/dpmi/ch4.8.html) y consigo un TSR funcional en modo protegido comparto.