필자는 ptrace를 사용하여 읽기, 쓰기, 열기 등과 같은 시스템 호출을 추적하고 있습니다. open에 대한 시스템 호출이 있으면이 시스템 호출에 전달 된 인수는 user_regs_struct에서 검색 할 수 있습니다. 첫 번째 인수는 rdi 레지스터에 저장됩니다. rdi의 내용은 부호없는 long long int입니다. 이것으로부터 문자열 파일 이름을 어떻게 검색합니까? foo.txt가 시스템 호출을 열기 위해 전달 되었습니까?C에서 리눅스 시스템 호출에 전달 된 인수를 검색하는 방법은 무엇입니까?
0
A
답변
0
open
(및 시스템 호출이 문자열을받는 다른 모든 경우)에 전달 된 인수는 메모리에서 문자열의 위치를 가리키는 포인터입니다.
불행하게도이 포인터는 디버거의 주소 공간 용이며 디버거의 주소 공간에서 직접 참조 할 수 없습니다.
설명서는 한번에 4 바이트 (또는 플랫폼에 따라 8 바이트)의 문자열을 얻기 위해 반복적으로를 호출해야합니다. 이전 fakeroot-ng code에서이를 수행하는 방법의 예를 볼 수 있습니다. 이 코드는 GPL하에 있으므로 호환되는 라이센스 코드를 작성하지 않는 한 그대로 복사하지 마십시오.
다행히도 더 간단한 데이터 인 과을 더 빠르게 가져 오는 방법이 있습니다. 이동성은 떨어지지 만 코드 ptrace
을 작성하는 경우 대개 상관 없습니다.
추적자 스레드는 /proc/pid/mem
파일을 열 수 있습니다 (여기서 pid은 debugee의 숫자입니다). pid의 ptracer 만 해당 파일을 열 수 있습니다.
해당 파일이 열리면 원하는 주소의 오프셋으로 pread
(2)을 입력하고 해당 주소 공간에서 직접 데이터를 가져올 수 있습니다. read
인터페이스는 4 바이트로 제한되지 않으므로 문자열의 길이를 추측하고 그 바이트 수를 읽은 다음 종료하는 NULL을 찾고 정확한 문자열을 알 수 있습니다.
시스템 호출 횟수가 적기 때문에이 방법은 훨씬 쉽고 빠릅니다.
관련 문제
- 1. C에서 어셈블리로 인수를 전달 하시겠습니까?
- 2. 모의로 전달 된 인수를 캡처하는 방법은 무엇입니까?
- 3. gcc가 시스템 호출이 아닌 시스템 호출에 강제로 사용하는 방법은 무엇입니까?
- 4. 헬퍼 함수로 전달 된 인수에서 객체 이름을 검색하는 방법은 무엇입니까?
- 5. .Net 오류 (시스템 호출에 전달 된 데이터 영역이 너무 작음)
- 6. 이전에 bind() 호출에 전달 된 소켓 정보를 얻는 방법은 무엇입니까?
- 7. 리눅스 시스템 호출 getifaddr의 C++ 내 C에서
- 8. C에서 시스템 호출에 지연 시간 (마이크로 초)을 구현하는 방법
- 9. fork() 시스템 호출에 의해 반환 된 값
- 10. Objective-C에서 AppleScripts에 인수를 전달하는 방법은 무엇입니까?
- 11. 시스템 속성을 사용하여 인수를 구현하는 방법은 무엇입니까?
- 12. addEventListener에 전달 된 리스너 함수에 인수를 전달하는 방법은 무엇입니까?
- 13. configure 스크립트에 전달 된 인수를 출력하는 방법은 무엇입니까?
- 14. 참조로 전달 된 함수에 인수를 전달하는 방법은 무엇입니까? 아래 코드
- 15. android activities에 전달 된 인수를 관리하는 방법은 무엇입니까?
- 16. 전달 된 인수를 Windows 배치 파일로 리디렉션
- 17. 최상의 리눅스 파일 시스템 필터 옵션은 무엇입니까?
- 18. C에서 stderr에서 내용을 검색하는 방법은 무엇입니까?
- 19. IAutomation - 포인터를 통해 전달 된 인수 값을 검색하는 방법은 무엇입니까?
- 20. PHP에서 전달 된 자바 스크립트에서 객체를 검색하는 방법은 무엇입니까?
- 21. 의도를 통해 전달 된 데이터를 검색하는 방법은 무엇입니까?
- 22. 이 목록에서 playAudio 호출에 인수를 가져 오는 우아한 방법은 무엇입니까
- 23. C에서 함수에 전달 된 char *에 텍스트가 채워지는 방법은 무엇입니까?
- 24. 함수 호출에 추가 인수를 추가하는 방법
- 25. 정확하게 시스템 리눅스 API는 무엇입니까?
- 26. 인수를 전달
- 27. 전달 인수를
- 28. 리눅스 커널에서 시스템 호출
- 29. 리눅스 드라이버에서 폴링 시스템 호출
- 30. Objective C에서 여러 인수를 사용하여 메시지 구문을 이해하는 방법은 무엇입니까?
해당 문자열이 프로세스의 메모리에있는 위치를 가리키는 포인터입니다. –
예. 그렇지만 읽을 수는 없습니다. 프로세스 주소 공간을 읽는 특별한 방법이 있습니까? 빈 문자열이나 <오류 : 액세스 할 수 없습니다 ..>가 나타납니다. – Sagar
예,'ptrace'를 사용합니다. 'PTRACE_PEEKTEXT'와'PTRACE_PEEKDATA'를 찾으십시오. –