5

バイト配列を生成し、Windows で通常のコードのように実行することはできますか? アセンブリ コードがあるとします。

inc  ecx

これはプログラムの一部です。Nasm でコンパイルすると、上記の行が次のように変換された EXE が得られます。

00000035 41 

バイトの配列を作成し、上記のバイトで埋めて実行することは可能でしょうか?実際にインクリメントが行われますか?

超単純なインタープリター言語を作成しましたが、インタープリターなのでかなり遅いです。私はそのための実際のコンパイラを書きたくありませんが、より速くコンパイルして実行したいと考えています。

4

3 に答える 3

14

絶対。データ実行防止をサポートするプロセッサとオペレーティング システムはボークする可能性がありますが、これは簡単に回避できます。呼び出しVirtualProtectて、メモリのブロックを実行可能としてマークするだけです。VirtualAlloc実行する予定のメモリを割り当てるために使用するのが最適な場合があります。こうすることで、メモリのページ全体を実行可能コード専用にすることができます。VirtualProtect実行可能で割り当てた任意のメモリを作成するために呼び出すとGetMem、実際にはページ全体がそのようにマークされるため、誤って一部のデータを実行可能としてマークする可能性があります。そのデータが侵害された場合、実行される可能性があります。これはまさに DEP が保護することを意図しているものであるため、データと実行可能コードを別々に保護された領域に保持することをお勧めします。

テキスト コードをマシン コードに変換するタスクはコンパイルであることを覚えておいてください。したがって、実際のコンパイラを作成したくない場合は、最終的にマシン コードを生成したくない場合があります。

于 2013-05-01T12:38:29.710 に答える
7
const
   size = 32768;
type
   TFuncInt = function(param: Integer): Integer; // EAX -> EAX
   TByteArray = array[0..size-1] of Byte;
   PByteArray = ^TByteArray;
var
   arr: PByteArray;
   func_param: Integer;
   func_result: Integer;
begin
   arr := VirtualAlloc(nil, size, $3000, $40);
   if arr <> nil then begin
     arr[0] := $40;  // inc EAX
     arr[1] := $C3;  // ret
     func_param := 77;
     func_result := TFuncInt(arr)(func_param);  // 78
     VirtualFree(arr, 0, $8000);
  end;
end;
于 2013-05-01T13:30:37.773 に答える
1

データ実行防止 (DEP) を備えた最新のプロセッサはこれを許可しないと思います。このような目的で使用できるパスカル スクリプト ライブラリがいくつかあることに注意してください。

于 2013-05-01T12:36:03.370 に答える