为什么 WinDbg 不解析函数名称?

逆向工程 风袋
2021-06-21 11:16:10

这绝对是一个初学者问题,但 WinDbg 文档并没有帮到我太多,因为它大部分都是围绕调试程序和可用的 PDB 文件来解决的。我试过 .reload 但它没有任何效果。

这是对使用 WinDbg/kd 反汇编的 MessageBox 的简单调用:

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 可用。

2个回答

如果 WinDbg 不显示方法名称,则符号不正确。

利用

.symfix C:\debug\symbols

能够从 Microsoft 下载 PDB 文件。然后使用

.sympath+ C:\mypdbs

添加您自己的应用程序的符号。

最后,使用

.reload /f

来利用它们。

要解析函数名称,您需要符号信息并且符号信息保存在 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>