Windbg 查看MFC类重载虚函数

本文介绍如何使用Windbg调试工具查看MFC类的虚函数表,并提供了两种脚本方法来反汇编虚函数地址,适用于深入理解C++类的内部实现。

Windbg 查看MFC类重载虚函数

1.进入断点后,查看类的虚函数表指针:

 

2.编写脚本,用于反汇编虚函数表中的各个虚函数地址:

方法1:

$$usage: $$>a<script.txt address
.foreach ( tmpvar { dd ${$arg1}   L64 } )
{
    .if ( ${tmpvar} < ${$arg1} ) 
    { uf /c tmpvar }
}
 方法2:

$$usage: $$>a<script.txt address

r @$t1 = ${$arg1}+1000;
.for ( r @$t0=${$arg1}; @$t0 < @$t1; r @$t0=@$t0+4 )
{
    .if ( 0 == poi(@$t0) )
    {
        .break;
    }

    uf /c poi(@$t0)
}

3.运行脚本:

 

联机帮助:

命令语法:/Debuggers/DebuggerReference/Debugger Commands

脚本语法:/Debuggers/DebuggerOperation/The Debugger Command Window/Using Debugger Command Programs

表达式语法:/Debuggers/DebuggerOperation/The Debugger Command Window/Evaluating Expressions

<think>我们正在使用Windbg查看ntdll.dll中的特定函数。用户的问题是如何在Windbg查看ntdll中的指定函数。 根据引用[1]和引用[2],我们知道Windbg是一个强大的调试器,可以加载扩展模块来增强功能。引用[3]提到了加载SOS扩展的方法,但这里我们不需要调试托管代码,而是查看ntdll(属于Windows原生DLL)中的函数。 步骤: 1. 首先,我们需要加载ntdll模块的符号(symbols)。Windbg需要正确的符号才能显示函数名和源代码(如果有的话)。 2. 然后,我们可以使用`x`(examine symbols)命令来查看特定函数的地址。 3. 如果我们想查看函数的反汇编代码,可以使用`u`(unassemble)命令。 具体步骤: a. 确保符号路径设置正确,以便Windbg能够下载Microsoft的符号。可以使用`.symfix`命令设置符号服务器,然后使用`.reload`重新加载符号。 b. 加载ntdll的符号:`.reload ntdll.dll` c. 使用`x ntdll!<函数名>`来查找函数。例如,要查看NtCreateFile函数,可以输入:`x ntdll!NtCreateFile` d. 使用`u`命令查看反汇编:`u ntdll!NtCreateFile` 注意:函数名是区分大小写的,但通常Windows导出函数是大小写混合的,我们可以使用通配符`*`来帮助查找。 如果用户不知道完整的函数名,可以使用通配符来查找。例如:`x ntdll!*Create*` 另外,引用[4]提到了内存分配器,但与我们当前的问题关系不大。 因此,回答如下:</think>### 在 WinDBG查看 ntdll.dll 的指定函数 在 WinDBG查看 `ntdll.dll` 中的特定函数,需按以下步骤操作: #### 1. **加载符号文件** - 确保已配置符号路径(含 Microsoft 公共符号服务器): ``` .symfix c:\symbols .reload ``` - 显式加载 `ntdll.dll` 的符号: ``` .reload ntdll.dll ``` 输出示例: ``` DBGHELP: ntdll - public symbols c:\symbols\ntdll.pdb\... ``` #### 2. **查找函数地址** - 使用 `x` 命令查找函数(支持通配符 `*`): ``` x ntdll!<函数名> ``` 示例(查看 `NtCreateFile`): ``` 0:000> x ntdll!NtCreateFile 00007ffb`d6c1a4d0 ntdll!NtCreateFile (NtCreateFile) ``` - 若不确定完整函数名,可用通配符搜索: ``` x ntdll!*CreateFile* ``` #### 3. **查看函数反汇编** - 使用 `u` 命令反汇编函数: ``` u ntdll!NtCreateFile ``` 输出示例: ``` ntdll!NtCreateFile: 00007ffb`d6c1a4d0 4c8bd1 mov r10,rcx 00007ffb`d6c1a4d3 b855000000 mov eax,55h 00007ffb`d6c1a4d8 f604250803fe7f01 test byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1 00007ffb`d6c1a4e0 7503 jne ntdll!NtCreateFile+0x15 (00007ffb`d6c1a4e5) ... ``` #### 4. **查看函数参数/上下文** - 显示函数调用栈(若在断点处): ``` k ``` - 查看寄存器值(调用约定为 `fastcall`): ``` r ``` - RCX/RDX/R8/R9 存储前四个参数 #### 常见问题排查 1. **符号加载失败**: - 检查符号路径:`.sympath` - 强制重新加载:`.reload /f ntdll.dll` 2. **函数未找到**: - 确认函数是否导出:`lmDvm ntdll` 查看导出表 - 检查函数名大小写(通常为 PascalCase) > 提示:可通过 `!dh ntdll -s` 查看 ntdll 的节区信息,定位函数入口点[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值