首页
社区
课程
招聘
[求助]枚举PDB符号的问题,有码
发表于: 2012-6-27 12:07 7517

[求助]枚举PDB符号的问题,有码

2012-6-27 12:07
7517
想枚举出PDB里的所有符号,并且区分出函数,变量,枚举等,但在实际枚举过程中,从SYMBOL_INFO里得到的TypeIndex,Flags,都是0,Tag也是一个固定值0xa,标红代码,不知道是不是函数参数设置有问题还是Options设置的有问题,有了解这方面的大牛帮忙看下,先谢过了
代码:

#include <windows.h>
#include <shlwapi.h>
#include <imagehlp.h>
#include "pdbpar.h"



int analyze_pdb_init(const char* symbolpath)
{
    unsigned long options;
    HANDLE proc;
    char search[512];

    if (PathFileExistsA("symsrv.yes") == FALSE)
    {
        FILE* file;

        file = fopen("symsrv.yes", "r");
        if (!file)
            file = fopen("symsrv.yes", "w+");

        fclose(file);
    }

[COLOR="red"]    options = SymGetOptions();[/COLOR]
    //options |= (SYMOPT_CASE_INSENSITIVE | SYMOPT_DEFERRED_LOADS | SYMOPT_UNDNAME);
    //options |= SYMOPT_DEBUG;
    //options &= ~SYMOPT_UNDNAME;
[COLOR="Red"]    options |= (SYMOPT_DEBUG | SYMOPT_LOAD_LINES | SYMOPT_FAIL_CRITICAL_ERRORS);
    options &= ~SYMOPT_DEFERRED_LOADS;
    SymSetOptions(options);[/COLOR]

    proc = GetCurrentProcess();
    if (SymInitialize(proc, NULL, FALSE) == 0)
        return -1;

    sprintf(search, SRV_PATH, symbolpath);

    SymSetSearchPath(proc, search);

    return 0;
}


int analyze_pdb_uninit()
{
    HANDLE proc;

    proc = GetCurrentProcess();
    SymCleanup(proc);

    return 0;
}


int analyze_pdb_file(const char* file, FUNCTION_NOTIFY notify, void* context)
{
    HANDLE proc;
    int st;
    DWORD64 BaseOfDll;
    PLOADED_IMAGE li;
    char SymFile[MAX_PATH] = { 0 };

    st = -1;
    BaseOfDll = 0;

    proc = GetCurrentProcess();

    li = ImageLoad(file, NULL);
    if (li == 0)
        return st;

    do {
        st = SymGetSymbolFile(proc,
                              NULL,
                              li->ModuleName,
                              sfPdb,
                              SymFile,
                              MAX_PATH,
                              SymFile,
                              MAX_PATH);
        if (st == 0)
        {
            st = -2;
            break;
        }

        BaseOfDll = SymLoadModule64(proc,
                                    li->hFile,
                                    li->ModuleName,
                                    NULL,
                                    (DWORD64)(li->MappedAddress),   // 0,
                                    li->SizeOfImage);
        if (BaseOfDll == 0)
        {
            st = -3;
            break;
        }

        st = SymEnumSymbols(proc, BaseOfDll, 0, EnumSymbolsCallback, notify);
        if (st == 0)
        {
            st = -4;
            break;
        }

        st = 0;
    } while (0);

    if (BaseOfDll)
    {
        SymUnloadModule64(proc, BaseOfDll);
    }

    if (li)
    {
        ImageUnload(li);
    }

    return st;
}


BOOL
CALLBACK
EnumSymbolsCallback(
    PSYMBOL_INFO SymInfo,
    ULONG SymbolSize,
    PVOID UserContext
    )
{
    HANDLE proc;
    DWORD SymTag;
    int st;

    proc = GetCurrentProcess();

    _dprintf(4, "[symbol] %d, %x :  %I64x (%x, %x) --> [ %x, %x, %x ] %s\n",
             SymInfo->Index,
             SymInfo->[COLOR="Red"]TypeIndex[/COLOR],
             SymInfo->Address,
             [COLOR="red"]SymbolSize[/COLOR],
             SymInfo->Size,
             SymInfo->[COLOR="red"]Flags[/COLOR],
             SymInfo->[COLOR="red"]Tag[/COLOR],
             SymInfo->[COLOR="red"]Scope[/COLOR],
             SymInfo->Name);

    st = SymGetTypeInfo(proc,
                        SymInfo->ModBase,
                        SymInfo->TypeIndex,
                        TI_GET_SYMTAG,
                        &SymTag);

    return TRUE;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 87
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
2012-6-28 09:14
0
雪    币: 87
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
up up
2012-6-29 09:44
0
雪    币: 326
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
帮顶,帮顶,帮顶
2012-7-3 09:25
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大虾解决下嘛。。。。。。。。
2012-7-5 20:30
0
雪    币: 154
活跃值: (560)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
参考windbg help 目录中sdk说明, 或者visual studio 目录下dia sdk
2012-7-5 23:58
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这玩意儿还真没写过,调试器研究贵哦一段时间,但是都没有解析符号表。
2012-7-9 08:33
0
游客
登录 | 注册 方可回帖
返回
//