私のプログラムは32ビットWindows上で動作するため、仮想メモリ空間のアドレスの型はDWORD
です。そして、IATでAPIのアドレスを変更してAPIをフックしたいと思います。ですから、まずターゲットプロセスのイメージのベースアドレスを取得します。次に、IMAGE_OPTIONAL_HEADER構造体の開始アドレスを取得しようとします。32ビットアドレスの型を(BYTE *)と(DWORD *)にキャストする点の違い
IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((BYTE*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24); //variable g_hCurrentProcessBase is the base address of the image of the target process
見ての通り、私はBYTE*
型にg_hCurrentProcessBase
をキャストしますが、最初は、私はこのようなDWORD*
タイプ、それをキャスト:
IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((DWORD*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24);
しかし、それは間違ったアドレスを取得し、動作しませんでしたIMAGE_OPTIONAL_HEADER
の構造を有する。 しかし、変数g_hCurrentProcessBase
の値はDWORD
(私は32ビットWindowsシステムで実行します)ですが、この変数をDWORD *
にキャストしても間違ったアドレスになります。しかし、それをBYTE*
にキャストすると、その違いは何ですか?なぜそれをDWORD *
にキャストしてもうまくいかないのですか?
DWORD*
へのポインタ演算* – WhozCraig