Introducción
Hola a todos, ya sé que hay un tutor en Midtown
MadNess por Black Check, pero la manera de
crackearlo no es la misma que la que él ha
escogido, y yo explicaré más cosas que él
sobre pegar nuestras nuevas secciones
"dumpeadas" en el crackeado EXE :) Yo
también asumo que leíste su tut, y sabes
algunas cosas sobre el archivo de formato PE... Herramientas
requeridas
- El CD Original de Midtown Madness (una copia
1:1 y el crack de Laxity deberías hacerlo
también)
- SoftICE 3.23
- SoftICE Tool to patch SoftICE (usado para
"dumpear" secciones)
- ProcDump
1.5 (para PE Editor)
- HexWorkshop
- Frogsice (para
ocultar SoftICE)
- Exescope
Después de
instalar tu pequeño juego, edita los archivos PE
" .ICD" con ProcDump. (Arrancas
ProcDump, pulsa el botón en PE Editor, Examina
tus archivos" .ICE", allí está
MIDTOWN.ICE). Ahora, debes ver:
- Entry Point : 00166C10
- Image Base : 00400000
Ok, nosotros necesitaremos el OEP
(Punto de entrada original) después, así que
para calcularlo simplemente añade la Image Base
y el Entry Point introduciendo en ProcDump:
00400000 + 00166C10 = 566C10
Ahora, click en el Botón "sections",
para ver todas las secciones del archivo,:
¡Sólo necesitarás tener los Offset Virtuales,
y los valores de Raw Size y Raw Offset !
- para la sección ".text":
Virtual Offset: 00001000
Raw Size: 18D78F
Raw Offset: 600
- para la sección ".Rdata":
Virtual Offset: 0018F000
Raw Size: 14C99
Raw Offset: 18DE00
- para la sección ".data":
Virtual Offset: 001A4000
Raw Size: 3D8A4
Raw Offset: 1A2C00
- para la sección ".data1":
Virtual Offset: 00314000
Raw Size: 20
Raw Offset: 1E0600
- para la sección ".rsrc":
Virtual Offset: 00315000
Raw Size: CB3
Raw Offset: 1E0800
Ahora
"dumpearemos" todas las secciones del
archivo" .ICD", exceptuando el"
.Rdata" (sabrás después por qué....). A
propósito, necesitas agregar la Image Base al
virtual Offset de todas las secciones:
.text : 400000 + 00001000 = 00401000
.rdata : 400000 + 0018F000 = 0058F000
.data : 400000 + 001A4000 = 005A4000
.data1 : 400000 + 00314000 = 00714000
.rsrc : 400000 + 00315000 = 00715000
Ok, ahora
dumpearemos todas estas secciones (excepto el
.rdata). Para esto, necesitaremos poner un
breakpoint en el EOP (566C10 para nosotros). A
propósito, asumo que leíste el tutor de Black
Check, y que parcheaste tu FrogsICE para esconder
a SoftICE (nota de TORN@DO: o usa el último
FrogsICE), si no ve y lee el simpático tut
antes...
Arranca tu
(parcheado) FrogsICE, y corre tu juego original.
Verás un pequeño vídeo, en este momento,
cambia a SoftICE (Ctrl+D), y pon un BPX en el
OEP. BPX 56CC10 para este juego!
Aprieta F5 para permitir al juego continuar
corriendo y ciérralo después. Ahora,
ejecútalo, y normalmente rompe en 56CC10. Si no
lo hace, mira si pusiste el BPX en buen lugar
(bl: debes conseguir algo así: #025F:56CC10).
Asumo que rompió, ahora "dumpea" todas
las secciones. Antes de "dumpear" sin
embargo, desactiva todos tu BPX, ya que nosotros
no queremos mierda en nuestras secciones
"dumpeadas"...(n.del t.: traducido
literalmente :-Þ)
El comando pagein trabaja así:
pagein "dirección para comenzar el
dumpeado" "tamaño" "nombre
de archivo"
Así que, simplemente escribe lo siguiente en
SoftICE:
pagein 401000 18D78F c:\text.bin
pagein 5A4000 3D8A4 c:\data.bin
pagein 714000 20 c:\data1.bin
pagein 715000 CB3 c:\rsrc.bin
¡Ok, esto
"dumpeó" las secciones a nuestro disco
duro! ¡Ahora, tenemos que hacer la parte
"delicada", que es "dumpear"
nuestras secciones rdata por supuesto, pero no es
como las otras!
En primer lugar, tienes que conseguir la
dirección real de la función, así que
remontaremos dentro de la LLAMADA a nuestra
sección rdata.
Después de romper, aterrizamos aquí:
00566C10 PUSH EBP <-- Rompemos aquí, en el punto de entrada
00566C11 MOV EBP,ESP
00566C13 PUSH FF
00566C15 PUSH 005968D0
00566C1A PUSH 00566724
00566C1F MOV EAX,FS:[00000000]
00566C25 PUSH EAX
00566C26 MOV FS:[00000000],ESP
00566C2D ADD ESP, 5C
00566C30 PUSH EBX 00566C31 PUSH ESI
00566C32 PUSH EDI
00566C33 MOV [EBP-18],ESP
00566C36 CALL [0058F14C] <-- Esta es la llamada en nuestra sección rdata,
tracéala (F8)
En esta LLAMADA,
aterrizamos aquí:
009A6485 pushad
009A6486 push 00000031
009A6488 push 00000000 ---> esto es 0 para kernels y 1 para users ...
009A6490 call [9A64A6] ---> consigue la dirección real de la función
(9A64A6)
009A6496 add esp, 8
009A6499 popad
....... jmp [XXXXXXXX]
Rastrea este
código, y veras al jmp [XXXXXXXX] convertirse en
el jmp [KERNEL32!GetVersion]...
Ok, está bien, estás en el buen camino;).
¡Estamos cerca de donde empieza a codificar el
fijador de la LLAMADA!
¡Sin embargo, nosotros necesitamos saber
cuántas importaciones de Kernels y users hay en
este juego! Para hacer esto, hay varias maneras,
puedes desensamblar el" .icd" con
W32DASM y puedes contarlos, también puedes
remontar en SoftICE, o usar la herramienta (como
yo hice) EXESCOPE para ver cuántas importaciones
tiene...
En mi midtown.icd, yo tengo:
- 127 kernels import
- 042 users import
Ok,
pero necesitamos tener estos números en
hexadecimal, porque SoftICE usa solo valores hexa
=)
Mi parte
favorita comienza ahora: Codificando el fijador
de la LLAMADA. En primer lugar, no tenemos acceso
de escritura (acceso solo lectura) para la
sección Rdata, así que moveremos la sección
rdata al lugar de la sección data...
Para codificar el fijador de la LLAMADA, yo
empiezo a codificar en el emplazamiento de EOP,
así que habilita tu BPX en él y ejecuta el
juego de nuevo. Espera hasta que rompamos...
ahora tenemos que mover la sección rdata al
lugar de la sección data, en memoria.
Para hacer esto, simplemente escribe:
m "virtual
offset de sección data + image base" l
"tamaño rdata"M "data virtual
offset"
NOTA: Para el data virtual offset, usa un numero
grande, es mejor ...
5A4000 es nuestro normal virtual offset, Yo he
usado 5B0000 (mayor, como te dije)
Así que simplemente escribe esto:
m 58F000 l 14C99 5B0000
Ok, ahora es tiempo de codificar. Estás en la
línea:
566C10 PUSH EBP
Nosotros codificaremos algo parecido a esto:
00 pushad
01 push ebx
02 push 0
04 call [XXXXXXXX]
0A add esp,8
0D mov edx, XXXXXX
12 cmp eax,[edx]
14 je 20
16 inc edx
17 cmp edx, XXXXXX + XXXXX
1D jne 12
1F int 03
20 mov [edx],ecx
22 popad
23 inc ebx
24 cmp ebx, XX
2A jne 00
2C int 03
Escribe en SoftICE: A <enter>
y codifica:
566C10 pushad
566C11 push ebx
566C12 push 0
566C14 call [009A64A6] <--la dirección real, encontramos esto cuando
566C1A add esp,8 <--remontado en la llamada
566C1D mov edx, 5B0000 <--la dirección donde nosotros copiamos nuestro .rdata
566C22 cmp eax,[edx] <--la sección en
566C24 je 566C40
566C26 inc edx
566C27 cmp edx, 5B0000 + 14C99 <--la dirección donde copiamos nuestros
566C3D jne 566C22 <--.rdata in + tamaño rdata
566C3F int 03 <--seguramente, si no encontrara ninguna equivalencia, rompe aquí.
566C40 mov [edx],ecx
566C42 popad
566C43 inc ebx
566C44 cmp ebx, 7F <--el número de api para preparar
566C4A jne 566C10
566C4C int 03
Ahora pon
EBX a 0 (R ebx 0) , pon tu EIP en la
línea 0 (línea 0 = 566C10 aquí , así R
EIP 566C10) escribe "i3here on" y
presiona F5 para correrlo. Normalmente debes
romper en 566C4C ... Ahora vuelve EBX a 0, cambia
la línea 02 (56CC12 aquí) a "push
1" y cambia la línea 24 a 'cmp ebx,
user_import_number' (2A para nosotros) y
vuelve EIP a la línea 0 (R EIP 566C10).
Córrelo de nuevo. Normalmente, todo está ok
ahora, debería romper en 566C4C de nuevo. Ahora,
podemos "dumpear" nuestra sección
rdata con seguridad:
pagein
5B0000 14C99 c:\\rdata.bin
Tenemos
simplemente que reconstruir un archivo
ejecutable. Yo probé ProcDump para importar
secciones, pero esta zorra no cambió nada (nota
de TORN@DO: prueba el nuevo ProcDump... Lucifer48
hizo algo grande), así que yo he importado mis
secciones a mano. Te mostraré como lo hice ;)
En primer lugar, haz una copia del archivo"
.icd", para nosotros: MIDTOWN.ICD, y
renómbralo con el nombre que quieras, pero con
la extensión" .EXE". P.ej. damnit.exe
Ahora, arranca HexWorkshop, abre el EXE, y abre
la 1ª sección que hemos "dumpeado"...
era: c:\text.bin
Ahora, necesitas el Raw offset de cada sección,
yo lo he apuntado en la primera parte del tut.
Los recordaré aquí, para ayudarte en la
comprensión de esta mierda :p,
para la sección ".text": Raw Offset: 600 Tamaño : 18D78F
para la sección ".Rdata": Raw Offset: 18DE00 Tamaño: 14C99
para la sección ".data": Raw Offset: 1A2C00 Tamaño: 3D8A4
para la sección ".data1": Raw Offset: 1E0600 Tamaño: 20
para la sección ".rsrc": Raw Offset: 1E0800 Tamaño: CB3
¡Ok,
conseguiste todas las mierdas aquí! Nosotros
queremos hacer la 1ª sección" .text"
así:
En HexWorkshop,
aprieta Alt + F5, introduce el Raw offset de la
sección que quieres pegar (aquí: 600),
y click en OK.
Ahora selecciona el menú edit, y click en
"Select block" introduce el tamaño de
la sección (aquí: 18D78F).
Ahora mira el otro archivo abierto
(text.bin), y aprieta ' Ctrl + A' para
seleccionar todos. Remóntate a la ventana
ejecutable principal en HexWorkshop y simplemente
pega los bytes que has copiado en el portapapeles
con ' Ctrl + V'
(o menú edit, y paste).
¡Guarda tu archivo! BIEN... simplemente has
actualizado la sección ' .text ' con nuestra
sección "dumpeada" ;)
¡OK, hago otra importación de sección contigo,
y tu harás las otras usando la misma manera!
2ª sección : Rdata!
Puedes cerrar la ventana 'text.bin', y abrir con
HexWorkshop el archivo 'rdata.bin'. Click en la
ventana principal exe, presiona 'Alt + F5',
introduce el tamaño del Raw Offset de la
sección rdata (18DE00). Click en OK,
selecciona desde el menú Edit "Select
block", introduce el tamaño de la sección
rdata (14C99). Mira la ventana de
rdata.bin, presiona 'Ctrl + A' para seleccionar
todos los bytes, y vuelve a la ventana del
ejecutable principal (damnit.exe) en
HexWorkshop. Ahora solo copiar & pegar estos
con 'Ctrl + C'.
Ok, pienso que has
entendido eso ahora. Simplemente haz el mismo con
todas las secciones y entonces guarda tu
ejecutable. Ahora puedes descargar FrogsICE,
porque los anti-SoftICE no estarán más en
nuestro exe reconstruido. Quita el cd original de
midtown madness, y corre 'damnit.exe' o
'cualquieraquequieras.exe'.
¡GUAU!, el juego funciona - muy rápidamente -
sin esa estúpida ventana, diciéndonos que
esperásemos durante la Comprobación del CD... y
voila el juego funciona muy bien =)
Pero para hacer un ejecutable perfecto, tienes
que reconstruir el PE del archivo como es
mencionado en el tutorial de Black Checks:
Si intentas ejecutarlo en otra Versión de
Windows 9x. Caerá. Sólo funcionará en Win98,
porque la sección rdata incluye la dirección de
todas las funciones de win98 (sólo puede
estar en win95 si lo crackeaste en win95).
Las direcciones que nosotros pusimos en la tabla
de importación son sólo válidas para la
versión de Windows en la que nosotros lo
crackeamos. Arreglemos eso:
- Arranca
Procdump (un trabajo muy bueno de G-ROM :)
ve a Options y selecciona:
[v] Recompute Object Size
[v] Optmize PE Structure
[X] Use actual import infos
Entonces pulsa en el botón de OK...
Ahora nosotros tenemos que reconstruir el
archivo, pulsamos el botón en Rebuild PE y
examinamos a tu archivo crackeado (damnit.exe).
¡Procdump produce para nosotros una tabla de
importación válida y nuestro ejecutable ahora
está arreglado - y perfecto!
(Así lo espero ;p) debe correr en todas las
versiones win9x...
|