【问题标题】:Create method from byte array [duplicate]从字节数组创建方法[重复]
【发布时间】:2014-08-26 02:44:23
【问题描述】:

我有一个byte[],其中包含表示汇编中方法的字节。例如一个简单的mov eax,1 - retn 函数:

var method = new byte[] { 0xB8,0x01,0x00,0x00,0x00,0xC3 };

是否可以在运行时创建一个我可以在 C# 中使用字节数组调用的方法来创建它?

【问题讨论】:

  • 您可以 pInvoke VirtualAlloc 分配一个指向您的字节数组的指针,然后使用 Marshal.Copy 将它从 VirtualAlloc 复制到分配内存。然后使用 Marshal.GetDelegateForFunctionPointer 获取 asm 代码的委托。然后您可以调用委托。 stackoverflow.com/questions/959087/…
  • 您不需要将 ASM 转换为 IL。 .Net 是一种托管语言,但一旦它是一个正在运行的进程,它与本机进程之间的唯一区别就是它加载了 .net 框架。 .Net JIT 在运行时将 IL 编译为 X86,一旦完成,所有 x86 都在处理器上运行,而不是作为 IL 运行。这意味着在运行时,您可以在一个字节数组中运行一个委托到 asm 就好了。实际上,您可以将 .Net 框架注入本机进程,然后使用 .Net C++ CLR 标头将 .Net dll 加载到其中。
  • @Ryios,通过使用 Marshal.GetDelegateForFunctionPointer?
  • 我贴的链接有一个例子,stackoverflow.com/questions/959087/…
  • 虽然有一些问题。如果您的 asm 接受参数,您将不得不使用不同的委托签名,直到找到一个映射正确且有效的签名。在极少数情况下,这可能是不可能的,您需要调整您的 asm 才能玩得更好。例如。如果你的 asm 返回一个 ascii 字符串,你需要使用一个字节数组作为返回值。如果您的方法采用 8 字节整数,则使用 ulong 作为参数,等等。如果它返回一个结构,您需要在 c# 中编写该结构并使用 LayoutKind 和 Pack 属性来使其大小匹配。

标签: c# assembly


【解决方案1】:

是的,您可以使用Reflection Emit 来完成。但是你应该编写逻辑来逐字节读取这个字节数组并将你需要的操作码Emmit到ILGenerator中。

这真的很简单。首先创建新的 DynamicMethod,从中调用 GetILGenerator,从 GetILGenerator 执行一系列“Emmit”调用,从 DynamicMethod 调用 CreateDelegate,最后通过调用此委托来调用新方法本身。

【讨论】:

  • 你能给我一些关于如何做到这一点的示例代码吗?我必须将 asm 代码更改为 IL 代码,对吗?我不知道如何做到这一点,你能提供更多信息吗?在这种情况下,我想要执行的功能比简单的return true; 复杂得多。
  • 首先你能描述一下这个字节数组是什么吗?为什么要将一些逻辑存储为字节数组?这个字节流是目前真的没有任何规范,还是像 x86 应用程序中的字节一样复杂?
  • 我正在开发一款游戏,其中一个加密函数以字节数组的形式从服务器发送到客户端。这是其中之一:pastebin.com/UjiZtMuS
  • Leandro Battochio,它看起来像是来自某些反汇编程序的 x86 汇编语言。如果您想在 .NET 上运行它 - 您必须将此代码重写为 IL 汇编语言(只需使用任何 .NET 语言编写应用程序,然后使用 ILDasm 将其反汇编)。如果不是...那么您必须编写一些本机应用程序/库(例如使用 C++),它可以将此字节加载到自己的内存并调用代码。 .Net Framework 无法执行 x86 机器码,只能执行 IL。
  • 您不必将 asm 转换为 ISL,请在您的答案下查看我的 cmets。之前已经回答过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2015-11-19
  • 2013-09-23
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多