15 Sep
2014
Posted in: 코드
By    2 Comments

MmIsAddressValid와 PTE


MmIsAddressValid와 PTE
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaru, http://www.jiniya.net

다른 메모리에 접근할 일이 많은 보안 드라이버에서 자주 사용되는 함수 중에 하나가 MmIsAddressValid 함수다. MmIsAddressValid 함수는 접근하려는 메모리가 제대로 된 메모리인지 검사하는 코드다. 그런데 이 함수에서 말하는 valid의 의미는 생각보다 많이 좁다. 단순히 할당되서 접근할 수 있는 메모리를 의미하는 것이 아닌 실제로 물리 메모리에 존재하는 것들에 대해서만 valid 하다고 판단하기 때문이다. 즉, 페이지 아웃된 메모리는 접근할 수 있지만 MmIsAddressValid 함수는 FALSE를 리턴한다는 말이다.

그렇다면 페이지 아웃된 메모리까지 넓혀서 접근 가능한 커널 메모리를 체크하려면 어떤 방법이 있을까? 의외로 방법이 없는 것으로 추정(?!) 된다. ProbeForRead 같은 함수를 생각해 볼 수 있는데 해당 함수는 사용자 메모리에 대한 접근 여부를 체크하는 함수다. 커널 메모리를 넣으면 그냥 예외를 발생시키도록 설계돼 있다. 그.래.서. 결국 커널 영역 메모리의 할당 여부를 체크하려면 PDE, PTE를 직접 체크하는 수 밖에는 없다. 아마도…

직접 체크하는 방법을 구현하려면 PDE, PTE 따위의 구조외 윈도우에서 그것들을 어디에다 매핑시키는지 주소 공간 따위를 알아야 한다. 이게 또 처음 접해보면 다소 생소한 부분이다. 그때 참고하면 도움이 될만한 글이 있어서 소개해본다.

PTE 이해하기 1편
PTE 이해하기 2편
PTE 이해하기 3편


  • 트랙백 주소: http://www.jiniya.net/wp/archives/14290/trackback

관련 글

  • 블론

    생각보다 충격(?) 이네요. 리눅스의 access_ok 같은 일을 하는 게 없다니…
    페이지 인아웃에 관계없이 메모리 valid 체크하는 함수는 정말로 전혀 없는 건가요?

  • YoungJin Shin

    http://www.fsl.cs.sunysb.edu/kernel-api/re243.html

    여기 설명만 참고한다면 access_ok가 하는 일은 사용자 주소 영역의 포인터가 정상적인지 체크하는 기능인 것 같은데요?! windows에서 그 일을 하는 함수가 ProbeForRead/Write입니다.