Pregunta

¿Existe un ensamblador x86 al que puedo llamar a través de C #? Quiero poder pasar instrucciones x86 como una cadena y recuperar una matriz de bytes. Si uno no existe, ¿cómo puedo hacer el mío?

Para que quede claro: no quiero llamar el código de ensamblaje de C # - Solo quiero poder ensamblar el código de las instrucciones y obtener el código de máquina en una matriz de bytes. Inyectaré este código (que se generará sobre la marcha) para inyectarlo en otro proceso por completo.

¿Fue útil?

Solución

Como parte de algunos de los primeros prototipos que hice en un proyecto personal, escribí bastante código para hacer algo como esto. No requiere cadenas: los códigos de operación x86 son métodos en una clase X86Writer. No está documentado en absoluto, y no tiene una cobertura completa, pero si fuera de interés, estaría dispuesto a abrirla bajo la nueva licencia BSD.

ACTUALIZACIÓN: Bien, he creado ese proyecto: Managed.X86

Otros consejos

Ver este proyecto:

https://github.com/ZenLulz/MemorySharp

Este proyecto envuelve el ensamblador FASM, que se escribe en ensamblaje y se compila como un objeto coff de Microsoft, se envuelve en un proyecto de C ++ y luego se envuelve de nuevo en C #. Esto puede hacer exactamente lo que desee: dada una cadena de ensamblaje x86 / x64, esto producirá los bytes necesarios.

Si necesita lo contrario, hay un puerto del desensamblador Udis86, totalmente portado a C #, aquí:

https://github.com/spazzarama/SharpDisasm

Esto convertirá una matriz de bytes en las cadenas de instrucciones para x86 / x64

Eche un vistazo a Phoenix de Microsoft Research.

Cosmos también tiene algún soporte interesante para generar código x86:

http://www.gocosmos.org/blog/20080428.en.aspx

No directamente desde C # no puedes. Sin embargo, potencialmente podría escribir su propia clase contenedora que utiliza un ensamblador externo para compilar el código. Por lo tanto, potencialmente podría escribir el ensamblaje en un archivo, utilizar .NET Framework para activar un nuevo proceso que ejecute el programa del ensamblador, y luego usar System.IO para abrir el archivo generado por el ensamblador para extraer el byte corriente.

Sin embargo, incluso si haces todo eso, me sorprendería mucho si no te encuentras con problemas de seguridad. Inyectar código ejecutable en un proceso completamente diferente es cada vez menos posible con cada nuevo sistema operativo. Con Vista, creo que definitivamente te negarían. E incluso en XP, creo que obtendría una excepción de acceso denegado al intentar escribir en la memoria de otro proceso.

Por supuesto, eso plantea la pregunta de por qué necesitas hacer esto. Seguramente tiene que haber una mejor manera :).

Creo que sería mejor que escribieras un DLL de Win32 nativo. A continuación, puede escribir una función en el ensamblador que se exporta desde la dll. A continuación, puede utilizar C # para vincular dinámicamente a la dll.

Esto no es lo mismo que pasar una cadena y devolver una matriz de bytes. Para hacer esto, necesitarías un componente de ensamblador x86 o un envoltorio alrededor de masm.exe.

No sé si esto es así, pero puedes bloquear un compilador externo y luego cargar el objeto generado en tu matriz de bytes.

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