我正在使用ptrace跟蹤系統調用,例如讀取,寫入,打開等。如果有打開的系統調用,則可以從user_regs_struct中檢索傳遞給此係統調用的參數。第一個參數存儲在rdi寄存器中。 rdi的內容是一個無符號的long long int。如何從中檢索字符串文件名,例如。 foo.txt被傳遞到打開系統調用?如何檢索傳遞給C系統調用的參數?
0
A
回答
0
傳遞給open
(以及系統調用接收字符串的任何其他情況)的參數是指向字符串在內存中的位置的指針。
不幸的是,這些指針是針對惡人的地址空間的,不能直接引用調試器的地址空間。
ptrace
文檔將讓您重複呼叫ptrace(PTRACE_PEEKDATA...)
以獲取字符串,每次4個字節(或8個,取決於平臺)。您可以在舊的fakeroot-ng code中看到如何做到這一點的示例。請注意,該代碼位於GPL之下,因此,除非您正在編寫兼容許可證的代碼,否則不要逐字複製。
幸運的是,有一種方法可以使得數據更簡單和更快。它的便攜性較差,但如果您正在編寫ptrace
代碼,您通常不會在意。
示蹤線程可以打開文件/proc/pid/mem
(其中pid當然是惡人的數字pid)。請注意,只有pid的ptracer才能打開該文件。
一旦打開了該文件,您可以在需要的地址的偏移處從中獲得pread
(2),並直接從對手的地址空間獲取數據。由於read
接口不限於四個字節,因此您可以猜測字符串的長度,讀取多少字節,然後查找終止的NULL並知道確切的字符串。
由於您調用的系統調用較少,因此此方法不僅更容易,而且速度更快。
相關問題
- 1. 如何檢索使用系統傳遞給perl腳本的參數?
- 2. 參數傳遞到系統調用
- 3. 將參數傳遞給xv6的系統調用
- 4. 如何傳遞phantomjs的系統參數?
- 5. 將參數傳遞給自定義系統調用
- 6. 如何將值傳遞給XV6中的系統調用函數?
- 7. 如何在Perl中傳遞系統調用參數?
- 8. 如何參數傳遞給系統命令在Perl
- 9. 如何在C++中調用並傳遞參數給R函數?
- 10. 如何檢查參數是否傳遞給C中的函數?
- 11. 如何將選項傳遞給掛載系統調用?
- 12. 使用系統命令傳遞參數
- 13. 傳遞給系統調用的數據區域太小,」
- 14. 如何在將參數傳遞給C#程序時檢索文件的全名
- 15. 參數傳遞的系統調用在Linux
- 16. 如何將數組傳遞給使用func_get_args檢索參數的函數
- 17. 如何調用VAR = $ VAL傳遞給被調用程序的系統?
- 18. 如何將參數傳遞給使用setTimeout調用的函數?
- 19. C#如何檢查一個枚舉值傳遞給參數?
- 20. 如何將R變量傳遞給python函數的系統調用?
- 21. 如何將參數傳遞給傳遞給mapPartitions的函數?
- 22. 將傳統ASP VBScript參數ByRef傳遞給COM C++
- 23. P /調用傳遞給C庫函數的錯誤參數
- 24. 系統調用的參數
- 25. 解密Google搜索API:如何引用傳遞給回調函數的參數?
- 26. 如何將「...」參數傳遞給從foreach()調用的函數?
- 27. 如何將參數傳遞給ElapsedEventHandler調用的函數?
- 28. 如何將參數傳遞給clone()調用的函數?
- 29. 如何將參數傳遞給C#中新的RoutedEventHandler參數?
- 30. 傳遞字符串用空格作爲系統參數C++
這是一個指向該字符串位於進程內存中的位置的指針。 –
是的,但我無法讀取相同的內容。有沒有特別的方法來讀取進程地址空間?我得到空白字符串或<錯誤:無法訪問..>。 – Sagar
是的,使用'ptrace'。查找「PTRACE_PEEKTEXT」和「PTRACE_PEEKDATA」。 –