Está en la página 1de 15

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

PingPlotterPro 3.20.1p OLLYDBG PE EDITOR REGISTRARNOS PARCHEANDO ASPROTECT

Solid

Hola amigos, Feliz navidad para todos !! me propuse escribir este tutorial, impulsado por mi amigo HIEI, que tiene en puerta unos excelentes tutoriales sobre inline patching al Armadillo, y quien me estuvo enseando algunos trucos, asi que para hacerle mas facil la tarea, decidi colaborar y hacer uno sobre ASProtect, asi no se le hace tan pesado el trabajo. Tambien agradecer a Ricardo Narvaja que siempre esta dispuesto a dar una mano, y como no a SubZero del cual he leido un excelente tutorial sobre api hooking. Encararemos este metodo de inline patching en este caso en un ASProtect, pero tengan en cuenta que sirve para cualquier packer, armadillo, execryptor, themida, etc etc. Es una alternativa para cuando no podemos desempacar o no queremos parchear desde una dll. Antes que nada debemos averiguar el lugar a parchear para quedar registrados, lo cual no voy a entrar en detalle ya que la esencia de este tutorial no es la de crackear el programa, asi que directamente voy a decir que el lugar a parchear es este:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

El problema es que esa variable esta en una zona de memoria, en una seccion creada por ASProtect en tiempo de descompresion, y varia en cada ejecucin, esta version crea muchas secciones de 1000h bytes y la variable se encuentra ah en una de ellas, con lo cual se hace difcil identificarla de un modo generico, asi que debemos parchear directamente en esta zona, y lo haremos colocando un gancho en 63B462, ensamblaremos ah un salto a nuestro injerto una vez que se haya escrito esa zona pero que aun no se haya ejecutado. Otro punto que debemos tener en cuenta es evitar el chequeo CRC de asprotect, ya que si nos pezca un byte cambiado, nos tirara afuera sin mas, este punto lo estuve buscando pero finalmente me aburri al no conseguir nada, asi que empleare otro metodo sugerido por Ricardo, que es sencillo y consiste en colocar un bp en CreateFileA y apuntar en el dump al archivo original para que lea este y no el que hemos parcheado. Todo el injerto lo haremos en una nueva seccion que crearemos, pero vamos de a poco. Primero que nada ejecutamos el programa a ver sus limitaciones:

Ah vemos que arranca junto con una nag que nos pide registrarnos, veamos el ABOUT:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Si cambiamos el valor de la variable en memoria, vemos que sucede, lo primero que vemos es que arranca sin la nag, y si vemos el menu HELP, ha desaparecido la opcion de registrarse:

Si damos al boton about, vemos:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Lo unico poco estetico que queda, es el nombre del usuario pero el resto, si comparamos con el about del original, esta mucho mejor. De todos modos, debemos concentrarnos en el InlinePatching ahora, en lugar de preocuparnos por la cara del soft. Empecemos entonces, abrimos STUD PE (el que quiera puede hacerlo con otro programa como el topo o el que sea), cargamos la copia vamos a la solapa de las secciones hacemos click derecho, NEW SECTION:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Le colocamos el nombre que querramos, y colocamos su tamao, tildando la casilla: FILL WITH NULLz. Bueno por ultimo cambiamos las caracteristicas a E0000020 para tener permiso de lectura, escritura y ejecucin (RWE). Terminado este primer paso, vamos a ejecutar el archivo modificado, veamos como asprotect nos detecta por medio del CRC:

Veamos la forma mas sencilla de engaar a ASProtect, antes que nada lo que hare sera renombrar el archivo original, le cambiare la extensin .exe por .bak (esto lo hago porque si hacemos un parche con un parcheador, nos creara un backup del original con dicha extensin), ahora abro el exe en olly y coloco un bp en CreateFileA, doy RUN y se detiene aqu:

