【问题标题】:Error in running byte array in C# using VirtualAlloc and GetDelegateForFunctionPointer使用 VirtualAlloc 和 GetDelegateForFunctionPointer 在 C# 中运行字节数组时出错
【发布时间】:2015-11-20 12:35:09
【问题描述】:

我有一个用 c# 创建的 Windows 窗体程序,它只是一个窗体和一个按钮。我想在这里实现的是执行一个硬编码的字节数组,使用 VirtualAlloc 和一个委托。此硬编码字节数组与 warr.exe 安装程序的字节有关。我只是想试试它是否有效。选择 winrar 安装程序没有特殊原因。所以在按钮点击事件中,我有这个代码:

private UInt32 MEM_COMMIT = 0x1000;
private UInt32 PAGE_EXECUTE_READWRITE = 0x40;
private UInt32 MEM_RELEASE = 0x8000;
private delegate void Runner();

[DllImport("kernel32")]
private static extern IntPtr VirtualAlloc(UInt32 lpStartAddr, UInt32 size, UInt32 flAllocationType, UInt32 flProtect);

byte[] body = new byte[1517376] { <actual bytes of the winrar installer EXE>};


private void btnExit_Click(object sender, EventArgs e)
{
        try
        {
            IntPtr buf = VirtualAlloc(0, (UInt32)body.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
            Marshal.Copy(body, 0, (IntPtr)buf, body.Length);
            Runner ptr = (Runner)Marshal.GetDelegateForFunctionPointer(buf, typeof(Runner));
            ptr();
            Application.Exit();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
}

但是,当我执行程序并单击按钮时,我遇到了这个错误/异常:

我在这里做错了什么?它似乎与内存分配有关。我该如何解决?提前非常感谢!

【问题讨论】:

  • 所以你在内存中加载代表 exe 的字节然后期望它运行?你为什么不 Process.Start 那个 exe?
  • 一个 exe 文件在字节 0 处没有入口点,即使您将适当的地址传递给 GetDelegateForFunctionPointer,仍然缺少很多东西 - 您还没有解决可执行文件的任何动态导入,并且它进行的任何 WinAPI 或内核调用都可能与“进程”没有适当的 HModule 的事实相混淆。原则上你想做的事情是可能的,但你离做到这一点还有很长的路要走,而且无论你的问题是什么,这都可能是错误的解决方案。
  • 感谢您的反馈!

标签: c# delegates virtualalloc


【解决方案1】:

您编写的代码用于调用存储在内存中的函数。

您存储的不是函数,而是可执行文件。您需要找到可执行文件入口点的偏移量。然后调用它。

【讨论】:

  • 可能还会做很多其他操作系统加载程序所做的事情,比如分配内存、修复跳转地址......
  • 我猜你的代码是某个东西的原型,你的最终目标是什么?如果是代码注入,则相反。
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2010-09-29
相关资源
最近更新 更多