2

アセンブリ言語を(メモリ内で)機械語にコンパイルするコンパイラがあります。私のプロジェクトは C# .net にあります。スレッドでメモリを実行する方法はありますか? DEP はどのようにそれを防ぐことができますか?

byte[] a:  
01010101 10111010 00111010 10101011 ...
4

4 に答える 4

8

重要なのは、バッファが実行可能としてマークされるように、VirtualAlloc で割り当てられたメモリ ブロックに実行可能コードを配置することです。

IntPtr pExecutableBuffer = VirtualAlloc(
  IntPtr.Zero,
  new IntPtr(byteCount),
  AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
  MemoryProtection.PAGE_EXECUTE_READWRITE);

(その後、VirtualFree を使用して後片付けを行います)。

これにより、DEP チェックがトリガーされないように、メモリを実行可能コードとしてマークする必要があることが Windows に通知されます。

于 2009-10-11T21:08:02.757 に答える
3

サポートされている方法があるとは思えません。詳しくは調べていませんが、以下のような推測があります。

最も簡単な方法は、プロセスとして起動することです。 *.com ファイルに書き込み、その実行可能ファイルを実行するように O/S に指示します。

または、メモリをパラメーターとしてCreateThread関数に渡します (ただし、コードが正しい呼び出し規則を持ち、指定されたパラメーターを期待し、レジスターを保持し、実行可能なメモリ内にあることについて心配する必要があります)。

もう 1 つの可能性は、既に実行されることがわかっているメモリにオペコードを書き込むことです (たとえば、最近ロードされた DLL の既存のコードを上書きします)。

于 2009-10-11T18:36:15.323 に答える
3

バイトをコードとして実行することが可能です:

C# のインライン x86 ASM

コードを使用する必要がありunsafeます。

これは単なる楽しい事実であり、実際には役に立たないと思いましたが、おそらくあなたのアプリケーションは実際にこれを使用しています:)

于 2009-10-11T18:58:20.067 に答える
1

コントロール パネルからアプリケーションをホワイトリストに登録できます http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors.html

プログラムでホワイトリストに登録できるとは思えませんが、管理者アクセスなしでは確かに不可能です。これは、このセキュリティ機能の目的を無効にします.

于 2009-10-11T18:38:49.470 に答える