1

나는 치트 엔진 (Cheat Engine)으로 알려진 메모리 편집 응용 프로그램을 사용하고 있습니다. 나는 치트 엔진을 게임에 붙인다. 내 게임에는 HP로 알려진 32 비트 정수가 있습니다. HP는 메모리 주소 A에 저장됩니다. 게임을 다시 시작하면 HP는 새 메모리 주소 B에 저장됩니다. 치트 엔진을 사용하면 포인터 스캔을 수행하여 다음을 가리키는 정적 메모리 주소 C를 찾을 수 있습니다. 또 다른 메모리 주소와 이에 수반되는 오프셋 D 및 오프셋을 사용하므로 [D + offset]은 항상 해당 세션 동안 HP의 메모리 주소를 저장합니다. 따라서 [D + offset]을 역 참조하면 항상 HP를 저장하는 메모리 주소를 얻게됩니다. > A 또는 B포인터에 대한 오프셋의 이점은 무엇입니까?

C - -> D

가 어떤 이점

D가 + 오프셋> HP -

A 또는 B : 여기

은 도면 오프셋을 사용합니까? 왜 C가 A 또는 B를 직접 가리킬 수 없습니까? 오프셋을 사용하면 C 언어로 배열을 처리 할 때 유용하다는 것을 잘 알고 있습니다. 포인터에 대한 오프셋을 볼 때마다 포인터가 배열의 첫 번째 요소를 가리키고 오프셋이 배열의 요소 중 하나를 참조한다는 의미입니까?

+0

이 수준의 대답은 코드가 실행될 칩 (또는 가상 컴퓨터)의 아키텍처 및 명령 집합의 영향을 크게받습니다. 일부 명령어 세트는 오프셋 색인화를 위해 빠른 주소 지정 모드를 제공함으로써 그러한 종류의 것을 권장합니다. – dmckee

답변

2

C 프로그래밍 언어를 알고 있다면 쉽게 이해하고 이해해야합니다. C로 작성한 것은 프로그램을 컴파일 할 때 생성되는 실제 기계 코드와 매우 비슷합니다.

C에서 객체의 추상화는 종종 "구조체"로 수행됩니다. 멋진 무엇

struct Player *myPlayer = malloc(sizeof(struct Player)); 

: 당신은 당신이 이런 일을 할 수있는이 같은 개체를 만들려면

struct Player { 
    int id; 
    float xposition; 
    float yposition; 
    int health; 
    int maxhealth; 
}; 

: 당신의 예에서

은 매우 간단한 "플레이어"구조체를 상상 고 언어로 된 구조화 된 것은 사실 컴파일 된 프로그램의 메모리 블록 일뿐입니다.

예를 들어 "건강"에 액세스하려면 C에서 myPlayer->health;을 수행하십시오. 그러나 이제는 아름다운 이름에 대해 알지 못하고 메모리 블록이있는 컴파일 된 프로그램에서 어떻게 보입니까?

기본 포인터에서 오프셋을 사용해야합니다. 당신이에서 말할 수 없다, 당신이 경우

move myHealth, read4bytes[myPlayer + 12] 

이 progam를 리버스 엔지니어링 : 위의 예에서 다음과 같이 보일 것입니다 일부 의사 기계 코드에 액세스 (Windows 운영 체제 및 기본 구성 제정신 컴파일러를 가정) 메모리 블록이 구조체, 배열 또는 어쩌면 클래스 (C++ 코드) 또는 완전히 다른 것이 든간에 오프셋 액세스.

+0

완벽하게 설명합니다. 굉장한 대답. :) – user2312080