1

kernel32.dllがプロセス仮想メモリにロードされることが保証されている場合、windows.hを含めずにSleepなどの関数を呼び出せないのはなぜですか?以下はvividmachine.comからの引用です

5.では、ウィンドウについてはどうでしょうか。必要なDLL関数のアドレスを見つけるにはどうすればよいですか?これらのアドレスは、サービスパックをアップグレードするたびに変更されませんか?

シェルコードで使用する必要のある関数のアドレスを見つける方法はたくさんあります。関数のアドレス指定には2つの方法があります。実行時に目的の機能を見つけるか、ハードコードされたアドレスを使用できます。このチュートリアルでは、主にハードコードされた方法について説明します。シェルコードのアドレス空間にマップされることが保証されている唯一のDLLはkernel32.dllです。このDLLは、エクスプロイトプロセススペースにマップできる関数アドレスを取得するために必要な2つの関数であるLoadLibraryとGetProcAddressを保持します。ただし、この方法には問題があります。アドレスオフセットは、Windowsの新しいリリース(サービスパック、パッチなど)ごとに変更されます。したがって、この方法を使用する場合、シェルコードは特定のバージョンのWindowsでのみ機能します。

4

4 に答える 4

5

あなたが引用した記事は、関数のアドレスを取得することに焦点を当てています。入力引数と出力引数、レジスタ値、およびスタックを適切に処理して、関数を呼び出すためのコードを生成するために、関数の関数プロトタイプ (バージョン間で変更されない) が必要です。

windows.hヘッダーは、C/C++ コンパイラに呼び出す関数プロトタイプを提供するため、関数を呼び出すためのコード (レジスタまたはスタックを介して引数を渡し、関数の戻り値を取得する) を生成できます

を読んwindows.hで関数のプロトタイプを知った後、熟練したアセンブリ プログラマは関数を呼び出すアセンブリ コードを記述できる場合もありSleepます。関数のアドレスと合わせて、関数呼び出しを行うために必要なのはこれらだけです。

于 2011-06-04T11:38:13.677 に答える
2

いくつかの黒魔術であなたはできる;)。のカスタム実装は数多くありますがGetProcAddress、これを使用すれば不要になりますがwindows.h、これがすべてではなく、内部ウィンドウの変更が原因で問題が発生する可能性があります。もう1つの方法は、toolhlpを使用してプロセス内のモジュールを列挙し、kernel.dllのベースを取得してから、そのPEをEATに割り当て、のアドレスを取得することですGetProcAddress。そこから、アドレスを正しく呼び出すための関数ポインタプロトタイプ(および必要な構造体定義)が必要です。これはそれほど難しくはありません(多くの関数がある場合)。実際、Windows XPでは、これはDEPを無効にするために必要です。サービスパックの違い。windows.hこれを取得するための参照として必要な場合は、含める必要はありません。

于 2011-06-04T12:03:49.880 に答える
2

関数を呼び出すには関数を宣言する必要があり、kernel32.lib とリンクする必要があります。ヘッダー ファイルは魔法のようなものではなく、基本的には関数宣言がたくさんあるだけです。

于 2011-06-04T15:50:58.310 に答える