要解析函数名称,您需要符号信息并且符号信息保存在 pdb 文件中,如果您没有 pdb 文件那么这绝对是一项非常艰巨的任务,直到您学习一些技巧/记住一些模式/了解一些问题
如果您有符号文件 do .reload /f 根据 psb 类型(私有 pdb / 公共 pdb)和编译类型(发布 / 调试),windbg 对符号一无所知,windbg 将解析公共名称和/或私有本地文件
如果您没有符号信息,则可能需要将其拼凑在一起
没有符号信息的消息框
0:000> u 401000
image00400000+0x1000:
00401000 6a00 push 0
00401002 6800304000 push offset image00400000+0x3000 (00403000)
00401007 6819304000 push offset image00400000+0x3019 (00403019)
0040100c 6a00 push 0
0040100e e807000000 call image00400000+0x101a (0040101a)
00401013 6a00 push 0
00401015 e806000000 call image00400000+0x1020 (00401020)
0040101a ff2508204000 jmp dword ptr [image00400000+0x2008 (00402008)]
基于反汇编,您可能需要查找正确的信息或只是查看十六进制我知道 MessageBoxA 需要两个 ascii 字符串,所以我用 %ma 打印它们以了解调用所指向的内容(jmp [402008] 我打印了调用(我知道微软为其核心 dll 提供了公共符号,我知道 user32.dll 是一个微软 dll,我知道我有符号(这个 user32.dll 的 pdb 文件)
0:000> .printf "%ma\n%ma\n%y\n" , 403000, 403019,poi(402008)
Iczelion's tutorial no.2
Win32 Assembly is Great!
user32!MessageBoxA (7e4507ea)
现在与符号相同的应用程序
当符号信息在反汇编中可用时,请参阅 windbg 正确解析函数名称
0:000> u 401000
dbgmsgbox!start [dbgmsgbox.asm @ 17]:
00401000 6a00 push 0
00401002 6800304000 push offset dbgmsgbox!MsgCaption (00403000)
00401007 6819304000 push offset dbgmsgbox!MsgBoxText (00403019)
0040100c 6a00 push 0
0040100e e807000000 call dbgmsgbox!MessageBoxA (0040101a)
00401013 6a00 push 0
00401015 e806000000 call dbgmsgbox!ExitProcess (00401020)
dbgmsgbox!MessageBoxA:
0040101a ff2508204000 jmp dword ptr [dbgmsgbox!_imp__MessageBoxA (00402008)]
printf hack 之前打印的信息现在可以使用相关的类型信息
0:000> ?? (char *) @@((403000))
char * 0x00403000
"Iczelion's tutorial no.2"
0:000> ?? (char *) @@((403019))
char * 0x00403019
"Win32 Assembly is Great!"
0:000> ln poi(402008)
(7e4507ea) user32!MessageBoxA | (7e450838) user32!MessageBoxExW
Exact matches:
user32!MessageBoxA = <no type information>