2016-09-29 2 views
0

내 프로그램은 32 비트 Windows에서 실행되므로 가상 메모리 공간의 주소 유형은 DWORD입니다. 그리고 IAT에서 API 주소를 변경하여 API를 연결하려고합니다. 그래서, 먼저 대상 프로세스의 이미지의 기본 주소를 얻습니다. 그런 다음 IMAGE_OPTIONAL_HEADER 구조체의 시작 주소를 가져 오려고합니다. 잘못된 주소를 받고,32 비트 주소 유형을 (BYTE *)와 (DWORD *) 캐스팅의 차이점

IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((DWORD*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24); 

그러나 그것은 작동하지 않았다 : 보시다시피

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_HEADER 구조를 갖는다. 하지만 변수 g_hCurrentProcessBase의 값은 DWORD이어야합니다 (32 비트 Windows 시스템에서 실행 함).이 변수를 DWORD *으로 캐스팅하면 작동하지 않아 잘못된 주소가 표시됩니다. 하지만 BYTE*으로 전송하면 효과가없는 이유는 무엇입니까? DWORD *으로 전송하면 작동하지 않습니다.

+0

DWORD*에 * 포인터 연산 * – WhozCraig

답변

3

포인터 연산은 포인터가 가리키는 값의 유형에 따라 다릅니다.

포인터를 DWORD으로 캐스팅하면 실제로 24를 추가하면 주소에 24*sizeof(DWORD)이 추가됩니다.

BYTE에 캐스팅, 그냥 주소로 (24)를 추가

주 (BYTE는 1 바이트입니다) : 당신이 정말로 (여기가 아닌 경우)를 DWORD로 포인터를 원하는 경우

24 바이트를 건너 뛰려면 DWORD* 포인터에 24/sizeof(DWORD)을 추가하기 만하면됩니다. DWORD 크기가 4이므로 원하는대로 작동합니다 (2 또는 8이더라도 작동).

또는 BYTE* 캐스트를 사용하여 포인터를 계산하고, 다음 캐스트

관련 문제