답변:
이것은 다소 까다 롭고 복잡한 질문입니다. 그러나 일을 조금 단순화하려면 :
" 광산 게임에서 타이머를 읽는 "예를 고려할 때 :
첫 번째 단계는 메모리 주소 를 찾는 것 입니다. 이것은 일반적으로 프로세스 메모리 에서 변수의 위치를 찾기 위해 다양한 방법을 사용할 수있는 메모리 편집기 (디버거는 경우에 따라) 도구를 사용하여 수행됩니다 . 일반적인 방법은 대상 프로세스의 메모리 공간에서 특정 값 (예 : 타이머 값)을 찾은 다음 대상 값을 변경 (예 : 타이머 진행)하고 다시 일치하는 항목을 찾는 것입니다. 이 프로세스는 정확한 변수 만 남을 때까지 매 반복마다 후보를 고정합니다. 프로세스의 메모리 공간 내에서 해당 변수의 주소를 가져 오는 것은 메모리 편집기를 사용한 마우스 클릭의 문제입니다.
두 번째 단계는 특정 주소의 데이터 를 수정하는 것 입니다. 이 작업을 수행하는 방법은 운영 체제에 따라 다릅니다. 함께 윈도우 라는 WinAPI를 호출 거기 WriteProcessMemory
대상 프로세스의 메모리 공간 내에서 주어진 주소로 쓰기 미리 정의 된 데이터를 사용할 수 있습니다. 이 예제에서는이 함수를 사용하여 대상 프로세스의 타이머 변수를 원하는 값으로 덮어 쓰고 게임에서 타이머를 효과적으로 변경합니다.
실제로 대상 프로세스의 프로세스 ID 를 찾은 다음 불량 프로세스 를 대상 프로세스에 연결하여 메모리 공간을 수정할 수 있어야합니다. 이것은 매우 사소한 작업이지만 질문에 대답하는 데 도움이되지 않으므로 독자에게 연습으로 남겨 두었습니다. ;)
OS마다 완전히 다릅니다. 어떤 것은 당신이 그것을 전혀 할 수 없으며, 당신이 원하는 데이터가 대상의 메모리 공간에 어디에 있는지 알 수있는 수단이 있어야합니다.
Linux에서 수행하는 방법은 다음과 같습니다. /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux
응용 프로그램은 OS에 의해 다양한 메모리를 제공받습니다. 일반적으로 응용 프로그램은 메모리를 요청해야하지만 언어로 인해 해당 기능이 프로그래머에게 가려 질 수 있습니다.
C와 같은 언어는 특정 크기에 대한 블록 요청을 허용하지만 C ++, C # 및 Java와 같은 다른 언어는와 같은 키워드를 사용하여 요청을 허용합니다 new
. 각 언어에는 메모리를 할당하는 여러 가지 방법이 있으므로 간단한 개요 일뿐입니다. OS로 메모리를 다시 릴리스하는 것은 명시 적으로 또는 가비지 콜렉터를 통해 수행 될 수 있습니다.
응용 프로그램 내에서 메모리에 액세스하는 방법은 메모리 할당 방법에 따라 다릅니다. C와 C ++는 포인터 개념을 사용하여 메모리가있는 위치를 표시 / 추적하는 것으로 가장 잘 알려져 있습니다. 그렇지 않으면, 메모리 액세스는 작성된 클래스 또는 변수를 통해 처리됩니다.
대부분의 경우 프로그램 내의 특정 메모리 액세스에 대해 걱정할 필요가 없습니다. 언어 구성과 OS는 사용자에 대한 우려를 효과적으로 모호하게합니다.
게임에서 타이머의 예는 기본 메모리 할당에 대해 걱정할 필요가없는 훌륭한 예입니다. 타이머를 나타내는 변수가 있으며 변수에서 읽습니다.
내 대답은 응용 프로그램을 작성할 때 관련이 있지만 zxcdw의 대답은 다른 응용 프로그램에 속하는 메모리에 액세스하는 것과 관련이 있습니다. 귀하의 LMGTFY 용어는 해당 주제를 더 깊이 파고 들기위한 "디버깅"및 "역 엔지니어링"입니다.
추가 자료 :