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)
|