PDB符号文件信息
转载:https://www.cnblogs.com/aliflycoris/p/5320649.html
一、前言
这个方法是通过网上的一些方式自己学习枚举PDB文件信息。
二、代码实现
首先枚举驱动文件,这里用psapi库
#include "psapi.h" #pragma comment(lib,"psapi.lib")
VOID CEnumPdbDlg::EnumModule() { LPVOID drivers[ARRAY_SIZE]; DWORD cbNeeded; int cDrivers, i; TCHAR szPath[ARRAY_SIZE] = {0}; //获得基地址 if( EnumDeviceDrivers(drivers, sizeof(drivers), &cbNeeded) && cbNeeded < sizeof(drivers)) { TCHAR szDriver[ARRAY_SIZE]; cDrivers = cbNeeded / sizeof(drivers[0]); for (i=0; i < cDrivers; i++ ) { //获得驱动名 if(GetDeviceDriverBaseName(drivers[i], szDriver, sizeof(szDriver)/sizeof(szDriver[0]))) { CString StrAddress; StrAddress.Format(L"0x%p",drivers[i]); CString FullModPath; //驱动完整路径 GetDeviceDriverFileName(drivers[i], szPath, sizeof(szPath)); int n = m_List.InsertItem(m_List.GetItemCount(),szDriver,0); //注意这里的i 就是Icon 在数组的位置 m_List.SetItemText(n,1,StrAddress); m_List.SetItemText(n,2,szPath); } } } }
本来想看能不能枚举其他信息,看psapi的导出函数,没有相关函数,那就只能通过驱动方式获得了。
然后通过dbghelp库枚举符号信息,这个库是winddk里面的库
#include <Dbghelp.h>
#pragma comment(lib,"dbghelp.lib")
通过下面几个函数就可以枚举pdb文件信息了
VOID EnumFunc::EnumFuncInformation() { std::string strMod; if(g_BaseAddress==0) { MessageBox(L"Error",L"Error"); return; } SymSetOptions(SYMOPT_DEFERRED_LOADS); HANDLE hProcess = GetCurrentProcess(); SymInitialize(hProcess, 0, FALSE); std::string strSymbolPath; //枚举的下载地址 这里是自己的保存路径 #if _WIN64 strSymbolPath = "srv*D:\\Study\\Symbols_Win7_X64*http://msdl.microsoft.com/download/symbols"; #else strSymbolPath = "srv*D:\\Study\\Symbols_WinXP_X86*http://msdl.microsoft.com/download/symbols"; #endif SymSetSearchPath(hProcess, strSymbolPath.c_str()); //在网络上下载符号信息,中间指定了下载目录 std::string strSystemPath = "C:\\Windows\\System32\\"; //这是驱动文件路径 strSystemPath += g_strPath; HANDLE hSystemFile = CreateFileA(strSystemPath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); DWORD dwFileSize = GetFileSize(hSystemFile, NULL); //获得文件大小 //传入驱动文件路径,驱动基址,驱动大小,这里也不知道哪里用了pdb文件 DWORD64 dwBase = SymLoadModule64(hProcess, NULL,strSystemPath.c_str(), NULL,(DWORD64)g_BaseAddress , dwFileSize); //枚举所有的函数信息,在回调中显示 SymEnumSymbols(hProcess, dwBase, 0, EnumSymCallBack, this); SymUnloadModule64(hProcess, dwBase); SymCleanup(hProcess); }
BOOL CALLBACK EnumSymCallBack(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext) { //回调函数,我这里显示了所有的函数信息 }
下面是代码