2010-07-28 8 views
9

"Considere un x86 de Windows típica o arquitectura AMD64, la memoria es dividida en secciones ejecutables que no se puede escribir desde y secciones de datos que se puede escribir a pero no puede ser ejecutado (piensan DEP)."¿Cómo se inyecta el código compilado JIT en la memoria y se ejecuta?

"JIT compila métodos en memoria, hace (en general) no guarde nada a disco, en cambio se mueve a su alrededor, donde el siguiente puntero de instrucción puede alcanzar ella, cambia el actual puntero de instrucción (señalando el JIT) al punto al código recién generado y luego lo ejecuta. "

Estos dos párrafos, aunque un poco simplificados, son básicamente lo que entiendo del modelo de memoria de JIT y Windows. También sé que cuando trato de copiar algún código ejecutable en la memoria a mano y trato de ejecutarlo, generalmente no podré hacerlo (a menos que tenga una inyección DLL).

¿Cómo superaron este obstáculo los diseñadores JIT? ¿Utilizan un controlador ring-0 o todo está hecho en modo de usuario?

Respuesta

9

Simplemente se hace con la función de API Windows VirtualProtect(). Cambia los atributos de página de la memoria virtual. Desde PAGE_READWRITE, el compilador JIT puede escribir el código de la máquina en PAGE_EXECUTE_READ para que pueda ejecutarse. No se requieren privilegios especiales para hacerlo, ya que la página es propiedad del proceso que también ejecuta el compilador JIT.

+0

Realmente, * que * simple? Tiene sentido. (OT) Ah, recuerdo, la última vez que necesité inyectar algo no estaba en mi propio proceso (es decir, para eliminar el ejecutable en ejecución actual, primero debes descargar el ejecutable, problema típico de huevo/gallina). – Abel

+0

@Hans: leyendo más al respecto, me pregunto cómo se relaciona esto con esta [Publicación de Social MSDN] (http://social.msdn.microsoft.com/Forums/en-US/clr/thread/2a043d8c-3ac4-4b3d- 9837-0bfe8e7d6788), explicando que necesita derechos de administrador para usar 'VirtualProtect' para cambiar el indicador y alegar que no puede funcionar de esa manera. Con ActionScript, el mismo principio funciona con 'VirtualAlloc', [como aparentemente lo muestra este bloguero] (http://null.co.in/2010/04/29/spraying-just-in-time/) (obtiene el nombres incorrectos, ver el subíndice de su tercera imagen). Ambas publicaciones me permiten suponer que sería 'VirtualAlloc' en su lugar. ¿Cuáles son tus pensamientos aquí? – Abel

+0

@Abel: parece familiar. No, anoté en esa publicación que los derechos de administrador no eran necesarios. El OP estuvo de acuerdo. –

Cuestiones relacionadas