本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

_penter,_pexitによるフック有効化について

一部では割と有名なこの機能について実際に触ってみました。VisualStudioのリンカーオプションで、/Gh,/GH で有効にできます。このフラグをONにすると、全関数のIN/OUTで _penter, _pexit という関数がそれぞれコールするようになります。

そしてこの関数については以下のプロトタイプ宣言を持ちます。

void __declspec(naked) __cdecl _penter( void );
void __declspec(naked) __cdecl _pexit( void );

見慣れない修飾(naked)がついていますが、これはこの関数では関数のプロローグ・エピローグを作成しない、という意味です。

この機能を使うといろいろとできることが増えるのですが、32bitのプログラミングが主流の頃はこの関数で即インラインアセンブラを書いて、目的の操作を行っていました。しかしながらこの naked 指定は 64bit のプログラミングにおいては有効ではないとのことです。

参考元: /Gh (_penter フック関数の有効化)

また、知っての通り 64bit のプログラミングにおいて、インラインアセンブラは禁止となったため、従来のコードの構成をそのまま持って行くというのはできなくなりました。
よって、_penter, _pexit の実装もまた32bit/64bitで変更を受けるポイントとなるかと思います。当然64bitでは呼び出し規約が変わったためそこを考慮して、asmファイルを作成し、このasmから _penter, _pexit の関数を公開しておく、という形で実装することになりそうです。

プログラミング
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました