Windows内核条件断点不评估

我正在使用Windows内核debugging程序通过Visual Studio 2013,我试图停止(中断)在一个函数( nt!KiSwapContext ),但只为一个特定的进程( 0x920 )。

断点运行时没有条件bp nt!KiSwapContext

我确定当前线程的进程ID可以用dt dword poi(gs:[188h])+3B8h

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

但是,当我尝试设置条件断点时,无论我放在if / else中,它总是会中断。 所以我猜测它认为expression是无效的,只是忽略它。 我已经证实,如果我input一个无效的expression式,它只是接受它没有警告或错误,并总是停在断点。

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

我也尝试使用j条件语法无济于事。

任何想法,我做错了什么?

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

windbg允许您process specific breakpoints with /p设置process specific breakpoints with /pprocess 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“r $ t0 = @ $ thread-> Cid.UniqueProcess; .if(@ $ t0!= 0x740){?@ $ t0;(char *)@ $ proc-> ImageFileName; gc} “

这个条件只会在calc.exe中打破,就是Current Process

 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在几秒钟内被调用了几百次,在Session中你将看到非常明显的性能下降

只要有可能,使用特定于进程或特定于线程的断点就不会评估条件

不,我不使用任何备忘单(谷歌说,有几个可用)我宁愿手动或在某些情况下在线MSDN文档