2

C# で作成された Windows フォーム プログラムがあります。これは単なるフォームと 1 つのボタンです。ここで達成したいことは、VirtualAlloc とデリゲートを使用して、ハードコーディングされたバイト配列を実行することです。このハードコードされたバイト配列は、wlar.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);
        }
}

ただし、プログラムを実行してボタンをクリックすると、次のエラー/例外が発生します。 ここに画像の説明を入力

ここで何が間違っていますか?メモリ割り当てに関係しているようです。これを修正するにはどうすればよいですか? よろしくお願いします!

4

1 に答える 1