Herramientas : W32dasm : yo uso la ver. 8.93 Hiew (lo uso
porque permite modificar directamente el assembler y asi no hace falta averiguar
los codigos en hex (aunque esto ultimo noes demasiado complicado si tienes
una buena lista de opcodes)) ver. 6.15 Para realizar este patch usaremos
la vieja tecnica de los listados "muertos", es decir desensamblaremos elprograma
principal [Opera.exe] y estudiaremos el codigo sin que este se encuentre
en ejecución. Bueno, a lo dicho lanzamos el w32dasm i seleccionamos para
desensamblar el opera.exe, y le damos al botoncito Str. Ref. (nos da las
referencias a cadenas de texto), buscamos palabras del tipo "Registered
", "unregistered", o algunas de las palabrejas tan gratas que te dicen cuando
introduces un serial incorrecto. Desisti de intentar parchear la rutina
de comprovación del serial ya que no encontre nada que me gustase. Asi pues
intentemos otro camino, ¿cuando sabe el programa si estamos o no registrados?.
Quien lo sepa que levante el dedo!!
MUY BIEENN!!! Seguro que ya lo sabes es AL PRINCIPIO cuando
te da ese pantalluco blanco tan feo antes de arrancar.
Y cual es la palabra magica ..... SII!!! UNREGISTERED!!!
Muy bien, sabiendo esto nos vamos al principio del codigo
desensamblado y abrimos una busqueda y tecleamos "Unregistered" (sin comillas),
esto nos da dos casos (el bueno es el segundo), asi pues nos vamos al segundo
caso y aparece..
:0049749D 68252B0000 push 00002B25
:004974A2 FF7508 push [ebp+08]
:004974A5 FFD6 call esi
:004974A7 8D856CFCFFFF lea eax, dword ptr [ebp+FFFFFC6C]
:004974AD 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B26, "
" |
:004974AE 68262B0000 push 00002B26
:004974B3 FF7508 push [ebp+08]
:004974B6 FFD6 call esi
:004974B8 393D0C155100 cmp dword ptr [0051150C], edi
:004974BE 752A jne 004974EA
:004974C0 68FF000000 push 000000FF
:004974C5 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]
:004974CB 50 push eax * Possible Reference to String Resource
ID=21428: " (unregistered)" ******nuestro amigo!!! |
:004974CC 68B4530000 push 000053B4
:004974D1 FF35180F5100 push dword ptr [00510F18]
:004974D7 FFD3 call ebx
:004974D9 8D85C5FEFFFF lea eax, dword ptr [ebp+FFFFFEC5]
:004974DF 50 push eax * Possible Reference to Dialog: SPLASH,
CONTROL_ID:2B25, " "
seguro que ya sabes por donde voy ¿no? es facil..
:0049749D 68252B0000 push 00002B25
:004974A2 FF7508 push [ebp+08]
:004974A5 FFD6 call esi
:004974A7 8D856CFCFFFF lea eax, dword ptr [ebp+FFFFFC6C]
:004974AD 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B26,
" " |
:004974AE 68262B0000 push 00002B26
:004974B3 FF7508 push [ebp+08]
:004974B6 FFD6 call esi
:004974B8 393D0C155100 cmp dword ptr [0051150C], edi ***aqui
compara dos valores
:004974BE 752A jne 004974EA **********aqui decide si eres
un buen o un mal chico
:004974C0 68FF000000 push 000000FF
:004974C5 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]
:004974CB 50 push eax * Possible Reference to String Resource
ID=21428: " (unregistered)" |
:004974CC 68B4530000 push 000053B4
:004974D1 FF35180F5100 push dword ptr [00510F18]
:004974D7 FFD3 call ebx
:004974D9 8D85C5FEFFFF lea eax, dword ptr [ebp+FFFFFEC5]
:004974DF 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B25,
" "
asi pues trato de invertir el salto con un "je" pero no da
resultado, y eso quiere decir que debe almacenar algun valor que le indique
si estamos o no registrados , asi pues probamos con este [0051150C] , abrimos
una busqueda y metemos 0051150C, nos da un par o tres ocurrencias, de las
cuales hay una que parece interesante
:00497336 8D8DE8F2FFFF lea ecx, dword ptr [ebp+FFFFF2E8]
:0049733C E8A05C0200 call 004BCFE1
:00497341 8D8DE8F2FFFF lea ecx, dword ptr [ebp+FFFFF2E8]
:00497347 E8065B0200 call 004BCE52
:0049734C 3BC7 cmp eax, edi
:0049734E A30C155100 mov dword ptr [0051150C], eax ******aqui
mueve el contenido de eax a nuestro amiguete
:00497353 68BC040000 push 000004BC
:00497358 7415 je 0049736F
pero donde leches mete el contenido de eax?? mirad dos lineas
mas arriba...
:00497347 E8065B0200 call 004BCE52
Si seguimos este call aterrizamos en la rutina que revela
la existencia no registrada
* Referenced by a CALL at Addresses: |:0045E2DA , :00497347
|
:004BCE52 8D8138010000 lea eax, dword ptr [ecx+00000138]
:004BCE58 85C0 test eax, eax
:004BCE5A 741A je 004BCE76 ***********todos estos saltitos
van a la rutina de mas abajo que es la que revela la existencia no registrada,
es decir si los evitamos, ya estamos registrados
:004BCE5C 803800 cmp byte ptr [eax], 00
:004BCE5F 7415 je 004BCE76
:004BCE61 81C190030000 add ecx, 00000390
:004BCE67 51 push ecx :
004BCE68 E88650FDFF call 00491EF3
:004BCE6D 85C0 test eax, eax
:004BCE6F 59 pop ecx
:004BCE70 7404 je 004BCE76
:004BCE72 6A01 push 00000001 ********* Esto dice "adelante
amable comprador".
:004BCE74 58 pop eax :
004BCE75 C3 ret *****retorna registrado.
* Referenced by a (U)nconditional or (C)onditional Jump at
Addresses:
|:004BCE5A(C), :004BCE5F(C), :004BCE70(C) | ***** los jumps
de arriba van a parar aqui.
:004BCE76 33C0 xor eax, eax ************ Esto dice "oh!
oh! este niño malo no esta registrado.
:004BCE78 C3 ret ***retorna "no registrado"
asi pues sabiendo todo esto, nos apuntamos el offset i nos
vamos al hiew, abrimos Opera.exe i nos situamos en el offset que corresponde
(ahora no macuerdo) le damos a F4, seleccionamos el modo codigo y cambiamos
el je 004BCE76 por jmp 004bce72 le damos a actualizar, con lo cual cuando
se llame a esta rutina pasara de los saltos y ira directamente a decirnos
"Buenos dias amable registrado".
Y yasta...
by. n3bUr+
psxmodchip@latinmail.com
|