--

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)



[ Entrada | Documentoz GenΘricoz | WKT TEAM Main Site ]
[ Todo el ECD | x Tipo de Protecci≤n | x Fecha de Publicaci≤n | x orden AlfabΘtico ]