我可以通过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

的指令字符串

查看Microsoft Research的 Phoenix

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

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

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

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

当然,这引发了为什么你需要这样做的问题。当然,必须有一个更好的方法:)。

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

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

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

scroll top