gpt4 book ai didi

c# - 使用 VirtualAlloc 和 GetDelegateForFunctionPointer 在 C# 中运行字节数组时出错

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:37 27 4
gpt4 key购买 nike

我有一个用 C# 创建的 Windows 窗体程序,它只是一个窗体和一个按钮。我想在这里实现的是使用 VirtualAlloc 和委托(delegate)执行硬编码的字节数组。此硬编码字节数组与 wrar.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);
}
}

但是,当我执行程序并单击按钮时,出现此错误/异常: enter image description here

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

最佳答案

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

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

关于c# - 使用 VirtualAlloc 和 GetDelegateForFunctionPointer 在 C# 中运行字节数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32227157/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com