사용자 모드 프로그램이 커널 메모리와 다른 프로세스의 메모리에 액세스할 수 있습니까?

사용자 모드 프로그램이 커널 메모리와 다른 프로세스의 메모리에 액세스할 수 있습니까?

나는 많은 튜토리얼에서 사용자 모드 프로그램이 커널 메모리와 다른 프로세스의 메모리에 접근할 수 없다는 것을 읽었습니다.

하지만 이것이 항상 사실일까요?

예: 커널이 커널 메모리나 다른 프로세스의 메모리를 프로세스의 가상 주소 공간에 매핑할 수 없나요?

답변1

커널 주소는 파일을 읽어 읽을 수 있습니다 /dev/mem.

루트여야 하며 Linux 커널을 컴파일해야 합니다 CONFIG_STRICT_DEVMEM=n(많은 배포판에서는 CONFIG_STRICT_DEVMEM기본적으로 보안을 활성화합니다).

제가 작성한 GitHub 프로젝트를 시도해 볼 수 있습니다.협회

답변2

내가 사용하는 적어도 하나의 프로그램은 커널 공간을 최대한 활용합니다(netsniff-ng). Netsniff-ng는 프레임 캡처를 위한 제로 복사 메커니즘입니다. 커널 공간을 사용자 공간에 매핑하여 이를 활용합니다. 특히 SOCKET_MMAP 시스템 호출을 사용합니다. 결과는 환상적입니다. 한번은 2.1Gbps를 실행하는 스위치 포트에서 프레임을 캡처했는데 프레임 손실이 전혀 없었습니다.

딸깍 하는 소리여기SOCKET_MMAP 시스템 호출이 어떻게 작동하는지 살펴보세요. 몇 가지 아이디어를 얻을 수 있습니다.

답변3

다른 프로세스의 메모리에 액세스하려면 다음 기능이 필요합니다정상사용자는 그렇지 않습니다. 그러나 루트가 되는 등 이러한 기능에 대한 액세스 권한을 얻으면 그렇게 할 수 있습니다.

관련 정보