有时在DLL的某个函数被调用时暂停是很有用,特别是系统DLL(比如kernel32.dll、user32.dll)。实现这种暂停需要使用原生debugger提供的上下文运算符。你可以设定断点位置、变量名或者表达式:
-
{[函数],[源代码],[模块]}断点位置
-
{[函数],[源代码],[模块]}变量名
-
{[函数],[源代码],[模块]}表达式
大括号内可以是函数名、源代码及模块的任意组合,但是逗号不能省略。
举个例子如果我们需要在CreateThread函数调用时暂停。这个函数是从kernel32.dll导出的,因此上下文运算符应该是这样子的:{,,kernel32.dll}CreateThread。然而,这样并不行,因为该运算符需要CreateThread修饰之后的名字。可以使用 DBH.exe来获得一个特定函数的修饰名(编译器编译生成)。
下面是如何获得CreateThread的修饰名的方法:
01
|
C:\Program Files (x86)\Debugging Tools for Windows (x86)>dbh.exe -s:srv*C:\Symbo
|
02
|
ls*http://msdl.microsoft.com/Download/Symbols -d C:\Windows\SysWOW64\kernel32.dl
|
04
|
Symbol Search Path: srv*C:\Symbols*http://msdl.microsoft.com/Download/Symbols
|
07
|
1 10b4f65 : _BaseCreateThreadPoolThread@12
|
08
|
2 102e6b7 : _CreateThreadpoolWork@12
|
09
|
3 103234c : _CreateThreadpoolStub@4
|
10
|
4 1011ea8 : _CreateThreadStub@24
|
11
|
5 1019d40 : _NtWow64CsrBasepCreateThread@12
|
12
|
6 1019464 : ??_C@_0BC@PKLIFPAJ@SHCreateThreadRef?$AA@
|
13
|
7 107309c : ??_C@_0BD@CIEDBPNA@TF_CreateThreadMgr?$AA@
|
14
|
8 102ce87 : _CreateThreadpoolCleanupGroupStub@0
|
15
|
9 1038fe3 : _CreateThreadpoolIoStub@16
|
16
|
a 102e6f0 : _CreateThreadpoolTimer@12
|
17
|
b 102e759 : _CreateThreadpoolWaitStub@12
|
18
|
c 102ce8e : _CreateThreadpoolCleanupGroup@0
|
19
|
d 102e6e3 : _CreateThreadpoolTimerStub@12
|
20
|
e 1038ff0 : _CreateThreadpoolIo@16
|
21
|
f 102e766 : _CreateThreadpoolWait@12
|
22
|
10 102e6aa : _CreateThreadpoolWorkStub@12
|
23
|
11 1032359 : _CreateThreadpool@4
|
看起来真实的名字是_CreateThreadStub@24。因此我们可以创建断点,{,,kernel32.dll}_CreateThreadStub@24。
运行程序,当遇到暂停时,直接忽略关于在断点位置无相关源代码的消息提示。
使用调用堆栈窗口来查看调用这个函数的代码。