CraCKeaR uN PRoGRaMa eMpaCaDo II
Para empezar, un programa empacado es un programa comprimido (siii!! como lo que hace el WinZip), pero con programas ejecutables. Existen varios empacadores como: Aspack, UPX, Crunch, PCShrink, PePack, etc
Estos programas se basan en un algoritmo de empaquetado, que afecta a casi todo el programa. Lo unico que no empaca es el encabezado con la informacion del fichero y su propia rutina de desempaque en Runtime (es decir cada vez que lo ejecutamos se desempaca), lo habitual es que los programas empacados comiencen asi:
PUSHAD <-- Guarda todos los registros
CALL [address] <-- Llamaa la rutina que desempaca el programa
POPAD <-- Devuelve todos los registros de la pila
JMP "address" <-- Salta al comienzo del programa, el cual ya esta desempacado
Si quereis meteros en el tema en profundidad coged los tutoriales de numit_or sobre encabezamientos PE, no son buenos, ni muy buenos.... son EXCELENTES!!! Mirad en la seccion de "Enlaces a tener en cuenta".
Despues de esta
pequeña introduccion empecemos con el crackeo ;-D
¿Cómo podemos saber si un programa esta empacado? Bueno la gran
mayoria de las veces, por no decir siempre, cuando un porgrama esta empacado
es imposible desensamblarlo o las intruccuiones del desensamblado son incoherentes;
otra de las caracteristicas es que no puedes cargarlo en el Loader del SICE
(aunque eso es por otras causas que ahora expicaremos); y por ultimo si entramos
en el codigo del programa a traves del SICE por un bpx
las direcciones suelen ser "raras" es decir 500100
o asi.
- Despues de haber comprobado o deducido que el programa esta empacado debemos
meternos el el ProcDump (si quereis saber como se usa entrad en la seccion pertinente
;-)) y miramos su encabezamiento PE, veremos que en la seccion de .text ó
.CODE en el apartado de Caracteristics estara
C0000040 (esto indica al SICE, aunque no solo a
él, que el programa no es ejecutable, por ello no "rulaba"
el Loader), asi que debemos cambiar C0000040
por E0000020 (el cual nos indica que es un archivo
ejecutable).
- Despues de esto entramos en el Loader del SICE y cargamos el programa y...
joe! ahora si que rula xDDDD entramos en el codigo y veremos lo que os dije
al principo de esta seccion eso de PUSHAD etc.
Bueno pues lo que nosotros debemos hacer es buscar el POPAD
que devuelva los registros y que nos lleve al codigo desempacado. Para ello
debemos tracear bastante (F10).
-TRUCO: Mas que un truco es algo de logica que
no a todos se les ocurre. Cuando traceamos tanto en el código es habitual
encontrar bucles, asi que para no tragarnoslos cuando encontreis un salto hacia
arriba haceis G address siguiente al salto, asi
nos lleva a la siguiente isntruccion y no debemos tragarnos eternos bucles ;-)
- Una vez encontrado el POPAD debemos poner S
(address del POPAD) L FFFFFF 61 (61 es el codigo en hexadecimal del POPAD)
y darle al run (F5). Si al hacer esto el programa
se carga... es que hemos encontrado la rutina adecuada!!! si no es asi a por
el siguiente POPAD :-( Despues de esto volvemos
al SICE a la direccion del POPAD y continuamos,
id tranquilos porque cerca (a unos 4 o 5 F10) encontraremos
un RET, apunta la direccion de RET!!! Si le damos
F10 de nuevo veras que nos lleva a otra parte del
codigo diferente y cuya direccion (la cual apuntaremos tambien) es algo como
4XXXXX COÑO!!! Esto es el codigo desempacado!!!!
xDDD
- Volvemos al RET ese y ponemos A (address en la
que este ese RET) y JMP EIP, [Esc]
y F5. Salimos de SICE pero... no pasa nada! Pues
si que pasa algo, con esto que acabamos de hacer hemos generado un bucle infinito
que hace que el programa se cargue en memoria, lo mejor es que lo que esta cargado
en memoria es el programa ya desempacado :-D
- Nos metemos de nuevo en el ProcDump y en la ventana inicial veras los programas
cargados en memoria, si buscamos alli estara nuestro programilla. Una vez detectado
lo selecionamos con el boton derecho y le damos a Dump(Full)
y lo guardamos con otro nombre. Despues de esto tenemos nuetro programa desempaquetado
y guardado, el cual puede ser desensamblado y petado. Observareis que el programa
que hemos guardado es el mismo programa pero que ocupa un poco mas que el otro
:-)
- En esta seccion no os dire como crackearlo, para ello ya estan las otras secciones
;-)