我正在尝试在 user32 中设置断点!RegisterClipboardFormat 显然,此函数已导出(链接 /dump /exports - 它就在那里)。在从 Microsoft 符号服务器下载 PDB 文件之前,我能够找到这个函数:
0:001> lm m user32
start end
76eb0000 76fcf000 USER32 (export symbols) c:\Windows\system32\USER32.dll
0:001> x user32!RegisterClipboardFormat*
76ec4eae USER32!RegisterClipboardFormatA (<no parameter info>)
76ec6ffa USER32!RegisterClipboardFormatW (<no parameter info>)
没问题。我能够“购买”任何这些功能。但是当我从 Microsoft PDB 服务器下载 PDB 符号时:
0:001>
start end module name
76d50000 76e6f000 USER32 (pdb symbols) c:\symbols\user32.pdb\561A146545614951BDB6282F2E3522F72\user32.pdb
0:000> x user32!RegisterClipboardFormat
WinDBG 找不到符号。但是,它可以找到 RegisterWindowMesssage:
0:000> x user32!RegisterWindowMessage*
76d64eae USER32!RegisterWindowMessageA = <no type information>
76d66ffa USER32!RegisterWindowMessageW = <no type information>
请注意,这些函数具有相同的地址(这是在 Windows 8 上。不确定以前的版本)。这可能是通过优化器或在 DEF 文件中实现的(EXPORT 部分中的 func1=func2)。'link /dump /exports' 显示 RegisterWindowMessage 和 RegisterClipboardFormat 具有相同的 RVA。
问题是我在这上面花了太多时间。所以我的问题是:
- 是否有一种简单的方法,从 WinDBG 中找出丢失的别名导出符号。
- 假设我只想打破 RegisterClipboardFormatW。如果我没记错的话,应该有一个 JMP 指令(在调用模块导入表中)。我如何找到那个符号?有没有办法在所有调用模块中找到这个条目?