Pregunta

Bien, digamos que mi aplicación está emitiendo (x86) instrucciones en la memoria, haciendo que la página sea ejecutable, etc. ¿Hay alguna forma de alterar el código auxiliar de un método sin JIT para apuntar a mi flujo de instrucciones emitido?

Por ejemplo:

Supongamos que he creado una secuencia de instrucciones x86 en la memoria, que hace algo arbitrario. Ahora, además, supongamos que tengo un método 'int Target ()'. No lo he llamado todavía, así que no ha sido compilado. ¿Hay alguna manera de:

  1. Obtener el puntero al talón del objetivo
  2. Haz que apunte a mi flujo de instrucciones emitidas.

Me doy cuenta de que prácticamente todas las características de seguridad de .Net están diseñadas para evitar secuestros como este. Pero, ¿es posible a través de, digamos, la API de alojamiento?

¿Fue útil?

Solución

¡sí, puedes hacerlo!

Enganche el método getJit de mscorjit. Y se le preguntará cada vez que cualquier método requiera Jitting. puedes pasar lo que quieras. Algunos protectores .net funcionan así.

Otros consejos

Esto es posible a través de la API de perfiles. Nunca lo he usado, pero se usa para un propósito similar en TypeMock.

Editar: creo que hubo una buena publicación en los blogs de MSDN, la buscaré.

Edit 2: Doh, primer golpe !

Como usted dice, esto no es fácil y puede que ni siquiera sea posible. Si recuerdo correctamente, el código incluirá la dirección del compilador JIT para un método que no se ha compilado. Entonces, cuando intentes llamar a este método, el compilador JIT hará su trabajo e insertará la dirección en el método recién compilado. Si puede cambiar esta dirección, puede insertar una llamada a su propio código. Cómo harías esto sin ser detectado está más allá de mí. Ciertamente espero que el CLR detecte este tipo de manipulación.

No creo que la API de creación de perfiles lo ayude en este caso (como lo sugiere Leppie), ya que no está intentando modificar MSIL. Si piensa lo contrario, este artículo puede ser útil ya que describe qué debe hacer para implementar lo que TypeMock está haciendo.

Además de poder usar ICorProfiler y volver a escribir su método antes de que se adapte, puede usar ICorDebug (MDBG ha gestionado la interfaz). Establezca un punto de interrupción, cuando llegue al punto de interrupción, establezca la siguiente instrucción en su código de interceptación. Todo este proceso se puede hacer desde el código, pero es realmente intrusivo y necesitará un "observador". Proceso para coordinar esto.

Otra cosa que vale la pena mirar es el proyecto PostSharp que le brinda los métodos de entrada y salida si aplica atributos .

No trataría de meterme directamente con la memoria y no estoy seguro de que sea posible, sino que puedes usar la API del generador de perfiles; hay algunos ejemplos, pero no hay documentación real. Eche un vistazo al artículo de la revista MSDN: Reescriba el código de MSIL sobre la marcha con .NET API de perfilado de marcos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top