Ошибка при запуске байтового массива в 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 ответ
Код, который вы написали, предназначен для вызова функции, хранящейся в памяти.
То, что вы сохранили, это не функция, а исполняемый файл. Вам нужно найти смещение точки входа исполняемого файла. Тогда позвони.