2014-07-24 2 views
1

연구 프로젝트를위한 커널 공간 컴포넌트를 작성합니다. 실행시 다른 지점에서 사용자 공간 프로세스를 가로 채서 검사해야합니다 (특정 지침). 여러 가지 이유로 사용자 공간 프로그램을 수정하거나 프로세스를 ptrace 할 수 없습니다.커널 공간에서 사용자 프로세스의 .text 섹션에 쓰기

이 목표를 달성하기 위해 사용자 공간 프로세스에 중단 점 (INT 3 명령어)을 삽입하여 체크 포인트해야하고 커널 공간에서 SIGTRAP을 인터셉트하려고합니다. 불행히도, 나는 그 프로세스의 커널 공간에서 사용자 영역 코드의 읽기 전용 텍스트 섹션을 적절하게 수정하는 방법을 생각할 수 없다. 현재 get_user_pages API를 사용하여 쓰기 가능한 페이지를 강제로 수정하려고하지만 텍스트 데이터가 변경되지 않는 것 같습니다. 사용하려고 시도하는 코드의 관련 부분은 다음과 같습니다. user_addr(unsigned long)에 중단 점을 삽입 할 사용자 공간 주소입니다. pagestruct page *입니다. 좀 더 커널 지식과 경험을 가진 사람을 바라고

char *addr; 
unsigned long aligned_user_addr = user_addr & ~((unsigned long)PAGE_SIZE - 1); 

down_read(&current->mm->mmap_sem); 
rc = get_user_pages(current, current->mm, aligned_user_addr, 
        1, 1, 1, &page, &vma); 
up_read(&current->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); 

내 작업을 달성에 대해 가서 내가 잘못 뭔지, 또는 적절한 방법을 말할 수있을 것입니다.

도움 주셔서 감사합니다.

답변

1

내 문제는 실제로 C 부호 확장 인 것으로 나타났습니다.

#define INT3_INSTR 0xCC 
그것을 정수한다

및 라인 :하십시오 signed charaddr[offs] 평가

BUG_ON(addr[offs] != INT3_INSTR); 

INT3_INSTR 같이 정의 하였다.

BUG_ON(0xFFFFFFCC != 0xCC); 
: C에서 signed charint의 유형은 int의에 상승하고, 그것 그것의 MSB가 0xCC 인의 MSB는 항상 1 항상로 평가 비교 1.으로 경우 확장 서명됩니다 서명 이후에 비교 될 때

거짓으로 평가됩니다. addr에서 unsigned char *으로 변경하면 문제가 해결됩니다. 그리고 위의 코드가 작동합니다.