9

これが私が意味することの例です...

  • ユーザーが LOADER.EXE プログラムを実行する
  • LOADER.EXE は別の EXE をダウンロードしますが、ディスクに保存せずにすべてメモリに保持します。
  • ダウンロードした EXE をディスクから実行した場合と同じように実行しますが、メモリから直接実行します

このようなアプリケーションはいくつか見たことがありますが、例やその仕組みの説明を見たことはありません。

誰か知っていますか?

別の例として、暗号化された EXE を別の EXE に埋め込む場合があります。実行される前にディスクに保存されることなく、メモリ内で抽出および復号化されます。

著作権侵害を防ぐために一部のアプリケーションで使用されているものを見てきました。

編集:補足として、UPX のようなプログラムはこのように動作しますか? コードを見ましたが、解読するのが難しく、主に好奇心から尋ねています。必要はありません。

4

2 に答える 2

4

これを行う多くのプログラムは、%TEMP% に解凍するだけですが (私はそうしていることを知っています)、大物は基本的に OS 実行可能ローダーを再実装します。

  • 実行可能ファイルをメモリにマップします。これは思ったほど単純ではありません。.exe には複数の「セクション」が含まれており、これらのセクションはページ配置でロードする必要があり (それらは 4K の倍数のアドレスで開始する必要があります)、それぞれに特定の要求 (読み取り専用、コピーオン) があるためです。書き込み、ゼロ初期化など....
  • 通常は LoadLibrary() と GetProcAddress() を使用して、インポート テーブル セクションを更新することにより、静的インポートを満たします。
  • dll の場合 (実際にはほとんど同じですが、重要な違いはインポートだけでなくエクスポートもあるということです)、ロードするためにコンパイルされたメモリ アドレスが既に使用されている場合、ローダーは dll をリベースする必要がある場合もあります。 (これは非常に一般的です)。ただし、exe には通常、更新が必要なロード済みコード内の場所をリストする再配置セクションが含まれていないため、これは不可能です。通常、それらはプロセスに最初にロードされるため、ブロックすることはできません。何かによって。これは、ロードされた exe をブロックしない独自の exe 用に、ローダーが異常なロード アドレスを持つ必要があることを意味します。

要約すると、これは大変な作業です。VirtualAlloc()興味がある場合は、.exe ファイルと .dll ファイル、および関数について説明している PE 形式の仕様を参照してください。

于 2010-06-09T11:11:50.093 に答える
2

実行可能ファイルのエントリ ポイントへのオフセットがどこにあり、どのパラメータが必要かがわかっている場合は、関数ポインタを使用してアドレス "exeBase + entryPointOffset" で関数を呼び出すだけです。

少なくとも x86 システムの OS では、データとしてマークされたメモリを実行できない傾向があることに注意してください。たとえば、Windows では、「Virtual ProtectEx」機能を使用してメモリを実行可能としてマークすることで、これを変更できます。

実際、古き良き時代には、これはメモリを節約するための一般的なシステムでした。必要に応じてコードをスワップインおよびスワップアウトすることでメモリを節約できるように、 「オーバーレイ」が必要です。

于 2010-06-09T10:46:31.947 に答える