コメントのスペースが足りませんでした。Joe_Muc は正しいです。malloc
またはによって取得されたメモリにコードを詰め込むべきではありませんnew
。Windows が割り当てるページのページ プロパティを変更すると、問題が発生します。
VirtualAlloc() と関連する WIn32 API を使用するのは簡単なので、これは問題ではありません: VirtualAlloc( ) を呼び出してflProtect
、[PAGE_EXECUTE_READWRITE][2]
おそらく、1 つのガード ページ、コードに必要なページ、そして別のガード ページの 3 つの割り当てを行う必要があることに注意してください。これにより、悪いコードから少し保護されます。
また、構造化された例外処理を使用して、生成されたコードへの呼び出しをラップします。
次に、Windows X86 ABI (呼び出し規約) は十分に文書化されていません (私は知っています、私は見ました)。ここにいくつかの情報があります ここ、ここ、ここ 物事がどのように機能するかを確認する最良の方法は、コンパイラによって生成されたコードを見ることです。これは、スイッチを使用して簡単に行うことができます (\FA
スイッチは 4 つあります)。
64 ビットの呼び出し規約については、こちらを参照してください。
また、Microsoft の Macro Assembler MASM は、ここから入手できます。MASM でマシン コードを記述し、その出力を確認してから、マシン コード ジェネレーターで同様のことを行うことをお勧めします。
IntelおよびAMD のプロセッサ マニュアルは参考になります。お持ちでない場合は入手してください。