특정 메모리 주소의 값을 변경하는 방법은 무엇입니까?

Nov 19 2020

저는 C 프로그래밍을 처음 사용합니다. 사용 사례가 있습니다. 특정 메모리 주소의 값을 변경해야합니다.

int main(){

    int *p;
    p = 0x111;
    *p = 100;
    return 0; 
}

그러나 위의 코드를 컴파일 할 수 없습니다. 다음과 같은 문제를 보여줍니다.

test.c:10:7: warning: incompatible integer to pointer conversion assigning to 'int *' from 'int' [-Wint-conversion]
    p = 0x111;
      ^ ~~~~~
1 warning generated.

다음과 같이 캐스팅을 시도했습니다.

int main(){

    int *p;
    p = (int *) 0x111;
    *p = 100;
    return 0; 
}

컴파일 할 수 있지만 실행하면 segmentation fault.

내 질문:

  1. 이 코드를 강제로 컴파일하고 실행할 수있는 방법이 있습니까? 와일드 포인터 문제가 있다는 것을 알고 있습니다. 그러나 메모리를 조작하는 일반적인 사용 사례입니다. 예를 들어, 로컬 게임을 할 때. 어떻게 든 게임이 실행 중일 때 플레이어의 체력 포인트에 대한 특정 메모리 주소를 알고 있습니다 (예 : 주소 = 0x123). 0x123의 값을 변경하는 방법은 무엇입니까?

  2. 위의 방법을 사용하여 특정 메모리 주소의 값을 조작 할 수없는 경우 사용 사례를 실현하는 다른 표준 방법이 있습니까?

추신 : 그건 그렇고, 내 사용 사례를 실현하는 예제 방법을 찾았습니다.

소스 코드를 참조 할 수 있습니다. https://github.com/haseeb-heaven/GTLibc/

게임 트레이너는 동적 메모리의 주소를 어떻게 변경합니까?

https://www.youtube.com/watch?v=cRCnN987gd8&ab_channel=HaseebMir

답변

2 eerorika Nov 19 2020 at 15:04

메모리 주소의 개체에 대한 유효한 포인터가 주어지면 포인터를 통해 간접적으로 값을 할당합니다.

int health_points = 1337;  // an object in some memory address
int* ptr = &a;             // pointer to the value in that memory address
*ptr = 0;                  // the value is modified

이 코드를 강제로 컴파일하고 실행할 수있는 방법이 있습니까?

프로그램의 형식이 잘못되었습니다. 컴파일러가 관련 언어 확장을 제공하는 경우 컴파일러가 성공적으로 컴파일하도록하는 방법이있을 수 있지만 일반적으로 해당 컴파일러를 사용하게되므로 이러한 확장에 의존하는 것은 좋지 않습니다.

컴파일러가 손상된 프로그램을 받아들이도록하는 대신 프로그램을 수정하는 것이 좋습니다.

특정 메모리 주소의 값을 변경하는 방법은 무엇입니까?

첫째, 해당 주소의 메모리를 할당해야합니다. 언어 구현은 모든 메모리 할당을 처리하며 할당되는 주소를 지정하는 표준 방법은 없습니다.

그러나 일부 언어 구현에서는 액세스 가능한 특정 주소를 지정할 수 있습니다. 이것은 임베디드 시스템에서 일반적입니다. 이 경우 캐스트를 사용하여 정수 값을 포인터로 변환 할 수 있습니다.

std::uintptr_t address = 0x111; // see documentation whether this is a valid address
int* ptr = reinterpret_cast<int*>(address);

언어 구현에서 주소에 액세스 할 수 있도록 지정하지 않으면 액세스에 대한 보장이 없습니다. 가상 메모리를 관리하는 최신 운영 체제에서 가장 좋은 시나리오는 segfault입니다.

HaseeBMir Dec 06 2020 at 23:23

응용 프로그램이 다른 응용 프로그램 또는 자신의 주소를 읽는 방법을 이해하도록하겠습니다.

  1. 자기 주소.

읽고있는 주소는 실행 가능 이미지0x0040000 용 기본 주소 위에 있으므로 다음과 같이 표시되어야합니다. + where is the offset from base address. .text (읽기 전용) 이외의 영역에 접근하는 경우 먼저 VirtualProtect 방식을 사용하여 영역의 권한을 변경해야합니다 .0x00400000x00400x0040

  1. 외부 애플리케이션 주소.

외부 응용 프로그램에서 주소를 읽고 싶다면 먼저 응용 프로그램에 대한 식별자이자 식별자 인 응용 프로그램 핸들 을 얻은 다음 여기에 표시된대로 ReadProcessMemory 를 사용해야합니다. 여기에 표시된대로 WriteProcessMemory 를 사용하여 작성할 수도 있습니다.

.text권한 영역을 변경하지 않고 섹션 이외의 섹션에 액세스하지 않도록 항상 확인하십시오 . 그렇지 않으면 프로그램이 충돌 할 수 있습니다.