Windows内核条件断点未评估

时间:2016-10-22 00:51:47

标签: windows debugging kernel windbg breakpoints

我通过visual studio 2013使用windows内核调试器,我试图在函数(nt!KiSwapContext)中停止(中断)但仅针对特定进程(0x920)。< / p>

断点在没有条件bp nt!KiSwapContext

的情况下工作

我确定可以使用dt dword poi(gs:[188h])+3B8h

找到当前线程的进程ID

我已确认以下有条件的作品,看看我是否在正确的主题:? poi(poi(gs:[188h])+3B8h)==0x920

然而,当我尝试设置条件断点时,无论我在if / else中放置什么,它总是会中断。所以我猜它认为表达式是无效的,只是忽略它。我已经确认如果我确实输入了一个无效的表达式,它就会在没有警告或错误的情况下接受它,并且总是在断点处停止。

我使用的表达式为:bp nt!KiSwapContext ".if (poi(poi(gs:[188h])+3B8h)==0x920) {} .else {gc}"

我也尝试使用j条件语法无效。

关于我做错的任何想法?

[编辑]哦,作为奖励,如何在64位处理器上使用dword而不是qword进行条件检查。 ? poi(poi(gs:[188h])+3B8h)返回qword值。我知道我可以使用dd来获取值,但我似乎无法弄清楚如何将其添加到条件中。类似? dword(poi(gs:[188h])+3B8h)==0x920? {dd poi(gs:[188h])+3B8h}==0x920

的内容

1 个答案:

答案 0 :(得分:5)

windbg允许您设置process specific breakpoints with /p
你不应该使用gs和fs寄存器

kd> bl

kd> !process 0 0 calc.exe
Failed to get VAD root
PROCESS 8113d528  SessionId: 0  Cid: 07a0    Peb: 7ffde000  ParentCid: 043c
    DirBase: 03d27000  ObjectTable: e15ba240  HandleCount:  28.
    Image: calc.exe

kd> bp /p 8113d528 nt!KiSwapContext "?? (char *)(@$proc->ImageFileName)"
kd> g
char * 0x8113d69c
 "calc.exe"
nt!KiSwapContext:
804db828 83ec10          sub     esp,10h
kd> g
char * 0x8113d69c
 "calc.exe"
nt!KiSwapContext:
804db828 83ec10          sub     esp,10h

根据需要使用dwo()和qwo()来评估dword和qword

kd> ? qwo ( ffb9cda8 + 70)
Evaluate expression: -9142252815570161280 = 81203180`81203180
kd> ? dwo ( qwo ( ffb9cda8 + 70))
Evaluate expression: -4600296 = ffb9ce18

confirmation

kd> dd 81203180 l1
81203180  ffb9ce18
kd> dd ffb9cda8+70 l1
ffb9ce18  81203180

修改

我无法访问x64系统atm,因此无法告诉您表达式中的错误 但一般情况下,除非绝对必要,否则应避免硬编码

在你的情况下没有必要

windbg为您提供了难以编码的伪寄存器

$thread to c++ Expression for CurrentThread * ie (nt!_ETHREAD *)

所以$thread->Cid.UniqueProcess是您使用gsexxxxx评估的内容

考虑到这一点,你可以像这样设置一个断点

bp nt!KiSwapContext&#34; R' $ t0 = @ $ thread-&gt; Cid.UniqueProcess; .if(@ $ t0!= 0x740){? @ $ T0; ?? (char *)@ $ proc-&gt; ImageFileName; gc}&#34;

这个条件只会在calc.exe中打破当前进程

kd> g
Evaluate expression: 404 = 00000194
char * 0x81105c84
 "csrss.exe"
XXXXXXXXXXX
Evaluate expression: 4 = 00000004
char * 0x8129196c
 "System"
xxxxxxxxxxxxxxxxxxxxxxxxxxx
Evaluate expression: 1404 = 0000057c
char * 0x8114a4bc
 "vpcmap.exe"
Evaluate expression: 480 = 000001e0
char * 0x8112a98c
 "services.exe"
Evaluate expression: 492 = 000001ec
char * 0x811cc9ac
 "lsass.exe"
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Evaluate expression: 1116 = 0000045c
char * 0xffaf9da4
 "explorer.exe"
Evaluate expression: 644 = 00000284
char * 0xffb74f14
 "svchost.exe"

nt!KiSwapContext: <---------------------------Conditional broke here
804db828 83ec10          sub     esp,10h

kd> ? @$t0;?? (char * )@$proc->ImageFileName
Evaluate expression: 1856 = 00000740
char * 0x8110e76c
 "calc.exe"

请记住,在一条非常炎热的道路上评估条件会让你忍受无法忍受的痛苦,看着它爬行

nt!kiSwapContext在几秒钟内被调用了数百次 你将会看到一个非常显着的性能下降 会议

尽可能使用特定于流程或特定于线程的断点 不评估条件

不,我没有使用任何备忘单(谷歌说有少量可用)我更喜欢手册或在某些情况下在线msdn文档