2012-07-05 4 views
-3

프로그램 충돌없이 메모리 주소에서 값을 가져 오려고합니다. 여기 메모리 주소에서 값을 가져 오는 방법은 무엇입니까?

내 코드입니다 : 그것은 * PTR를 호출하여 충돌,

int main(){ 
    int *ptr=(int*)0x09D37570; 
    while(1){ 
     system("cls"); 
     cout<<(*ptr); 
    } 
    return 0; 
} 

하지만이 프로그램을 충돌, 왜 그런 일이 무엇입니까? 문제없이 가치를 얻으려면 어떻게해야합니까?

+6

처음에는 기억력이 있어야합니다. – chris

+1

왜 그런 일이 발생합니까? 메모리 주소가 전혀 매핑되지 않았기 때문에 발생합니다. 너 어디서 났니? 유효한 주소인지 어떻게 알 수 있습니까? 너 뭐하려고? –

+0

치트 엔진에서 얻었습니다. 실제 메모리 주소입니다. –

답변

3

모든 프로세스에는 고유 한 메모리 공간이 있으며, 서로 다른 프로세스의 동일한 주소가 서로 다른 실제 주소를 매핑하므로 그렇게 할 수 없습니다.

5

하드 코드 된 주소를 가져 와서 본 값을 보유 할 것으로 예상됩니다. 그러나, 거기에 몇 가지 문제가 있습니다 :

자신의 프로세스에 대해 걱정하는 경우, 그 메모리를 소유해야합니다. 당신이 new 또는 그와 비슷한 것으로 할당 한 것이 그 주소를 납치 한 것이 더 낫습니다. 그렇지 않으면 어떤 일이 일어날 지 아무 말도 없습니다. 예를 들면 다음과 같습니다.

int *someAddress = new int (5); 
int *somePtr = someAddress; //point to same address as newed 
int someInt = *somePtr; //someInt is 5 
++somePtr; //uh-oh, now we've left what we newed; it might not be allocated 
someInt = *somePtr; //there's no telling if that memory was ok to use 

작동하는 경우 임의의 숫자가 나타납니다. 실제로 길게 반복하면 결국 충돌합니다. 그러나 문제가 되더라도 여기에는 직접 관련이 없습니다.

가장 큰 문제는 주소가 같더라도 동일한 메모리가 아닙니다. 이것은 혼란 스러울 지 모르지만 꽤 좋은 주제입니다 (http://en.wikipedia.org/wiki/Virtual_address_space). 기본적으로 각 프로세스는 동일한 주소 값을 갖지만 실제 메모리의 다른 영역에 매핑됩니다. 따라서 하드 코딩 된 주소는 프로세스에만 적용됩니다.

Windows에서 다른 프로세스의 메모리를 살펴볼 수있는 한 가지 방법은 ReadProcessMemory을 사용하는 것입니다. 이 페이지에서 읽고있는 프로세스에 대해 PROCESS_VM_READ 권한을 갖는 것과 같은 요구 사항을 확인할 수 있습니다. 실패 할 경우 GetLastError도 확인하십시오. 작은 예제 here이 다소 있습니다.

VirtualQueryExReadProcessMemory을 호출하기 전에 살펴 보는 것이 좋습니다.

그것은 효과가있을 수도 있지만 그렇지 않을 수도 있습니다.하지만 다른 프로세스의 메모리 공간을 파고 들기에 가장 잘 알고 있습니다. 당신이 이것을 성취하려고한다면 그것은 가치가있는 일입니다.

관련 문제