是否可以通过.NET安装x86汇编程序?

我可以通过C#调用x86汇编程序这样的东西吗? 我希望能够将x86指令作为字符串传递并获取字节数组。 如果一个不存在,我怎么能自己做?

要清楚 – 我不想从C# 调用汇编代码 – 我只是希望能够从指令汇编代码并以字节数组获取机器代码。 我将注入此代码(将动态生成)以完全注入另一个进程。

作为我在个人项目中进行的一些早期原型设计的一部分,我写了很多代码来做这样的事情。 它不需要字符串 – x86操作码是X86Writer类上的方法。 它根本没有记录,并且几乎没有完全覆盖,但如果它有意义,我愿意在新BSD许可下开源。

更新:好的,我已经创建了该项目 – Managed.X86

看到这个项目:

https://github.com/ZenLulz/MemorySharp

这个项目包装了FASM汇编程序,它是用汇编语言编写的,编译为Microsoft coff对象,由C ++项目包装,然后再用C#包装。 这可以完全按照您的意愿执行:给定一个x86 / x64程序集的字符串,这将产生所需的字节。

如果你需要相反的,有一个Udis86反汇编程序的端口,完全移植到C#,这里:

https://github.com/spazzarama/SharpDisasm

这会将字节数组转换为x86 / x64的指令字符串

从微软研究院看一下Phoenix 。

Cosmos还对生成x86代码有一些有趣的支持:

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

不是直接来自C#你不能。 但是,您可以编写自己的包装类,该类使用外部汇编程序来编译代码。 因此,您可能会将程序集写入文件,使用.NET Framework启动执行汇编程序的新进程,然后使用System.IO打开汇编程序生成的文件以提取字节流。

但是,即使你做了所有这些,如果你没有遇到安全问题,我会非常惊讶。 对于每个新操作系统,将可执行代码注入完全不同的进程变得越来越不可能。 有了Vista,我相信你一定会被拒绝。 即使在XP中,我认为在尝试写入另一个进程的内存时,您会获得访问被拒绝的exception。

当然,这提出了为什么你需要这样做的问题。 肯定有一个更好的方式:)。

看看这个: CodeProject:在C#中使用非托管代码和程序集 。

我认为你最好写一个原生的Win32 DLL。 然后,您可以在从dll导出的汇编程序中编写函数。 然后,您可以使用C#动态链接到dll。

这与传入字符串并返回字节数组并不完全相同。 为此,您需要一个x86汇编程序组件或masm.exe周围的包装器。

我不知道它是如何工作的,但你可以只是在执行外部编译器然后加载在字节数组中生成的对象。