내 프로그램 메모리의 특정 읽기 전용 부분에 액세스할 때 이벤트를 트리거하고 캡처하는 방법을 찾고 있습니다. 특히, 많은 상수 값(읽기 전용)을 포함하는 프로그램 메모리 섹션이 있고 이러한 값 중 하나에 액세스할 때 이벤트 핸들러가 일부 처리(일종의 처리)를 수행할 수 있는 이벤트를 캡처하려는 경우 향상)을 데이터)에 추가하고 향상된 값을 반환합니다. 그래서 몇 가지 질문이 있습니다.
- 가능합니까?
- 그렇다면 어떻게 이 일을 할 수 있을까요?
- (다른 프로세스의 메모리에 액세스하지 않고) 어떤 권한이 필요합니까?
- 사용할 수 있는 기술에 대한 문서가 있습니까?
업데이트 1:
여기에 더 많은 정보가 있지만 아직 구체적인 내용을 알아내려고 노력 중입니다.
내가 원하는 것은 프로그래밍 방식으로 또는 컴파일/링크 중에 액세스할 때 내가 작성한 이벤트 핸들러를 호출하고 허용하는 이벤트를 발생시키는 메모리 영역(아마도 페이지 이상)을 표시하는 것입니다. 이벤트를 일으키는 문제를 "수정"하고 액세스하려고 했던 값을 반환합니다. 목표는 실행 중인 코드를 가질 수 있도록 하는 것이며, 문제의 메모리에 액세스하려고 하면 이벤트 핸들러가 호출되어 액세스를 해결하고 원래 코드로 돌아가서 액세스를 수정/수정할 수 있습니다. 원래 코드는 수정되지 않습니다. printf 형식 문자열을 가정해 보겠습니다. 이벤트를 호출하고 형식 문자열을 조정하거나 교체할 수 있기를 원하며 printf 코드는 계속해서 즐거운 방식으로 진행됩니다.
말이 돼?
답변1
예
아마도 링커 스크립트를 사용하여 변수를 별도의 메모리 페이지에 배치할 수 있습니다.
mprotect
페이지를 로 표시하는 데 사용됩니다no access
. SIGSEGV에 대한 핸들러를 설정 하려면sigaction
관련된 주소에 대한 정보를 얻을 수 있도록 SA_SIGINFO를 지정하십시오.특별한 권한은 필요하지 않습니다.
이것은 여러 번 수행되었습니다. 원래 Bourne 쉘은 메모리 처리를 위해 SIGSEGV를 포착했지만 이는 sigaction이 등장하기 전이었습니다. 핸들러에서는 문제를 해결하고 반환하는 데 필요한 모든 작업을 수행할 수 있습니다. 일반적으로 이를 위해서는 액세스 패턴과 생성된 기계어 코드에 대한 이해가 필요합니다.