c# - una - no se puede cargar el archivo o ensamblado restsharp
¿Es posible el ensamblador x86 a través de.NET? (8)
No directamente de C # no puedes. Sin embargo, podría escribir potencialmente su propia clase contenedora que utiliza un ensamblador externo para compilar código. Por lo tanto, es posible que escriba el ensamblaje en un archivo, utilice .NET Framework para hacer un nuevo proceso que ejecute el programa ensamblador y luego use System.IO para abrir el archivo generado por el ensamblador para extraer el byte. corriente.
Sin embargo, incluso si hace todo eso, me sorprendería mucho si no se encuentra 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án. 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é necesita hacer esto. Seguramente tiene que haber una mejor manera :).
¿Hay algo así como un ensamblador x86 que pueda 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 al código de ensamblaje desde C #, solo quiero ser capaz de 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 por completo en otro proceso.
Eche un vistazo a esto: CodeProject: usar código no administrado y ensamblado en C # .
Creo que sería mejor que escribieras un archivo DLL Win32 nativo. A continuación, puede escribir una función en el ensamblador que se exporta desde el dll. Luego puede usar C # para vincular dinámicamente al dll.
Esto no es lo mismo que pasar una cadena y devolver una matriz de bytes. Para hacer esto necesitaría un componente ensamblador x86 o un contenedor alrededor de masm.exe.
Como parte de algunos prototipos iniciales que hice en un proyecto personal, escribí bastante código para hacer algo como esto. No necesita cadenas - los códigos de operación x86 son métodos en una clase X86Writer. No está documentado en absoluto, y no tiene cobertura completa, pero si fuera de interés, estaría dispuesto a abrirlo con la nueva licencia BSD.
ACTUALIZACIÓN: Ok, he creado ese proyecto - Managed.X86
Cosmos también tiene un soporte interesante para generar código x86:
No sé si así es como funciona, pero podrías simplemente archivar un compilador externo y luego cargar el objeto generado en tu matriz de bytes.
Eche un vistazo a Phoenix de Microsoft Research.
Ver este proyecto:
https://github.com/ZenLulz/MemorySharp
Este proyecto envuelve el ensamblador FASM, que está escrito en ensamblaje y compilado como objeto coff de Microsoft, envuelto por un proyecto C ++ y luego nuevamente envuelto en C #. Esto puede hacer exactamente lo que usted quiere: 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