메모리 보호를 파악하기 위해 구문 분석/Proc/Self/Maps보다 더 좋은 방법이 있습니까?
-
06-07-2019 - |
문제
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그래서 그것은 완전히 무해하지 않습니다 ...