Vemos que es llamado de una seccion de ASProtect (01F20000), marquemos ESP+4 que apunta al nombre del archivo, le hacemos FOLLOW IN DUMP, y cambiamos su nombre por el archivo .bak:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Ah le cambie el nombre, ahora quito el bp de CreateFileA y doy RUN:

Vemos que arranca lo mas bien, asi que ya sabemos como evitar el CRC (no es la mejor forma, pero funciona) Podemos seguir adelante entonces, vamos a cambiar el EP del programa para que arranque en nuestra seccion, podemos hacerlo con OLLY o cualquier editor PE:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Y de esta forma tenemos preparado ya el ejecutable para hacer el injerto. Con su nueva seccion de 1000h bytes Abramoslo en olly y comencemos con nueestro injerto. Antes que nada quiero aclarar que seguramente habra maneras mejores de hacer el injerto, o mas ordenadas, pero lo importante es la idea, despus cada uno que lo adapte a sus costumbres.

Ah tenemos nuestro nuevo EP, para que funcione en todas las maquinas debemos tener cuidad con algunas cosas, por ejemplo los saltos, convenientemente es mejor hacer push direccion, ret o bien guardar las direcciones en el dump y hacer saltos indirectos. En este caso lo hare de la primera forma, pero en el Armadillo lo hice con saltos indirectos y funciono perfectamente. Otra cosa a tener en cuenta son los CALL a las apis que vamos a HOOKEAR, no podremos hacer calls directos ya que no funcionara en todas las pc. Empecemos entonces, antes que nada, hacemos CTRL+N a ver las apis que tenemos en el ejecutable en este momento:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Esas 2 son fundamentales, ya que no serviran para averiguar la direccion de CreateFileA y VirtualProtect (que usaremos para cambiar el permiso de escritura de la dll para poder poner los ganchos) Y aqu tenemos el puntero a la string kernel32.dll

Tomamos nota entonces de estos datos: 7B7BF8 = Puntero GetModuleHandleA 7B7BF4 = Puntero a GetProcaddress 7B7C08 = Puntero a la string kernel32.dll Nos quedaria agregar en el dump en nuestra seccion, los nombres de VirutalProtect y CreatefileA, podemos hacerlo por ejemplo aqu:

823500 = Puntero a la string; CreateFileA

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007
823514 = Puntero a la string: VirtualProtect y por ultimo, agregar tambien el el dump en nuestra seccion, la ruta del archivo sin parchear que forzaremos a leer a ASProtect:

8230A6 = Puntero al path y nombre del archivo a leer Con esto ya podemos comenzar, vamos a resumir un poco lo que haremos. 1- Obtener las direcciones de CreateFileA y VirtualProtect 2- Dar permiso de escritura a CreateFileA y GetModuleHandleA 3- Poner ganchos en CreateFileA y GetModuleHandleA (este ultimo para llegar al momento en que la zona a parchear ya este desencriptada en la seccion del codigo) 4- Poner un gancho en la zona a parchear 5- Restaurar a las apis sus instrucciones originales. Como dije antes, como es la 2da vez que lo hago, puede ser que el injerto quede un poco desprolijo, pero lo importante es la idea, y con la practica se ira perfeccionando el mismo. Veamos el injerto por partes, la primera es esta:

1- preservo el estado de los registros 2 y 3- obtengo la base del kernel 4 guardo en mi seccion, (823500) la base del kernel 5-6 y 7 obtengo la direccion de la api CreateFileA 8 guardo la direccion de CreateFileA en mi seccion (82352c)

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

1-2-3-4: Obtengo la direccion de VirtualProtect 5 La guardo en mi seccion (823528)

En esta parte lo unico que hago es darle permiso de escritura a CreateFileA.

Y esta es muy importante, ya que lo que hace es poner el gancho en CreateFileA para que al pasar por ah, salte a nuestro injerto, veamoslo con un ejemplo: API ORIGINAL: API LUEGO DE TRACEAR EL INJERTO:

