WinDbg查看函数参数(zz)

本文详细介绍了如何在使用WinDbg给一个函数下断点后,通过kb命令查看函数参数,以及如何通过EIP和ESP寄存器进一步查看更多参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WinDbg查看函数参数
//z 2012-08-16 16:22:33 IS2120@csdn.T3953604742[T6,L256,R11,V328]
在使用Windbg给一个函数下断点后,函数被中断时,我们经常需要查看函数的参数是什么。通常函数被中断的时机发生在,参数已经被压栈了,执行 call指令(当前EIP被压栈,然后EIP被填充为被调用函数的地址)。此时函数参数已经被压栈了,因此为我们在函数中断时查看函数参数提供了可能。通 常有两种方法查看函数参数,下面以调试记事本打开文件使用的CreateFile函数为例说明。
首先给CreateFile函数下断点,然后使用记事本打开一个txt文件,会发现立即被中断了。
 
查看参数的最简单的方法就是使用kb命令。k系列命令是查看函数的栈帧,即调用堆栈的命令,其中kb命令查看Windbg帮助的解释是在栈回溯中显示传给函数的前三个参数(Displays the first three parameters that are passed to each function in the stack trace. )。因此使用kb命令列出当前函数的调用堆栈,如下图:
 
其中ChiledEbp是函数的基址指针,RetAddr是函数的返回地址,我们需要关注的就是后三列,即函数的前三个参数。在这里可以看出分别是0007fbb0、800000000、00000003。查看MSDN可知,第二个参数是dwDesiredAccess值是80000000即GENERIC_READ,第三个参数dwShareMode是FILE_SHARE_READ | FILE_SHARE_WRITE,现在我们重点来瞅瞅第一个参数,我们知道CreateFileW的第一个参数是LPCWSTR,是个指针,因此我们使用du查看内存上Unicode的值,如下图:
 
可以看出,第一个参数恰好是我们要打开的文件。
看到这里也许会问,那使用kb命令只能查看前三个参数,那如何查看更多的参数呢?前面我们有说过,断点断下来的时机发生在函数参数压栈后,call 指令已经执行,但还没有执行被调用函数的命令的时候,此时EIP已经指向了将要执行的下一条指令,即被调用函数的第一条指令。我们查看EIP的内容,并反 汇编这个地址,
 
下一条指令的地址是0x7c810800,指令是mov edi, edi。另外我们再想到,ESP寄存器是栈顶指针,总是指向栈顶,那么此时栈的结构是什么样的,可不可以通过ESP来访问栈中参数的内容,肯定可以,而且 此时的时机也是非常好的。我们之前说过call指令有一个隐含的动作就是把将要返回的地址也压入栈中,因此此时ESP恰好是指向这个地址的,而之前的动作 就是压栈,通常是反序压栈。因此ESP+4即是第一个参数的地址,ESP+8是第二个参数的地址,依次类推……说了这些,我们可以看看这时内存上的数据:
 
看图的确和我们刚才说的一样吧,这样就可以看到全部7个参数的内容了。
//z 2012-08-16 16:22:33 IS2120@csdn.T3953604742[T6,L256,R11,V328]
<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]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值