19

有没有可以通过 C# 调用的 x86 汇编器之类的东西?我希望能够将 x86 指令作为字符串传递并返回一个字节数组。如果一个不存在,我如何制作自己的?

明确一点——我不想从 C#调用汇编代码——我只想能够从指令中汇编代码并在字节数组中获取机器代码。

我将注入此代码(将即时生成)以完全注入另一个进程。

4

8 回答 8

15

作为我在个人项目中所做的一些早期原型设计的一部分,我编写了相当多的代码来做这样的事情。它不需要字符串——x86 操作码是 X86Writer 类上的方法。它根本没有记录,也远没有完全覆盖,但如果有兴趣,我愿意在新 BSD 许可下开源它。

更新: 好的,我已经创建了那个项目——Managed.X86

于 2008-09-26T08:28:46.897 回答
4

看到这个项目:

https://github.com/ZenLulz/MemorySharp

该项目包装了 FASM 汇编器,它是用汇编语言编写的,并作为 Microsoft coff 对象编译,由 C++ 项目包装,然后再次用 C# 包装。这可以完全满足您的要求:给定一串 x86/x64 程序集,这将产生所需的字节。

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

https://github.com/spazzarama/SharpDisasm

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

于 2016-10-31T03:45:50.213 回答
2

看看微软研究院的Phoenix

于 2008-11-16T03:26:18.020 回答
1

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

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

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

于 2008-09-26T03:44:10.747 回答
1

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

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

于 2008-09-30T07:20:52.337 回答
0

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

于 2008-09-26T03:12:46.283 回答
0

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

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

于 2008-09-29T01:31:04.323 回答
0

我不知道这是否是它的工作原理,但您可以只执行一个外部编译器,然后加载在您的字节数组中生成的对象。

于 2008-09-30T04:42:24.027 回答