--

ESTUDIO COLECTIVO DE DESPROTECCIONES
WKT Tutorialz Site
WKT
progrAmA Backgammon Pro W95
DEsCripCión Juego de sobremesa.
tipo Shareware (10 $)
protECCión Límite de 9 partidas si no estás registrado.
DiFiCultAD 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
hErrAmiEntAs Wdasm 8.9, Editor Hexadecimal
CrACkEr Mr.Brown
FEChA Julio de 1998

Introducción
El programa controla que no se puedan jugar más de 9 partidas sin haberse registrado.
Per ello, utiliza 2 marcadores para guardar el número de partidas jugadas :
  • en el registro, en HKEY_LOCAL_MACHINE\SOFTWARE\WinGames.Inc\ProBackgammon\Games Played
  • en un fichero, el C:\Windows\Wgi.Ini en el offset 240
Al iniciarse el programa, se leen estos dos valores, y si son diferentes o mayores de 9, no se podrá jugar ninguna partida.

Al Atake
Si sólo se quiere poner el contador de partidas a 0, se puede hacer a mano, editando el registro con el RegEdit, y modificando el Wgi.Ini con un editor hexadecimal.
(O sea, editar el C:\Windows\Wgi.Ini y en el offset 240 poner 00. Después ejecutar el RegEdit.Exe, buscar "games played" y poner el valor 0 )
Pero claro, no es ni cómodo ni elegante, así que mejor meterse en el pgm... ;-)

Abrir el WDasm, Open File to Disassemble y cargar el ProBack.Exe.
Ahora que ya tenemos el pgm desensamblado, vamos a cargarlo con Ctrl-L (Load Process).
Va bene, ahora ya podemos empezar a debugarlo.

Mirar en Refs/String Data References para ver que textos utiliza el pgm.
Al hacer doble click sobre uno de ellos, se mostrará en que parte del código se usa.
Seguir haciendo doble click para ver las siguientes localizaciones.

En este caso, el valor que nos puede interesar es "Registration Number".
Después de hacer doble click, apretamos PF2 para poner un BreakPoint. O sea, que el debugger se parará en esta instrucción.
En total, hay 5 referencias a "Registration Number".
Mirando un poco el código de alrededor de los BreakPoints, se pueden ver las llamadas a las funciones del API de windows.
Así podemos intuir que se hace con el "Registration Number" en cada uno de los 5 BreakPoints :

  • El primero(Line:26749 Pg 319) es para la llamada a RegQueryValueExA
  • El segundo i cuarto (Line:26807 i 28940) son para la llamada a RegCreateKeyExA
  • El tercero i quinto (Line:26829 i 28966) son para la llamada a RegSetValueExA

Iniciamos la ejecución del pgm con PF9(Run), y se parará en :0040FB5C ,(Line:26749 Pg 319) :

* Possible StringData Ref from Data Obj ->"Registration Number"
                                  |
:0040FB5C 6834764400              push 00447634
:0040FB61 50                      push eax
:0040FB62 C744243404000000        mov [esp+34], 00000004
:0040FB6A FFD7                    call edi
:0040FB6C 85C0                    test eax, eax
:0040FB6E 7404                    je 0040FB74
:0040FB70 895C2424                mov dword ptr [esp+24], ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FB6E(C)
|
:0040FB74 8B4C2410                mov ecx, dword ptr [esp+10]
:0040FB78 51                      push ecx
:0040FB79 FFD5                    call ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FB4A(C)
|
:0040FB7B 8B542414                mov edx, dword ptr [esp+14]
:0040FB7F 52                      push edx
:0040FB80 FFD5                    call ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FB2F(C)
|
:0040FB82 8B442424                mov eax, dword ptr [esp+24]
:0040FB86 8B4C2418                mov ecx, dword ptr [esp+18]
:0040FB8A 3BC1                    cmp eax, ecx
:0040FB8C 0F84AA000000            je 0040FC3C
Después de unos pocos PF8, se llega a :0040FB8C je 0040FC3C ,(Line:26777 Pg 319)
Caliente,caliente ;-))) Que pasaria si en lugar de "je" hubiera un "jne" ;-? ;-DDD
Pues sí, un simple BIT (de je(84h) a jne(85h)) hace que todas las protecciones queden anuladas (tanto la pantalla de propaganda inicial, como el límite de las 9 partidas ;-)

Os recomiendo imprimir las páginas 319-321 y intentar seguirlas un poco juntamente con el Debug para ver por donde va pasando y que va haciendo.
Por ejemplo, la comprobación de partidas jugadas se hace en :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FC70(C)
|
:0040FCC7 A1F8B54400              mov eax, dword ptr [0044B5F8]
:0040FCCC 8B542410                mov edx, dword ptr [esp+10]
:0040FCD0 B90B000000              mov ecx, 0000000B
:0040FCD5 3B5004                  cmp edx, dword ptr [eax+04]
:0040FCD8 7407                    je 0040FCE1
:0040FCDA 894C2410                mov dword ptr [esp+10], ecx
:0040FCDE 894804                  mov dword ptr [eax+04], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FCD8(C)
|
:0040FCE1 394C2410                cmp dword ptr [esp+10], ecx
:0040FCE5 730A                    jnb 0040FCF1
:0040FCE7 C705C8B5440001000000    mov dword ptr [0044B5C8], 00000001
El valor del registro "games played" está en EDX, el valor del fichero Wgi.Ini está en EAX, y el máximo de partidas permitidas está en ECX (0Bh=10d)

Ya para acabar, sólo falta modificar el fichero ProBack.Exe con un Editor hexadecimal.
Es facil localizar la posición, ya que el Wdasm indica el offset dentro del fichero. (Ej: @Offset 0000EF8Ch in File:ProBack.exe)