2013-04-12 2 views
1

리눅스의 이미지가 메모리에로드 될 때마다 정보를 추적하려고합니다. 여기서 화상 이상적 I 메모리도리눅스 메모리에로드 된 이미지의 메모리 주소 추적

  • 프로세스의 PID, 이벤트
  • 타임 스탬프 이미지가로드되는 곳에서
  • 경로
  • 하고 위치해야 로드됩니다.

나는 리눅스에서 사용할 수있는 open_exec 추적 점을 사용하여 PID, 타임 스탬프 및 경로를 얻을 수 있었다, 그러나 나는 이미지가로드되는 메모리 위치를 추적하는 데 문제가 있습니다. 어떤 제안 (트레이스 포인트, 마커, syscalls 등) 어떻게 이것을 추적 할 수 있습니까?

답변

1

strace (1) 호출 (srace는 ptrace (2) API 사용)을 호출하는 것과 비슷한 방식으로 모든 mmap (2) 호출을 추적 할 수 있습니다.

mmap2(NULL, 40654, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb80e5000 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb80e4000 
mmap2(0x724000, 37456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x724000 
mmap2(0x72c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7) = 0x72c000 
mmap2(0x27e000, 117704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x27e000 
mmap2(0x299000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a) = 0x299000 
mmap2(0x697000, 17008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x697000 
mmap2(0x69b000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3) = 0x69b000 

당신은 각 기술자의 해당 파일 이름이 mmap에, 그리고 반환 값 (2 (오픈 (2)에서) : 당신은 strace (some command) 2> FOO를 사용하여 본 후 mmap FOO을 grep을 strace가 무엇인지 확인하여 자신을 시도 할 수 있습니다)는 이미지가 메모리에 매핑되는 주소입니다. 위의이에 대한

+0

감사 충분해야하지만

는이 과정을 차단하는 방법에 따라, 당신은 또한, dlopen을에 후크를 삽입 할 수 있습니다! 나는 SystemTap을 사용하여 mmap2() 호출을 가로 채기 위해 노력할 것이다. – vsx06

+0

불행하게도, 내가 일하고있는 커널은 특정 시스템 호출을 지원하지 않는다. (이것은 SystemTap을 위해 CONFIG_DEBUG_INFO 나 CONFIG_KPROBES를 사용할 수 없다). 따라서 SystemTap을 사용할 수 없습니다. 나는 커널 재 구축을 피하기위한 대안을 찾고 있었고 perf가 mmap()을 사용하여 사용자 공간 이미지 경로를 메모리상의 위치와 관련시키는 데 사용될 수 있음을 발견했다. 이것을 달성하기 위해 perf를 사용하는 방법에 대한 조언이 있습니까? – vsx06