2009-09-17 72 views
1

我正在尋找一種乾淨的方式來捕獲和處理Linux進程的CPUID指令。使用ptrace()並修補由進程創建的所有可執行mmap'ed區域中的所有cpuid操作碼,並將其替換爲int3。由於CPUID操作碼字節經常作爲其他較長操作碼的一部分出現,所以效果不佳。尋找一種方法來捕獲CPUID指令

所以基本上我正在尋找一些方法,允許我不是在特定的內存地址上設置斷點,而是在每次調用操作碼時都設置斷點。任何人都有一個好主意如何做到這一點?

回答

1

沒有簡單的方法來做到這一點,我知道。

一個討厭的方式可能是使用GDB的python腳本API自動單步執行程序,檢查每條指令在執行之前。

另一個令人討厭的方式可能是獲取類似Bochs(一個開放源代碼的x86模擬器)的源代碼,並對其進行更改,以便在執行您感興趣的指令時執行所需操作。

2

一般要做到這一點的任意x86代碼和捕獲所有角落情況下,唯一的辦法就是要麼:

  • 單步執行,並在執行之前檢查每個指令(PTRACE_SINGLESTEP,見下文);或
  • 完全模擬x86指令集。

第一種方法可能會更好。因爲它不會捕獲像自修改代碼或跳到另一條指令中間那樣的情況,所以試圖反編譯除了單步執行時間以外的操作碼是行不通的。

爲了實現單步方法,每個被跟蹤進程停止的時候,你會用PTRACE_GETREGS讓孩子的寄存器,然後用孩子的%eip寄存器的值作爲地址傳遞給PTRACE_PEEKTEXT,讓下一個單詞是執行。檢查該單詞以查看它是否是CPUID指令 - 如果是,則通過調整子單元的寄存器集(包括通過CPUID指令前進%eip)來模擬指令。然後致電PTRACE_SINGLESTEP讓該過程繼續。

相關問題