アセンブリ言語を(メモリ内で)機械語にコンパイルするコンパイラがあります。私のプロジェクトは C# .net にあります。スレッドでメモリを実行する方法はありますか? DEP はどのようにそれを防ぐことができますか?
byte[] a:
01010101 10111010 00111010 10101011 ...
アセンブリ言語を(メモリ内で)機械語にコンパイルするコンパイラがあります。私のプロジェクトは C# .net にあります。スレッドでメモリを実行する方法はありますか? DEP はどのようにそれを防ぐことができますか?
byte[] a:
01010101 10111010 00111010 10101011 ...
重要なのは、バッファが実行可能としてマークされるように、VirtualAlloc で割り当てられたメモリ ブロックに実行可能コードを配置することです。
IntPtr pExecutableBuffer = VirtualAlloc(
IntPtr.Zero,
new IntPtr(byteCount),
AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
MemoryProtection.PAGE_EXECUTE_READWRITE);
(その後、VirtualFree を使用して後片付けを行います)。
これにより、DEP チェックがトリガーされないように、メモリを実行可能コードとしてマークする必要があることが Windows に通知されます。
サポートされている方法があるとは思えません。詳しくは調べていませんが、以下のような推測があります。
最も簡単な方法は、プロセスとして起動することです。 *.com ファイルに書き込み、その実行可能ファイルを実行するように O/S に指示します。
または、メモリをパラメーターとしてCreateThread
関数に渡します (ただし、コードが正しい呼び出し規則を持ち、指定されたパラメーターを期待し、レジスターを保持し、実行可能なメモリ内にあることについて心配する必要があります)。
もう 1 つの可能性は、既に実行されることがわかっているメモリにオペコードを書き込むことです (たとえば、最近ロードされた DLL の既存のコードを上書きします)。
バイトをコードとして実行することが可能です:
コードを使用する必要がありunsafe
ます。
これは単なる楽しい事実であり、実際には役に立たないと思いましたが、おそらくあなたのアプリケーションは実際にこれを使用しています:)
コントロール パネルからアプリケーションをホワイトリストに登録できます http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors.html
プログラムでホワイトリストに登録できるとは思えませんが、管理者アクセスなしでは確かに不可能です。これは、このセキュリティ機能の目的を無効にします.