我想看看 IDA 中 Windows 操作系统的一些组件,例如 ntoskrnl.exe 和一些 Windows API .DLL。我知道有一个 Microsoft 符号服务器,但我不确定如何从中实际检索选择的 .PDB。
虽然这个问题与我的相似,但答案不包括如何在反汇编期间静态加载选择的 .pdb,而不是在调试时从环境变量自动加载它。
如何为 Windows 二进制文件下载特定的 .PDB?
我想看看 IDA 中 Windows 操作系统的一些组件,例如 ntoskrnl.exe 和一些 Windows API .DLL。我知道有一个 Microsoft 符号服务器,但我不确定如何从中实际检索选择的 .PDB。
虽然这个问题与我的相似,但答案不包括如何在反汇编期间静态加载选择的 .pdb,而不是在调试时从环境变量自动加载它。
如何为 Windows 二进制文件下载特定的 .PDB?
正如其他答案所指出的那样,官方方式使用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