[英]Read the value of a cpu control register from admin privilege app (Windows)
我正在嘗試使用內聯匯編從cpu控制寄存器讀取數據。 我最初的目標是x86-64。 我對c或匯編語言並不熟悉,但是我成功地進行了一次非常簡單的嘗試,如下所示:
#include <stdio.h>
#include <stdint.h>
int main() {
uint64_t result;
asm ("movq %%cr4, %0;"
: "=r" (result) ::
);
printf("result: %d \n", result);
return 0;
}
這會編譯,但會在gdb中引發運行時錯誤:
Thread 1 received signal SIGILL, Illegal instruction.
main () at main.c:6
6 asm ("movq %%cr4, %0;"
我認為c / assembly是正確的,因為我能夠從其他寄存器中提取值。 我認為該錯誤是由於我沒有在內核模式下運行(基於我所讀的內容),但是我不完全了解其中的含義,並且由於對c / assembly的了解有限,我沒有確定我應該還在內核模式下玩。
在內核模式之外還有其他方法嗎? 例如,此信息可通過某個地方的公開dll調用獲得。
對於在內核模式下運行應用程序的含義,我歡迎提出任何評論。
更新 :根據此注釋 ,此答案不適用於CR寄存器。
您正在尋找的是所謂的“ WinRing0.sys”驅動程序,該驅動程序公開了一個API,使您可以從用戶模式下讀取僅適用於內核(0環)代碼的所有有趣的MSR。
這是一個開源組件,但是最重要的是,已經有人支付了對驅動程序進行簽名的費用,因此可以將其加載到Windows中(作為個人,即使您願意支付費用,實際上也無法簽署當前的Windows驅動程序) 。 您可以在此處找到32位和64位(WinRing0x64.sys)二進制文件。
此答案提供了更多詳細信息-有關編程性能計數器的問題,但所需的訪問權限相同,並且WinRing0.sys將在這兩種用例中均可使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.