这绝对是一个初学者的问题,但是WinDbg文档对我的帮助不大,因为大多数问题都围绕着调试程序和可用的PDB文件进行。我尝试了.reload,但没有任何效果。

这是对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