Linux에서 프로그램을 실행할 때 RAM의 내용을 확인하는 방법은 무엇입니까?

Linux에서 프로그램을 실행할 때 RAM의 내용을 확인하는 방법은 무엇입니까?

프로그램이 실행되는 동안 RAM에 무엇이 저장되어 있는지 확인하고 싶습니다. 나는 이것을 사용했지만 cat /proc/[pid]/meminfo주소와 권한 모드 세부 정보만 제공합니다. 나는 또한 그것을 시도했고 pmaps -X pid데이터 외에 너무 많은 세부 정보를 제공합니다. RAM에 무엇이 로드되어 있는지 확인하는 방법은 무엇입니까?

답변1

/proc/[pid]/mem프로세스의 가상 메모리에 액세스할 수 있습니다.

이 파일의 오프셋은 가상 주소에 해당합니다. /proc/[pid]/maps실제 메모리가 지원하는 주소 범위(그리고 메모리 자체는 파일로 지원됨)를 알려줍니다.

이 모든 것이 기록되어 있습니다.공정(5)맨페이지.

프로세스는 자신과 동일한 사용자로 실행되고 gid/uid가 설정되지 않은 프로세스의 메모리에만 액세스할 수 있습니다. 예전에는 꼭 그래야만 했던 상황이었는데ptrace()/proc/[pid]/mem프로세스는 다음을 통해 메모리에 접근할 수 있습니다 .더 이상 현실이 아니다오랜 시간이 지났습니다(정확하게는 이 이후로범죄2012년 1월(v3.2+) 현재 보안 버그 수정을 목적으로 하며 lwn에서도 편집됨기사).

실제 사례

터미널 창에서:

% echo $$ # show our pid
6744
% read -sp 'secret pasword: '; echo
secret pasword:
%

그런 다음 다른 터미널 창에서:

% grep heap /proc/6744/maps
01bb7000-01c3e000 rw-p 00000000 00:00 0                                  [heap]
% dd if=/proc/6744/mem bs=1 skip=$((0x01bb7000)) count=$((0x01c3e000-0x01bb7000)) status=none |
    strings | less
...
% dd if=/proc/6744/mem bs=1 skip=$((0x01bb7000)) count=$((0x01c3e000-0x01bb7000)) status=none |
    strings | grep qwerty
qwertyuiop # here is the "secret password"

gdb사람들은 일반적 으로 이와 같은 기본 접근 방식(디버거는 프로세스에서 사용하는 구조의 형식을 알고 포인터, 목록 등을 따를 수 있음)보다는 실행 중인 프로세스의 메모리를 조사하기 위해 디버거를 사용 하지만 원칙은 다음과 같습니다. 기본적으로 동일합니다.

최신 Linux 커널은 /proc/[pid]/mem다음과 같은 인터페이스 대신 더 나은 인터페이스를 가지고 있습니다.process_vm_readv. /proc/[pid]/mem등과 마찬가지로 프로세스에 속하지 않는 메모리를 읽으려면 PTRACE_PEEK루트와 같은 권한( )이 필요합니다 .CAP_SYS_PTRACE

관련 정보