2016-09-29 10 views
0

私のプログラムは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 *にキャストしてもうまくいかないのですか?

+0

DWORD*へのポインタ演算* – WhozCraig

答えて

3

ポインター算術は、それが指す値のタイプによって異なります。

ポインタをDWORDにキャストすると、実際には24が加算され、24*sizeof(DWORD)がアドレスに追加されます。

​​にキャストすると、それだけでアドレス(​​が1バイトである)

ノートに24を追加します。あなた本当には(ここではない場合)DWORDようにポインタを望んでいた場合:

24バイトをスキップする場合は、DWORD*ポインタに24/sizeof(DWORD)を追加してください。 DWORDのサイズは4ですので、2または8であっても動作します。

BYTE*キャストを使用してポインタを計算し、その後、キャスト*

関連する問題