在哪里可以获得 Windows 操作系统组件的 .PDB 文件?

逆向工程 艾达 拆卸 视窗 调试 符号
2021-06-22 02:15:34

我想看看 IDA 中 Windows 操作系统的一些组件,例如 ntoskrnl.exe 和一些 Windows API .DLL。我知道有一个 Microsoft 符号服务器,但我不确定如何从中实际检索选择的 .PDB。

虽然这个问题与我的相似,但答案不包括如何在反汇编期间静态加载选择的 .pdb,而不是在调试时从环境变量自动加载它。

如何为 Windows 二进制文件下载特定的 .PDB?

3个回答

正如其他答案所指出的那样,官方方式使用windbg安装中的symchk.exe

但是你也可以通过将几个 dbghelp 和 winsock 函数放在一起来获取它

在下面找到一个使用 wget.exe 的 poc

#include <stdio.h>
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib,"dbghelp.lib")
#pragma comment(lib,"user32.lib")
const char *formatstr =
"wget -c -U=\"Microsoft-Symbol-Server/10.0.0.0\" "
"\"http://msdl.microsoft.com/download/symbols/"
"%s/%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x%x/%s\"";
char fetchpdb[0x1000];
int main(int argc,char *argv[]) {
    if(argc !=2){
        printf("usage %s path to binary\n",argv[0]);
        exit(0);
    }
    SYMSRV_INDEX_INFO syminf ={0};
    syminf.sizeofstruct = sizeof(SYMSRV_INDEX_INFO);
    BOOL ret = SymSrvGetFileIndexInfo(argv[1],&syminf,0);
    if(ret) {
        wsprintfA(
        fetchpdb,formatstr,syminf.pdbfile,syminf.guid.Data1,
        syminf.guid.Data2, syminf.guid.Data3,syminf.guid.Data4[0],
        syminf.guid.Data4[1],syminf.guid.Data4[2],syminf.guid.Data4[3],
        syminf.guid.Data4[4],syminf.guid.Data4[5],syminf.guid.Data4[6],
        syminf.guid.Data4[7],syminf.age,syminf.pdbfile
        );
        // Depricated use CreateProcess and/or Winsock functions needs wget.exe in path
        WinExec(fetchpdb,1);
    }
    else {
        printf("%x\n",GetLastError());
    }
    return 0;
}

您可以使用symchk工具随Windows SDK来自动完成这个过程。

IIRC 类似于:

symchk /v /r c:\myfiles /s srv*c;\symbols*https://msdl.microsoft.com/download/symbols

这将遍历 c:\myfiles 中的 PE 文件,从 MS 符号服务器获取 PDB 并将它们缓存在 c:\symbols 中。

您可以通过以下方式下载所有符号:

"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\symchk.exe" /r c:\windows /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols

https://www.bleepingcomputer.com/news/microsoft/microsoft-is-no-longer-providing-offline-msi-symbol-packages/