프로세스에서 메모리를 읽는 방법은 무엇입니까? OS에 따라 다릅니 까?


11

숙련 된 웹 개발자이자 초보 "저수준"프로그래머로서,이 내용은 여전히 ​​저에게 부두입니다.

메모리 블록을 찾은 다음 읽기 (예 : 광산 게임에서 타이머 읽기)를 시작하기 시작한 방법이 궁금합니다. OS / OS 버전에 따라 다른가요?

답변:


14

이것은 다소 까다 롭고 복잡한 질문입니다. 그러나 일을 조금 단순화하려면 :

" 광산 게임에서 타이머를 읽는 "예를 고려할 때 :

첫 번째 단계는 메모리 주소찾는 것 입니다. 이것은 일반적으로 프로세스 메모리 에서 변수의 위치를 ​​찾기 위해 다양한 방법을 사용할 수있는 메모리 편집기 (디버거는 경우에 따라) 도구를 사용하여 수행됩니다 . 일반적인 방법은 대상 프로세스의 메모리 공간에서 특정 값 (예 : 타이머 값)을 찾은 다음 대상 값을 변경 (예 : 타이머 진행)하고 다시 일치하는 항목을 찾는 것입니다. 이 프로세스는 정확한 변수 만 남을 때까지 매 반복마다 후보를 고정합니다. 프로세스의 메모리 공간 내에서 해당 변수의 주소를 가져 오는 것은 메모리 편집기를 사용한 마우스 클릭의 문제입니다.

두 번째 단계는 특정 주소의 데이터수정하는 것 입니다. 이 작업을 수행하는 방법은 운영 체제에 따라 다릅니다. 함께 윈도우 라는 WinAPI를 호출 거기 WriteProcessMemory대상 프로세스의 메모리 공간 내에서 주어진 주소로 쓰기 미리 정의 된 데이터를 사용할 수 있습니다. 이 예제에서는이 함수를 사용하여 대상 프로세스의 타이머 변수를 원하는 값으로 덮어 쓰고 게임에서 타이머를 효과적으로 변경합니다.

실제로 대상 프로세스의 프로세스 ID 를 찾은 다음 불량 프로세스 를 대상 프로세스에 연결하여 메모리 공간을 수정할 수 있어야합니다. 이것은 매우 사소한 작업이지만 질문에 대답하는 데 도움이되지 않으므로 독자에게 연습으로 남겨 두었습니다. ;)


프로세스가 실행될 때마다 변수의 위치가 동일합니까?
brunoqc

1
@brunoqc 아니오, 거의 확실하지 않습니다.
Dan

2

OS마다 완전히 다릅니다. 어떤 것은 당신이 그것을 전혀 할 수 없으며, 당신이 원하는 데이터가 대상의 메모리 공간에 어디에 있는지 알 수있는 수단이 있어야합니다.

Linux에서 수행하는 방법은 다음과 같습니다. /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux


어떤 OS가 허용하지 않습니까? 적어도 리눅스와 윈도우에서 할 수있는 것 같습니다
Eva

@Evan 모든 운영 체제 디버깅 목적으로 원격 프로세스 메모리 수정 허용해야합니다 (보안상의 이유로 제한됨). 그러나 예를 들어 보안상의 이유로 권한이 일치하지 않으면 권한이 더 높은 프로세스의 프로세스 메모리를 읽거나 쓸 수 없게 될 수 있습니다. 이에 대한 좋은 예는 게스트 사용자 권한이있는 프로세스가 관리자 권한이있는 프로세스의 메모리를 읽고 쓸 수 없도록하는 것입니다. 시스템 전체가 손상 될 수 있고 게스트 사용자가 관리자 권한을 얻을 수있는 직접적인 방법 일 수 있습니다. 시스템.
zxcdw

1

응용 프로그램은 OS에 의해 다양한 메모리를 제공받습니다. 일반적으로 응용 프로그램은 메모리를 요청해야하지만 언어로 인해 해당 기능이 프로그래머에게 가려 질 수 있습니다.

C와 같은 언어는 특정 크기에 대한 블록 요청을 허용하지만 C ++, C # 및 Java와 같은 다른 언어는와 같은 키워드를 사용하여 요청을 허용합니다 new. 각 언어에는 메모리를 할당하는 여러 가지 방법이 있으므로 간단한 개요 일뿐입니다. OS로 메모리를 다시 릴리스하는 것은 명시 적으로 또는 가비지 콜렉터를 통해 수행 될 수 있습니다.

응용 프로그램 내에서 메모리에 액세스하는 방법은 메모리 할당 방법에 따라 다릅니다. C와 C ++는 포인터 개념을 사용하여 메모리가있는 위치를 표시 / 추적하는 것으로 가장 잘 알려져 있습니다. 그렇지 않으면, 메모리 액세스는 작성된 클래스 또는 변수를 통해 처리됩니다.

대부분의 경우 프로그램 내의 특정 메모리 액세스에 대해 걱정할 필요가 없습니다. 언어 구성과 OS는 사용자에 대한 우려를 효과적으로 모호하게합니다.

게임에서 타이머의 예는 기본 메모리 할당에 대해 걱정할 필요가없는 훌륭한 예입니다. 타이머를 나타내는 변수가 있으며 변수에서 읽습니다.

내 대답은 응용 프로그램을 작성할 때 관련이 있지만 zxcdw의 대답은 다른 응용 프로그램에 속하는 메모리에 액세스하는 것과 관련이 있습니다. 귀하의 LMGTFY 용어는 해당 주제를 더 깊이 파고 들기위한 "디버깅"및 "역 엔지니어링"입니다.

추가 자료 :

  • 컴퓨터 메모리 에 관한 Wikipedia 기사 는 사물에 대한 적절한 개요를 제공합니다.
  • 그런 다음 메모리 매핑 된 I / O 에 대한 Wikipedia 기사를 살펴보고 진행중인 가공에 대해 더 깊이 이해하십시오.
  • 마지막으로, 가상 메모리 에 관한 기사를보고 각 OS가 다른 시스템과 약간 다르게 메모리 매핑을 처리하는 방법에 대한 더 나은 대답을 얻으십시오.

훌륭한 대답입니다. 그렇지만이 경우에는 필자가 작성하지 않은 응용 프로그램에서 메모리를 읽는 데 더 관심이 있습니다. 15 명의 담당자가있는 즉시 투표합니다.)
Eva

@Evan-가상 메모리에 대한 기사를 읽으십시오. 그러면 계속되는 매핑을 더 잘 이해할 수 있습니다. 앱을 분리하려면 매핑을 이해해야합니다. 대부분의 디버거를 사용하면 실행중인 프로세스에 연결하여 응용 프로그램의 지침과 메모리를 볼 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.