Como ven, el injerto lo que hizo fue ensamblar un PUSH direccion y un RET que no es mas que un salto hacia nuestra seccion del injerto. Es decir que cuando el programa pase por esa api, antes que nada ira al lugar que nosotros le dijimos y luego el injerto hara sus cosas para luego devolverle el control al programa.

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007
Bueno esta parte tambien es sencilla, solo le damos permiso de escritura a GetModuleHandleA tal cual lo hicimos con CreateFileA

Y aqu terminamos con la primera parte, lo que hacemos es colocar el gancho en GetModuleHandleA cambiando las instrucciones originales por el salto a nuestro injerto, veamos como en el caso anterior la diferencia entre la api sin y con gancho: API ORIGINAL: API CON GANCHO:

Ademas en estas 2 lineas: 00823097 83C0 01 ADD EAX,1 MOV DWORD PTR DS:[8230E6],EAX

0082309A A3 E6308200

Tome la precaucion de guardar la direccion de retorno donde debera volver al terminar el injerto su trabajo, ya que debe regresar a la api. Y antes de esto, ejecutar las instrucciones que hemos roto al colocar los respectivos ganchos. Y por ultimo restaurar los registros con POPAD y saltamos al EP original del programa (ASProtect] 401000 Bien ya tenemos solucionada la primer parte del injerto, hemos colocado los ganchos correspondientes y nos falta completar la 2da parte, con lo que querramos hacer al pasar por cada una de esas 2 apis, y ademas deberemos quitar los ganchos tambien en esta segunda parte para dejar las apis en su forma original. Para ver la 2da parte, necesitamos ir a las direcciones adonde saltaran los ganchos de CreateFileA y GetModuleHandleA 823AA1 y 823BBB respectivamente Veamos que hacen en cada lugar:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

explico esta parte, la primer linea se fija si el parametro de ESP+4 es 0 ya que en ese punto es cuando la zona a parchear ya esta desencriptada, en caso contrario aun no lo esta, por lo tanto continua la ejecucin en 823BC2, ejecutando las 4 primeras lineas originales de la api que hemos roto al poner el gancho, y luego salta a la direccion de retorno que habiamos guardado anteriormente 8230E6, cuando el parametro de ESP+4 sea 0 ira a ejecutar las lineas de 823BED:

Como aqu ya va a hacer su trabajo y no necesitamos mas el gancho y lo vamos a quitar, en la primer linea lo que hacemos es dejar apuntando la direccion de retorno a la api que habiamos guardado, al inicio de la API, para luego inmediatamente en las lineas 2 a 9 restaurar los bytes originales de la api, y luego en las 2 lineas siguientes coloco un gancho en la direccion a parchear, para finalmente saltar al inicio de la API y que el programa siga su curso. Veamos las diferencias aqu tambien: ORIGINAL:

Luego del gancho:

Veamos que hace al pasar por el gancho del codigo en 823C44

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

La primer linea continua su ejecucin normalmente, y luego mueve el 1 a la variable, para finalmente ejecutar la linea siguiente original, y devolverle el control al programa

Aqu en la primer linea cambio el nombre del archivo que quiero que ASProtect lea para que no me pezque el chequeo CRC, si recuerdan lo habiamos guardado en 8230A6. en las lineas 2-3-4 y 5 ejecuto las lineas de la api que rompi con el gancho, las lineas 6-7 y 8 restauran los bytes originales a CreateFileA, y luego saltamos a la parte de la api que deberiamos continuar. Pues eso es todo, ahora puedo dar RUN y veo como el programa arranca registrado y sin chistar:

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

Sin nag y sin mensajes de error. Espero que se haya entendido algo, al menos cual es la idea, cualquier duda o comentario no duden en escribirme. solidreverser@gmail.com http://crackslatinos.hispadominio.net/Solid

NOMBRE: ASPROTECT 2XX INLINE PATCHING POR MEDIO DE API HOOK Fecha: 25-12-2007

También podría gustarte