메모리 보호를 파악하기 위해 구문 분석/Proc/Self/Maps보다 더 좋은 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/269314

문제

Linux (또는 Solaris)에서는 핸드 파싱보다 더 좋은 방법이 있습니까? /proc/self/maps 메모리의 하나 이상의 주소에 저장된 것을 읽거나 쓰거나 실행할 수 있는지 여부를 반복적으로 알아 내기 위해?

예를 들어, 창문에는 있습니다 VirtualQuery.

리눅스에서는 가능합니다 mprotect 그 값을 바꾸려면 다시 읽을 수 없습니다.

또한, 그러한 권한이 언제 변경되는지 알 수있는 방법이 있습니까 (예 : 누군가가 사용하는 경우 mmap 내 등 뒤에 파일에) 끔찍한 침습적 인 일을하고 ptrace 프로세스의 모든 스레드에서 syscall 메모리 맵에 영향을 줄 수 있습니까?

업데이트:

불행히도, 나는 JIT 내부 에서이 코드에 대한 정보가 거의없고 실행중인 코드에 대한 정보가 상수를 근사화하기 위해 사용하고 있습니다. 예, Linux에서 사용하는 vsyscall 페이지와 같이 변한 데이터의 지속적인 맵을 가질 수 있다는 것을 알고 있습니다. 나 ~할 수 있다 초기 구문 분석에 포함되지 않은 것은 변경 가능하고 위험하지만 그 옵션에 완전히 만족하지 않는다는 가정에 안전하게 돌아갑니다.

지금 내가하는 일은 내가 읽는 것입니다 /proc/self/maps 주어진 주소의 보호를 통해 이진 검색을 할 수있는 구조를 구축하십시오. 내 구조에없는 페이지에 대해 알아야 할 때마다 나는 그것이 그 동안 추가되었거나 어쨌든 segfault에 갈 것이라고 가정하면/proc/self/maps를 다시 읽습니다.

이 정보를 얻기 위해 텍스트를 구문 분석하고 언제 변경시기를 알지 못하는 것은 끔찍한 일입니다. (/dev/inotify 거의 아무것도 작동하지 않습니다 /proc)

도움이 되었습니까?

해결책

나는 동등한 것을 모른다 VirtualQuery Linux에서. 그러나 작동하거나 작동하지 않을 수도있는 다른 방법은 다음과 같습니다.

  • Sigbus/Sigsegv를 트래핑하고 읽기 또는 쓰기를 계속 진행합니다. 메모리가 보호되면 신호 트래핑 코드가 호출됩니다. 신호 트래핑 코드가 호출되지 않은 경우. 어느 쪽이든 당신은 이기고 있습니다.

  • 전화 할 때마다 추적 할 수 있습니다 mprotect 지역이 읽거나 쓰여지는지 알 수있는 해당 데이터 구조를 구축하십시오. 사용하는 모든 코드에 액세스 할 수있는 경우 좋습니다. mprotect.

  • 당신은 모든 것을 모니터링 할 수 있습니다 mprotect 기능을 재정의하는 라이브러리와 코드를 연결하여 프로세스에서 호출 mprotect. 그런 다음 지역이 읽거나 쓰여지는지 알기 위해 필요한 데이터 구조를 구축 한 다음 시스템을 호출 할 수 있습니다. mprotect 실제로 보호를 설정합니다.

  • 당신은 사용하려고 할 수 있습니다 /dev/inotify 파일을 모니터링합니다 /proc/self/maps 모든 변화에 대해. 나는 이것이 효과가 없다고 생각하지만 시도해 볼 가치가 있어야한다.

다른 팁

/is/was/proc/[pid | self]/pagemap, 커널의 문서, 여기에 경고가 있습니다.https://lkml.org/lkml/2015/7/14/477그래서 그것은 완전히 무해하지 않습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top