将 itdr 存储在 x64 上

发布于 2024-09-30 01:34:04 字数 417 浏览 7 评论 0原文

我试图在我的驱动程序中获取 idt 地址,我在 asm 中创建了一个函数,它返回 idtr 包含的内容:

.data
  myData dq 0

.code
Function PROC
  sidt myData
  mov rax, myData
  ret
Function ENDP
END

但是我得到的地址很奇怪,例如在 Windbg 中:

r idtr
idtr=fffff80000b95080

但是我的驱动程序显示:

idtr = f80000b950800fff

我在 x64 上读到 IDTR 包含 64 位IDT表的基地址。如果有人解释为什么我的输出与 WinDbg 的输出不同,我将不胜感激。

I tried to get idt address in my driver, I made function in asm which returns what idtr contains:

.data
  myData dq 0

.code
Function PROC
  sidt myData
  mov rax, myData
  ret
Function ENDP
END

But the address which I get is weird, for example in windbg:

r idtr
idtr=fffff80000b95080

However my driver shows:

idtr = f80000b950800fff

I read that on x64 IDTR contains 64-bit base address of IDT table. I would appreciate if anyone explain why my output is not the same as from WinDbg.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

要走干脆点 2024-10-07 01:34:04

这是 Intel 文档中关于 SIDT 指令的说法:

在64位模式下,操作数大小固定为8+2字节。该指令存储 8 字节基值和 2 字节限制值。

并且:

DEST[0:15] <- IDTR(Limit);
DEST[16:79] <- IDTR(Base);

这意味着您的 myData 变量需要为 10 个字节长,并且指令将限制存储在前 2 个字节中,并将基地址存储在接下来的 8 个字节中。这也解释了为什么您的值在第一个 ffff 字节之后与 WinDbg 的值匹配。

This is what the Intel docs say about the SIDT instruction:

In 64-bit mode, the operand size is fixed at 8+2 bytes. The instruction stores 8-byte base and 2-byte limit values.

and:

DEST[0:15] <- IDTR(Limit);
DEST[16:79] <- IDTR(Base);

This means your myData variable needs to be 10 bytes long, and the instructions stores the limit in the first 2 bytes and base address in the next 8 bytes. This also explains why your value matches with WinDbg's value after the first ffff bytes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文