Ошибка при запуске байтового массива в C# с использованием VirtualAlloc и GetDelegateForFunctionPointer

У меня есть программа формы Windows, созданная на C#, которая является просто формой и единственной кнопкой. То, чего я хочу достичь, - это выполнить жестко запрограммированный байтовый массив, используя VirtualAlloc и делегат. Этот жестко закодированный байтовый массив относится к байтам установщика 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);
        }
}

Однако, когда я запускаю программу и нажимаю кнопку, у меня появляется эта ошибка / исключение:

Что я здесь не так делаю? Кажется, это связано с распределением памяти. Как это исправить? Заранее большое спасибо!

1 ответ

Код, который вы написали, предназначен для вызова функции, хранящейся в памяти.

То, что вы сохранили, это не функция, а исполняемый файл. Вам нужно найти смещение точки входа исполняемого файла. Тогда позвони.

Другие вопросы по тегам