문제

프로세스에서 일부 데이터를 읽었습니다(주소:0x58F03C) WINAPI 함수를 사용하여 ReadProcessMemory:

DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
int value=0;

while (1)
{
    ReadProcessMemory(hProcess, (LPVOID)0x58F03C, &value, sizeof(value), 0);
    cout << "val: " << value << endl;
}

프로세스를 다시 시작할 때마다 주소가 변경되므로 항상 동일한 주소를 얻을 수 있는 방법이 있는지 궁금합니다.그렇게 할 수 있는 "트레이너 프로그램"이 많이 있기 때문에 하나가 있어야 합니다.읽거나 쓸 올바른 주소 값을 어떻게 얻습니까?

현재 나는 CheatEngine 변경된 값에 대해 다음 스캔을 수행합니다.

감사해요.

도움이 되었습니까?

해결책

동적 메모리 할당이 발생했습니다.CheatEngine 세계에서는 이를 '포인터'라고 합니다.

일부 데이터(예: uint32_t/DWORD) 내부 메모리는 malloc'디.데이터 주소를 찾으면 다음에 프로세스를 시작할 때 주소가 동일하다는 보장은 없습니다.그 이유는 에서 반환된 메모리 때문입니다. malloc 메모리의 다른 지점을 기반으로 할 수 있습니다.

동적 메모리 할당을 방지하는 데 사용되는 트릭은 관심 있는 값의 주소로 연결될 수 있는 정적 힙 주소를 찾는 것입니다.CheatEngine 튜토리얼에서는 이 작업이 수행되는 방법을 보여줍니다.다중 레벨 포인터에도 동일하게 적용됩니다.더 높은 수준에서 이는 동적으로 할당된 다른 메모리에 대한 포인터를 보유하는 동적으로 할당된 메모리 등에 해당합니다.

포인터를 얻기 위해 CheatEngine에서 사용되는 방법은 대략 다음과 같이 작동합니다.

  • 관심 있는 데이터 값의 주소에 액세스 하드웨어 중단점을 설정합니다.
  • 코드가 액세스하면 하드웨어 중단점이 코드의 모양을 보여줍니다.

코드는 일반적으로 다음과 같습니다.

mov eax, 0x1234ABCD 
dec dword ptr ds:[eax+0x85]

이는 적에게 맞을 때 HP를 감소시키는 일부 코드에 해당할 수 있습니다.이 경우 0x1234ABCD는 포인터이고 0x85는 오프셋입니다.C 코드에서는 다음과 같은 일이 발생했을 수 있습니다.

struct some_struct* blah = malloc(...);
...
blah->HP--;

0x1234ABCD는 다음의 주소입니다. blah.HP 값은 다음이 가리키는 블록 내부 어딘가에 있습니다. blah.메모리 블록의 오프셋은 0x85입니다.그런 다음 트레이너를 작성하는 경우 다음을 읽어야 합니다. DWORD (QWORD 64비트인 경우) 0x1234ABCD에서 값에 0x85를 추가합니다.그러면 HP 값의 주소가 제공됩니다.

다른 팁

주소가 미리 할당된 변수가 있는 데이터 섹션의 실행 파일 부분에 있는 경우 작동합니다(힙 및 스택에는 적합하지 않음).

다음을 살펴보세요. MSDN의 "프로세스에 대한 모든 모듈 열거" 예제.

그것은 사용한다 열거형 프로세스 모듈() 모듈 핸들을 얻으려면.이는 이미지 기본 주소입니다.

실행 파일의 이미지 기본 주소를 얻고 이를 통해 주소를 조정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top