0

我正在尝试在 .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


4

0 回答 0