簡體   English   中英

從管理員權限應用程序(Windows)讀取cpu控制寄存器的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM