우리는 메모리 추적 라이브러리 인 mprotect
을 사용하여 대부분의 프로그램 메모리에 대한 액세스를 제거하고 SIGSEGV 핸들러를 사용하여 개별 페이지가 프로그램에 접근 할 때 액세스를 복원하려고합니다. 이것은 시간의 대부분을 잘 작동합니다.보호 된 메모리가 주어지면 어떻게 시스템 호출이 내 SIGSEGV 핸들러를 호출하게 할 수 있습니까?
내 문제는 내 라이브러리가 아무런 액세스도 표시하지 않은 메모리가있는 시스템 호출 (예 : read
)을 호출하면 시스템 호출이 -1을 반환하고 errno
을 EFAULT
으로 설정한다는 것입니다. 이것은 이상한 방법으로 테스트중인 프로그램의 동작을 변경합니다. 나는 실제로 커널에 가기 전에 시스템 호출에 주어진 메모리의 각 페이지에 대한 액세스를 복원 할 수 있기를 원한다.
현재 나의 접근 방식은 메모리에 닿는 각 시스템 호출에 대한 래퍼를 만드는 것이다. 각 래퍼는 실제 시스템 호출에 전달하기 전에 주어진 모든 메모리를 건드립니다. 이것은 프로그램에서 직접 호출 한 경우에는 작동하지만 libc에서 호출 한 경우에는 작동하지 않는 것 같습니다 (예 : fread
은 랩퍼를 사용하지 않고 read
을 직접 호출합니다). 더 좋은 접근 방법이 있습니까? 어떻게이 행동을 취하는 것이 가능합니까?
글쎄, 바보 같아. 시스템 호출에 잘못된 메모리를 부여 할 때 segfault 대신 EFAULT를 예상하는 사람은 누구입니까? : P 시스템 호출과 사용자 공간 함수 사이에 무작위적인 불일치처럼 보입니다 ... –