这是对MessageBox的简单调用,它是用WinDbg / kd分解的:
00000000`012f1000 6a00 push 0
00000000`012f1002 68d0202f01 push offset ReverseMe+0x20d0 (012f20d0)
00000000`012f1007 68dc202f01 push offset ReverseMe+0x20dc (012f20dc)
00000000`012f100c 6a00 push 0
00000000`012f100e ff159c202f01 call dword ptr [ReverseMe+0x209c (012f209c)]
为什么WinDbg无法为我解析呼叫中的函数名称?我无法想象有人能够对这样的程序进行逆向工程。当我追踪指令时,我将进入MessageBoxW,因此至少在某种程度上WinDbg知道发生了什么。我的意思是应该的,因为可以使用Windows API的PDB。
#1 楼
如果WinDbg不显示方法名称,则符号不正确。使用
.symfix C:\debug\symbols
可以从Microsoft下载PDB文件。然后使用
.sympath+ C:\mypdbs
添加您自己的应用程序的符号。
最后,使用
.reload /f
利用它们。
#2 楼
要解析函数名称,您需要符号信息,并且如果没有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是一个micros常见的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>
评论
我尝试了.reload / f,但并没有真正的帮助。那么,这是WinDbg的固有限制吗?我知道我不能指望它知道没有PDB文件的所有符号(例如ReverseMe的未导出函数的名称)。但是我看到其他调试器和反汇编器正确显示了对WinAPI函数的调用。例如,OllyDbg v。2.01对同一可执行文件显示“ CALL DWORD PTR DS:[<&USER32.MessageBoxW>]”。当我单步调用时,WinDbg在MessageBoxW函数中正确显示了它。我需要为其编写一个自定义扩展名来为我获取名称吗?
– dvvr
2015年3月1日在16:17
请阅读完整的答复,并尝试使用.printf命令将所有建议的示例应用到当前的Scenerio中,您可以检索该呼叫的符号信息,而不必编写任何扩展名,不要将ollydbg或ida与windbg进行比较ollydbg是一个很好的选择用户模式调试器并具有一些内置的分析功能ida的反汇编程序还具有内置的分析功能以识别模式windbg主要用于内核调试。使用高级功能名称的用户模式调试不是windbg的约定。
– blabb
2015年3月2日在6:19
@blabb:“使用高级功能名称的用户模式调试不是windbg的约定。” -我仅(> 95%)使用WinDbg进行用户模式调试。
–托马斯·韦勒(Thomas Weller)
15年3月24日在22:14
是的,您可以使用windbg进行用户模式调试,这个问题是关于在不使用relevent pdb文件的情况下显示精美的函数名,而其他用户模式调试器(例如ollydbg)要好一些,我的回答指向有关如何找到有关符号线索的一些解决方法
– blabb
2015年3月24日23:39