0

という名前空間にいくつかの関数がありますstub。名前空間の正確な開始アドレスと終了アドレス、少なくともメモリ内の名前空間のサイズを決定する必要があります (これらの関数を別のプロセスにコピーするため)。これはVisual C++ 2008で完全に機能しましたが、

void stub_end() { }

名前空間の最後で使用

size_t size = reinterpret_cast<ULONG_PTR>(stub_end) - reinterpret_cast<ULONG_PTR>(stub_start);

スタブのサイズを決定します。

これは、Visual C++ が関数の順序を .cpp ファイルと同じように保持していたため機能しましたが、Visual C++ 2010 ではそうではないようです。

プラグマ ディレクティブ、コンパイラ/リンカー機能などを使用して、関数または名前空間/スタブ全体のサイズを確認するにはどうすればよいですか?

4

3 に答える 3

1

最近のセキュリティの新しい推進 (ヒープのランダム化、レイアウトのランダム化など) により、これははるかに困難になると思います。各関数を個別にコピーするだけで済む場合があります。

于 2009-12-23T15:20:51.997 に答える
0

VC++ に相当する GCC の属性((section ("name"))) http://www.delorie.com/gnu/docs/gcc/gcc_62.htmlを使用して、各関数を異なるセクションに配置してから、または、各関数を別のソース ファイルに配置することもできます。

于 2009-12-23T16:07:25.193 に答える
0

C++ 言語では、名前空間のアドレスまたはサイズを検出する保証はありません。そうは言っても、アセンブリ言語とリンカー命令に挑戦してください。

多くのアセンブリ言語には、特定のアドレスにコードを配置するためのオペコードまたはニーモニックがあります。これにより、メモリ領域の開始を示すラベルを設定できます。一部のリンカーには、セグメントの開始アドレスとサイズを取得するための変数があります。これらは、ユーザー定義の論理アドレスになります。

要約すると、アセンブリ ツールとリンカー ツールを使用して、名前空間の開始と長さ、またはオプションでセグメントの終了のパブリック シンボルを定義します。C++ プログラムでは、これらのラベルに としてアクセスしますextern

于 2009-12-23T18:08:39.520 に答える