2016-09-04 1 views
0

필자는 ptrace를 사용하여 읽기, 쓰기, 열기 등과 같은 시스템 호출을 추적하고 있습니다. open에 대한 시스템 호출이 있으면이 시스템 호출에 전달 된 인수는 user_regs_struct에서 검색 할 수 있습니다. 첫 번째 인수는 rdi 레지스터에 저장됩니다. rdi의 내용은 부호없는 long long int입니다. 이것으로부터 문자열 파일 이름을 어떻게 검색합니까? foo.txt가 시스템 호출을 열기 위해 전달 되었습니까?C에서 리눅스 시스템 호출에 전달 된 인수를 검색하는 방법은 무엇입니까?

+0

해당 문자열이 프로세스의 메모리에있는 위치를 가리키는 포인터입니다. –

+0

예. 그렇지만 읽을 수는 없습니다. 프로세스 주소 공간을 읽는 특별한 방법이 있습니까? 빈 문자열이나 <오류 : 액세스 할 수 없습니다 ..>가 나타납니다. – Sagar

+0

예,'ptrace'를 사용합니다. 'PTRACE_PEEKTEXT'와'PTRACE_PEEKDATA'를 찾으십시오. –

답변

0

open (및 시스템 호출이 문자열을받는 다른 모든 경우)에 전달 된 인수는 메모리에서 문자열의 위치를 ​​가리키는 포인터입니다.

불행하게도이 포인터는 디버거의 주소 공간 용이며 디버거의 주소 공간에서 직접 참조 할 수 없습니다.

설명서는 한번에 4 바이트 (또는 플랫폼에 따라 8 바이트)의 문자열을 얻기 위해 반복적으로를 호출해야합니다. 이전 fakeroot-ng code에서이를 수행하는 방법의 예를 볼 수 있습니다. 이 코드는 GPL하에 있으므로 호환되는 라이센스 코드를 작성하지 않는 한 그대로 복사하지 마십시오.

다행히도 더 간단한 데이터 인 을 더 빠르게 가져 오는 방법이 있습니다. 이동성은 떨어지지 만 코드 ptrace을 작성하는 경우 대개 상관 없습니다.

추적자 스레드는 /proc/pid/mem 파일을 열 수 있습니다 (여기서 pid은 debugee의 숫자입니다). pid의 ptracer 만 해당 파일을 열 수 있습니다.

해당 파일이 열리면 원하는 주소의 오프셋으로 pread (2)을 입력하고 해당 주소 공간에서 직접 데이터를 가져올 수 있습니다. read 인터페이스는 4 바이트로 제한되지 않으므로 문자열의 길이를 추측하고 그 바이트 수를 읽은 다음 종료하는 NULL을 찾고 정확한 문자열을 알 수 있습니다.

시스템 호출 횟수가 적기 때문에이 방법은 훨씬 쉽고 빠릅니다.

관련 문제