Windows 内核条件断点未评估
Windows kernel conditional breakpoint not evaluating
我在 visual studio 2013 年之前一直在使用 windows 内核调试器,我试图在一个函数 (nt!KiSwapContext
) 中停止(中断),但仅限于特定进程(0x920
).
断点无条件运行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 位处理器上使用双字而不是 qword 进行条件检查。 ? poi(poi(gs:[188h])+3B8h)
returns 一个 qword 值。我知道我可以使用 dd
来获取值,但我似乎无法弄清楚如何将其添加到条件中。类似于 ? dword(poi(gs:[188h])+3B8h)==0x920
或 ? {dd poi(gs:[188h])+3B8h}==0x920
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 " r?$t0 = @$thread->Cid.UniqueProcess ;.if( @$t0 != 0x740 ) {? @$t0;?? ( char * )@$proc->ImageFileName ;gc }"
此条件仅在 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 在几秒钟内被调用数百次
你会看到你的性能明显下降
会话
尽可能使用特定于进程或特定于线程的断点
不评估条件
不,我不使用任何作弊 sheet(google 说可用的很少)我更喜欢手册或在某些情况下在线 msdn 文档
我在 visual studio 2013 年之前一直在使用 windows 内核调试器,我试图在一个函数 (nt!KiSwapContext
) 中停止(中断),但仅限于特定进程(0x920
).
断点无条件运行bp nt!KiSwapContext
我确定可以通过 dt dword poi(gs:[188h])+3B8h
我已经确认了以下有条件的工作,看看我是否在正确的线程上:? poi(poi(gs:[188h])+3B8h)==0x920
但是,当我尝试设置条件断点时,无论我在 if/else 中放入什么,它总是会中断。所以我猜它认为表达式无效并且只是忽略它。我已经确认,如果我确实输入了一个无效的表达式,它只会在没有警告或错误的情况下接受它,并且总是在断点处停止。
我使用的表达式是:bp nt!KiSwapContext ".if (poi(poi(gs:[188h])+3B8h)==0x920) {} .else {gc}"
我也尝试过使用 j
条件语法,但无济于事。
对我做错了什么有什么想法吗?
[编辑] 哦,作为奖励,我如何在 64 位处理器上使用双字而不是 qword 进行条件检查。 ? poi(poi(gs:[188h])+3B8h)
returns 一个 qword 值。我知道我可以使用 dd
来获取值,但我似乎无法弄清楚如何将其添加到条件中。类似于 ? dword(poi(gs:[188h])+3B8h)==0x920
或 ? {dd poi(gs:[188h])+3B8h}==0x920
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 " r?$t0 = @$thread->Cid.UniqueProcess ;.if( @$t0 != 0x740 ) {? @$t0;?? ( char * )@$proc->ImageFileName ;gc }"
此条件仅在 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 在几秒钟内被调用数百次 你会看到你的性能明显下降 会话
尽可能使用特定于进程或特定于线程的断点 不评估条件
不,我不使用任何作弊 sheet(google 说可用的很少)我更喜欢手册或在某些情况下在线 msdn 文档