2013-10-04 3 views
1

시간을 제공하는 solitaire에서 주소의 값을 변경하려고합니다.역 참조 주소의 내용을 조작하기위한 포인터

아래 코드가 주어지면 baseaddress + offset 0x97074는 오프셋 0x50을 가진 다른 주소를 가리켜 야하며 마지막으로이 주소는 시간 값을 변경하기 위해 오프셋 x0C가있는 최종 주소를 가리켜 야합니다.

그러나이 작업을 수행 할 때 solitaire가 충돌합니다.

HMODULE hModule = GetModuleHandle(nullptr); 
sstream << std::hex << reinterpret_cast<unsigned int>(hModule); 
str = sstream.str(); 
BaseAddress = reinterpret_cast<DWORD>(str.c_str()); 

//MessageBox(NULL, (LPCSTR) BaseAddress, "Adress", MB_OK); just some reminder 
*(*(*(*(DWORD *) BaseAddress + (DWORD *) BASE_OFS_DEF) + (DWORD *)TIME_OFS1_DEF) + (DWORD *)TIME_OFS2_DEF) = 500; 
+0

"baseaddress + 오프셋 0x97074는 다른 주소를 가리켜 야합니다"- 누가 말합니까? –

+0

내가 아는 한 CE에서 본 주소는 다른 주소를 가리키며 마지막으로이 주소는 시간 주소를 가리 킵니다. 틀 렸으면 고쳐줘. – user23842348943292

+0

나는 당신이 틀렸는 지 아닌지에 대한 생각의 그림자가 없었을 것이다. 이 정보는 어디서 얻었습니까? CE는 무엇입니까? –

답변

1

논리가 잘못되었습니다. 오프셋을 추가하고 포인터에 오프셋을 캐스팅하기 전에 포인터를 역 참조하는 것입니다! 나는 이것이 당신이

*(DWORD*)(*(DWORD*)(*(DWORD*)(BaseAddress + BASE_OFS_DEF) + TIME_OFS1_DEF) + TIME_OFS2_DEF) = 500; 

를 원하는 것입니다 생각 하지만 당신은 정말 예를 들어, 무슨 일이 일어나고 있는지 이해하는 데 도움이 조금 그것을 파괴한다

DWORD temp1 = *(DWORD*)(BaseAddress + BASE_OFS_DEF); 
DWORD temp2 = *(DWORD*)(temp1 + TIME_OFS1_DEF); 
*(DWORD*)(temp2 + TIME_OFS2_DEF) = 500; 
+0

답장을 보내 주셔서 감사합니다하지만 솔리테어가 계속 충돌하고 왜 내 BaseAddress가 "0x"없이 "1F4"만 반환하는지 궁금 해서요,이 영향이 있습니까? 이 주소로 참조 해제하기 전에 0x를 추가해야합니까? – user23842348943292

+0

@Mostey 아니, 문제가 아니에요, 0x는 C + + 코드에서 16 진 정수 리터럴을 작성하기위한 단지 관례입니다. 프로그램이 실행 중일 때 어떤 것을 의미하는 것이 아닙니다. 나가 보여준 무언가를 무너 뜨리는 것을 시도하고, 어느 선이에 충돌하는지보십시오. BTW 나는 당신이하려고하는 것이 옳은지 아닌지 전혀 모른다. 방금 설명에 맞는 코드를 만들려고했습니다. – john

+0

@Mostey '단순화 된'코드가 도청되었다는 것을 깨달았습니다. 나는 희망을 가지고 그것을 수정하기 위해 편집했습니다. – john