nt!KiSystemCall64 中的断点设置不起作用

Posted

技术标签:

【中文标题】nt!KiSystemCall64 中的断点设置不起作用【英文标题】:breakpoint setting in nt!KiSystemCall64 not working 【发布时间】:2021-03-29 17:10:06 【问题描述】:

我想深入了解 ntdll!NtQueueApcThread,看看执行 syscall 指令后会发生什么。根据文档(Intel® 64 and IA-32 Architectures Software Developer's Manual),syscall指令使用msr的LSTAR(0xC0000082)作为rip,所以我在nt!KiSystemCall64中设置断点,也就是我通过“ rdmsr c0000082"。但它不起作用,我的调试器没有损坏。 syscall inst 好像没有跳转到msr中存储的地址。

这就是我所做的:

0: kd> 
ntdll!NtQueueApcThread+0x10:
0033:00007ffb`3c32c640 7503            jne     ntdll!NtQueueApcThread+0x15 (00007ffb`3c32c645)
0: kd> 
ntdll!NtQueueApcThread+0x12:
0033:00007ffb`3c32c642 0f05            syscall
0: kd> rdmsr c0000082
msr[c0000082] = fffff802`3681e6c0
0: kd> u fffff802`3681e6c0
nt!KiSystemCall64:
fffff802`3681e6c0 0f01f8          swapgs
fffff802`3681e6c3 654889242510000000 mov   qword ptr gs:[10h],rsp
fffff802`3681e6cc 65488b2425a8010000 mov   rsp,qword ptr gs:[1A8h]
fffff802`3681e6d5 6a2b            push    2Bh
fffff802`3681e6d7 65ff342510000000 push    qword ptr gs:[10h]
fffff802`3681e6df 4153            push    r11
fffff802`3681e6e1 6a33            push    33h
fffff802`3681e6e3 51              push    rcx
0: kd> bp ffff802`3681e6c0
0: kd> t
ntdll!NtQueueApcThread+0x14:
0033:00007ffb`3c32c644 c3              ret

目标系统版本为Windows10 build 19042

【问题讨论】:

出于好奇,您所指的文档在哪里?你能编辑帖子以澄清它吗? @Sprite 我看的文档是 Intel® 64 and IA-32 Architectures Software Developer's Manual,你也可以在这个网站上找到一些信息osdev-wiki 谢谢!我还尝试在KiSystemCall64Shadow 设置断点,当我单击“Go”时,发生了 BSOD。 【参考方案1】:

经过几天的学习,我知道了问题所在。一般情况下,在nt!KiSystemCall64中设置断点会导致蓝屏,这是因为nt!KiSystemCall64中的前三条指令是设置内核栈,这是windows内核调试机制所需要的。所以解决办法是在内核栈设置好后设置断点

bp nt!KiSystemCall64+0x15

在我的情况下,设置断点并没有发生任何事情,似乎断点不起作用,我猜是由于我安装的杀毒软件,它可能钩了一些东西。卸载后,断点工作。

【讨论】:

以上是关于nt!KiSystemCall64 中的断点设置不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在x64dbg中设置条件断点

符号不匹配,ida/windbg

NSDictionary 在设置参数时导致线程 1 断点

Visual Studio 断点栏不存在(字形边距、概览标尺)

为啥我在 IA32_LSTAR MSR 上使用内核调试器在 64 位 Windows 上为 SYSCALL 设置断点时会出现 DoubleFault? (KVASCODE 部分)

是否可以在样式组件中使用样式系统的断点?