내 프로그램은 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 *
으로 전송하면 작동하지 않습니다.
DWORD*
에 * 포인터 연산 * – WhozCraig