Академический Документы
Профессиональный Документы
Культура Документы
CracksLatinoS
Quin Soy?
The Art of Reverse Engineering
Qu es CodeCave?
Una tcnica muy usada en el GameHacking, un CodeCave, se describe literalmente a su traduccin, es hacer un hueco, tnel o cueva dentro del cdigo normal, cambiando el flujo, hacia una rutina arbitraria, de esa manera se modifica el compartimiento normal, de una aplicacin (en la demostracin).
Inicio
Qu es CodeCave?
Final
Planteando el Problema
Ya mencionamos cmo funciona el CodeCave, pero, en qu momento debemos usarlo?
Un ejemplo. Al realizar una accin en algn game, esta nos disminuye la vida, pero, podramos cambiar esa accin por otra?
Pasos Bsicos
1er Paso: Obtener la direccin indicada que modificar el flujo haca una rutina creada por nosotros. 2do Paso: Calcular el desplazamiento desde donde se har el cambio de flujo, hasta nuestra rutina. 3er Paso: Crear la rutina que comportamiento arbitrariamente. modificar el
4to Paso: Regresar al flujo, como normalmente lo hara la aplicacin, como si nada hubiera pasado.
Y Nuestro objetivo es cambiar la instruccin dec [ebx+00000454] (es la cual decrementa en 1 la vida) por add [ebx+00000454], 2 (es la cual sumar en 2 la vida).
Necesitamos encontrar el desplazamiento que hay entre la instruccin que disminuye la vida hasta nuestra rutina.
Siendo lpMemory la variable que contiene la direccin donde comienza nuestra rutina.
Calculamos el desplazamiento que hay de la direccin, 004226BCh hacia la direccin contenida en lpMemory, el desplazamiento lo tenemos en EDX.
Restamos los 5 bytes del JMP (JUMP, es el salto que va a cambiar el flujo hacia nuestra rutina) esta ocupa 5 bytes y la tenemos que restar.
Esta Rutina contiene tanto la rutina que cambia una instruccin, as como el cdigo que reserva espacio del HEAP, lo cual veremos en el siguiente cdigo:
Especificamos el flag GMEM_MOVEABLE, este deja a Windows mover el bloque de memoria, para consolidar la memoria. La bandera (flag) GMEM_ZEROINIT le dice a GlobalAlloc que rellene el nuevo bloque de memoria reservado con ceros.
Cuando GlobalAlloc vuelve satisfactoriamente, EAX contiene el manejador (handle) al bloque de memoria reservado. Le pasamos este manejador (handle) a la funcin GlobalLock que nos devuelve un puntero al bloque de memoria.
Esto lo hacemos por seguridad ya que no todas las pginas de memoria tienen permiso de lectura o escritura.
mov edx, dword ptr [lpMemory] mov eax, 004226BCh sub edx, eax sub edx, 5
Calculando el Desplazamiento
Explicado en el Paso2.
Calculando el tamao que ocupamos en la rutina arbitraria, obtendremos el desplazamiento desde el final del cdigo arbitrario, hasta la address que ejecutara normalmente el GAME.
lea eax, byte ptr [edx + 12] Ocupamos 7 bytes en la anterior instruccin, y tenemos que sumarle 5 bytes del JMP del regreso del flujo, en total 12 bytes usaremos y la direccin final de la rutina est en EAX. EAX = Direccin final de la rutina arbitraria.
Obtenemos el desplazamiento desde el final de sub ecx, eax nuestra rutina hasta la direccin 004226C2h.
mov byte ptr [edx + 7], 0E9h mov dword ptr [edx + 8], ecx
Procedimiento igual al 3er Paso
Hicimos un JMP, hacia nuestra rutina (CodeCave), ejecutamos la instruccin que modifica el comportamiento arbitrariamente, y regresamos el flujo, como si el comportamiento de la aplicacin no hubiera cambiado, as nos evitamos del crash.
Cdigo
Les pego el code, gran parte ya est explicado, los pasos son los mismos, lo nico que cambia es el 3er Paso y 4to Paso, veamos como.
mov edx, offset szCodeCave mov eax, 004226BCh sub edx, eax sub edx, 5
mov byte ptr [eax], 0E9h mov dword ptr [eax + 1], edx mov byte ptr [eax + 5], 90h
ret
AllocMemory ENDP
Calculando el Desplazamiento (2do Paso) Pisando la instruccin por un JMP haca szCodeCave (3er Paso)
Al usar nuestro propio espacio, podemos escribir la instruccin tal cual la deseamos.
Por qu pushad y popad?, Esto es por seguridad y buena costumbre ya que esto es un CodeCave y la rutina arbitraria que codeamos podra ser mucho ms larga que esta, seguramente usaremos registros que necesitan preservar su valor inicial, y seguramente esta aplicacin dara error si no hubiera preservado sus registros.
S tanto hable de registros y preservarlos, Por qu usa ESI, esto puede influir en algn error de la aplicacin?, pudiera influir si antes no somos observadores, recordemos como est conformado las instrucciones ficticias que usamos para efecto del paper.
A ESI, se mueve algn valor, as que no importa el valor de ESI en la direccin 004226BCh, porque en la siguiente instruccin va hacer modificada, as que lo usamos.
Este comentario, nos da otra idea de cmo hacer que salte hacia el flujo normal de la aplicacin, por si por alguna razn no se modifica algn registro y necesitamos otra forma de regresar. Al estilo de un CALL, un PUSH y un RET, es una tcnica muy usada y nos da una buena alternativa. Ocupa 6 bytes, un byte ms que al usar el JMP.
DEMO
DEMO
Links Interesantes
www.ricardonarvaja.info Web de Ricardo http://groups.google.com/group/crackslatinos - Crackslatinos http://indulgeoeddy.orgfree.com Web de Eddy http://www.crackmes.us/ - CrackMes
www.noxsoft.net Web de Nox
Gracias Totales!