연구 프로젝트를위한 커널 공간 컴포넌트를 작성합니다. 실행시 다른 지점에서 사용자 공간 프로세스를 가로 채서 검사해야합니다 (특정 지침). 여러 가지 이유로 사용자 공간 프로그램을 수정하거나 프로세스를 ptrace 할 수 없습니다.커널 공간에서 사용자 프로세스의 .text 섹션에 쓰기
이 목표를 달성하기 위해 사용자 공간 프로세스에 중단 점 (INT 3 명령어)을 삽입하여 체크 포인트해야하고 커널 공간에서 SIGTRAP을 인터셉트하려고합니다. 불행히도, 나는 그 프로세스의 커널 공간에서 사용자 영역 코드의 읽기 전용 텍스트 섹션을 적절하게 수정하는 방법을 생각할 수 없다. 현재 get_user_pages
API를 사용하여 쓰기 가능한 페이지를 강제로 수정하려고하지만 텍스트 데이터가 변경되지 않는 것 같습니다. 사용하려고 시도하는 코드의 관련 부분은 다음과 같습니다. user_addr
은 (unsigned long)
에 중단 점을 삽입 할 사용자 공간 주소입니다. page
은 struct page *
입니다. 좀 더 커널 지식과 경험을 가진 사람을 바라고
char *addr;
unsigned long aligned_user_addr = user_addr & ~((unsigned long)PAGE_SIZE - 1);
down_read(¤t->mm->mmap_sem);
rc = get_user_pages(current, current->mm, aligned_user_addr,
1, 1, 1, &page, &vma);
up_read(¤t->mm->mmap_sem);
BUG_ON(rc != 1);
addr = kmap(page);
BUG_ON(!addr);
offs = user_addr % PAGE_SIZE;
/* NOTE: INT3_INSTR is defined to be 0xCC */
addr[offs] = INT3_INSTR;
BUG_ON(addr[offs] != INT3_INSTR); // Assertion fails
set_page_dirty(page);
kunmap(page);
page_cache_release(page);
내 작업을 달성에 대해 가서 내가 잘못 뭔지, 또는 적절한 방법을 말할 수있을 것입니다.
도움 주셔서 감사합니다.