【问题标题】:I write a c code with inline assembly code to read msr, but failed我用内联汇编代码编写了一个 c 代码来读取 msr,但失败了
【发布时间】:2018-01-12 00:07:42
【问题描述】:

我使用以下代码读取 msr,但运行时崩溃。我不知道为什么。

#include <stdio.h>
#include <stdlib.h>

int main()  
{    
    register long ecx asm("%ecx");
    register long eax asm("%eax");
    register long edx asm("%edx");

    asm("mov %1, %0":"=r"(ecx):"i"(0x1B0));
    asm("rdmsr");
    /*
    asm("xor %1, %0":"+r"(eax):"r"(eax));
    asm("xor %1, %0":"+r"(edx):"r"(edx));
    asm("mov %1, %0":"=r"(eax):"i"(0x01));
    printf("%ld %ld %ld",ecx,eax,edx);
    */
}

【问题讨论】:

  • rdmsr 的docs 表示This instruction must be executed at privilege level 0. 换句话说:您必须是设备驱动程序或内核的一部分。
  • 这意味着我不能通过我的代码修改 msr 值?但是有一个名为 RWEverything 的工具可以做到这一点,你知道它是如何工作的吗?感谢您的回答!
  • 也许我得从一开始就学习内核级驱动程序编程
  • 正如Hans 指出的那样,程序有一个技巧用于加载驱动程序作为程序的一部分。魔术随之而来。

标签: msr


【解决方案1】:

您可以使用现有的WinRing0.sys(32 位)和WinRing0x64.sys(64 位)驱动程序来允许从用户空间访问 MSR。您可以找到一份带有开放许可许可证(“WinRing0 许可证”)的here 副本。

这最终为您提供了从用户空间读取和写入 msrs 的 IOCTL。你可以找到一些使用它的 C# 代码here,但是WinRing0 的其他用户还有很多,所以应该不乏示例。

您也可以编写自己的驱动程序,或编译提供类似访问权限的其他几个可用驱动程序之一,但WinRin0 的优点是它已经签名,个人不再真正可用的过程,当然也不能免费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 2019-11-30
    • 2019-12-10
    • 2015-03-17
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多