我正在尝试在 .pdb 文件中查找特定函数。最初我编译了一个简单的“hello, world”程序,并使用 IDiaSymbol::get_name 方法分析了函数的名称,但我找不到我的函数。
在此之后,我尝试__declspec(naked) void myFunction(void){}
在我的 helloworld.pdb 文件中包含一个函数,以便使用 IDiaSymbol::get_isNaked 方法来定位我的函数,但是,当我这样做时,根本没有打印任何内容 - 意味着其中没有裸函数我的代码。
//After initialization, creating instance, etc
IDiaEnumSymbols* pUnknown = NULL;
if (pTable->QueryInterface(__uuidof(IDiaEnumSymbols), (void**) &pUnknown) == S_OK) {
printf("Supports Symbol module\n");
CComPtr<IDiaSymbol> pSymbol;
int counter = 0;
for (LONG i = 0; i < blongTableCount; i++)
{
if (pUnknown->Item(i, &pSymbol) != S_OK) {
fprintf(stderr, "Error: pUnknown->Item");
}
BOOL isFunction;
if (pSymbol->get_function(&isFunction) == S_OK) {
if (isFunction == TRUE) {
counter += 1;
printf("Number of functions: %d", counter);
//With the following I could not find my functions
BSTR symName;
if (pSymbol->get_name(&symName) == S_OK) {
printf("Name of symbol: %S\n", symName);
}
//Check for naked functions - I included a declspec(naked) function for testing.
BOOL pFlag;
if (pSymbol->get_isNaked(&pFlag) == S_OK) {
printf("This is a naked function");
}
}
}
pSymbol = NULL;
}
}
编辑:在下面包括我的简单 .pdb 程序(是一个“hello world 程序”,现在包含一个简单的 __declspec(naked) 函数):
#include <iostream>
__declspec(naked) void myFunction(void) {
__asm {
ret
}
}
int main()
{
myFunction();
return 0;
}
我对解析符号表的期望:在 *NIX 上解析 ELF 文件时会得到相同的结果 - 包含我为函数编写的实际名称的符号表,例如“.text myFunction”
实际打印出来的内容:许多 Winapi 函数和其他汇编程序创建的函数,可能是由于优化了我的函数。
例子:
符号名称:main
符号
名称:__acrt_thread_attach 符号
名称:_RTC_NumErrors 符号名称:ReadNoFence64
符号名称:__setusermatherr 符号名称:_RTC_SetErrorFuncW符号名称:IsProcessorFeaturePresent 符号
名称:GetLastError符号名称:__acrt_initialize