2016-09-04 40 views
0

我正在使用ptrace跟蹤系統調用,例如讀取,寫入,打開等。如果有打開的系統調用,則可以從user_regs_struct中檢索傳遞給此係統調用的參數。第一個參數存儲在rdi寄存器中。 rdi的內容是一個無符號的long long int。如何從中檢索字符串文件名,例如。 foo.txt被傳遞到打開系統調用?如何檢索傳遞給C系統調用的參數?

+0

這是一個指向該字符串位於進程內存中的位置的指針。 –

+0

是的,但我無法讀取相同的內容。有沒有特別的方法來讀取進程地址空間?我得到空白字符串或<錯誤:無法訪問..>。 – Sagar

+0

是的,使用'ptrace'。查找「PTRACE_PEEKTEXT」和「PTRACE_PEEKDATA」。 –

回答

0

傳遞給open(以及系統調用接收字符串的任何其他情況)的參數是指向字符串在內存中的位置的指針。

不幸的是,這些指針是針對惡人的地址空間的,不能直接引用調試器的地址空間。

ptrace文檔將讓您重複呼叫ptrace(PTRACE_PEEKDATA...)以獲取字符串,每次4個字節(或8個,取決於平臺)。您可以在舊的fakeroot-ng code中看到如何做到這一點的示例。請注意,該代碼位於GPL之下,因此,除非您正在編寫兼容許可證的代碼,否則不要逐字複製。

幸運的是,有一種方法可以使得數據更簡單更快。它的便攜性較差,但如果您正在編寫ptrace代碼,您通常不會在意。

示蹤線程可以打開文件/proc/pid/mem(其中pid當然是惡人的數字pid)。請注意,只有pid的ptracer才能打開該文件。

一旦打開了該文件,您可以在需要的地址的偏移處從中獲得pread(2),並直接從對手的地址空間獲取數據。由於read接口不限於四個字節,因此您可以猜測字符串的長度,讀取多少字節,然後查找終止的NULL並知道確切的字符串。

由於您調用的系統調用較少,因此此方法不僅更容易,而且速度更快。

相關問題