zoukankan      html  css  js  c++  java
  • 解析pdb文件得到未导出变量地址(转)

    程序要用到dbghelp.dll中的一些函数
    http://msdn.microsoft.com/en-us/library/ms679291%28VS.85%29.aspx
    要自己下载系统对应的符号文件

    首先是一些初始化的东西:
    设置符号选项,调用下面两个函数
       DWORD Options = SymGetOptions(); 
       Options = Options|SYMOPT_DEBUG;
       SymSetOptions(Options);

    调用SymInitialize函数进行初始化(这是必须的)
       hProcess = GetCurrentProcess();
       BOOL bRet = SymInitialize(hProcess,0,FALSE);
       if(!bRet)
       {
        printf("SymInitialize error ... ");
       }
    可以用函数SymSetSearchPath(hProcess,SymbolPath);设置符号搜索路径

    然后用SymLoadModule64加载模块,这里是ntoskrnl.exe
    char FileName[256] ;
    GetSystemDirectory(FileName,sizeof(FileName));
    strcat(FileName,"\ntoskrnl.exe");
    BaseOfDll = SymLoadModule64(hProcess,NULL,FileName,NULL,0,0);

    BaseOfDll
    返回加载的基址

    然后就可以调用SymEnumSymbols查询符号了
    SymEnumSymbols(hProcess,BaseOfDll,0,EnumSymCallBack,0);
    参数EnumSymCallBack是一个回调函数,在里面得到未导出函数的VA

    BOOL CALLBACK EnumSymCallBack(PSYMBOL_INFO pSymInfo,ULONG SymbolSize,PVOID UserContext)
    /*
      
    参数pSymInfo结构Name成员是符号名,Address是符号地址(The virtual address of the start of the symbol
    */

       if(strcmp((pSymInfo->Name), "PspCreateProcessNotifyRoutine")==0)
       {
        printf("Oh,yeah! %s :%0x ",pSymInfo->Name,pSymInfo->Address);
       }
       return TRUE;
    }



    完整代码: 
    [code]
    #include <stdio.h>
    #include <windows.h>
    #include "dbghelp.h"

    #pragma comment(lib,"dbghelp.lib")

    BOOL CALLBACK EnumSymCallBack(PSYMBOL_INFO pSymInfo,ULONG SymbolSize,PVOID UserContext);

    int main(int argc, char* argv[])
    {
    HANDLE hProcess;
    DWORD64 BaseOfDll;
    PIMAGEHLP_SYMBOL pSymbol = NULL;

    DWORD Options = SymGetOptions();

    Options = Options|SYMOPT_DEBUG;
    SymSetOptions(Options);

    hProcess = GetCurrentProcess();
    BOOL bRet = SymInitialize(hProcess,0,FALSE);
    if(!bRet)
    {
       printf("SymInitialize error ... ");
    }
    char SymbolPath[256];
    GetCurrentDirectory(sizeof(SymbolPath),SymbolPath);
    strcat(SymbolPath,"\symbols");
    SymSetSearchPath(hProcess,SymbolPath);

    char FileName[256] ;
    GetSystemDirectory(FileName,sizeof(FileName));
    strcat(FileName,"\ntoskrnl.exe");
    BaseOfDll = SymLoadModule64(hProcess,NULL,FileName,NULL,0,0);
    if(BaseOfDll == 0)
    {
       DWORD nErr = GetLastError();
    }
    SymEnumSymbols(hProcess,BaseOfDll,0,EnumSymCallBack,0);
    SymUnloadModule64(hProcess,BaseOfDll);
    SymCleanup(hProcess);
    for(;;);

    return 0;
    }

    BOOL CALLBACK EnumSymCallBack(PSYMBOL_INFO pSymInfo,ULONG SymbolSize,PVOID UserContext)

    if(strcmp((pSymInfo->Name), "PspCreateProcessNotifyRoutine")==0)
    {
       printf("Oh,yeah! %s :%0x ",pSymInfo->Name,pSymInfo->Address);
    }
    if(strcmp((pSymInfo->Name), "PspLoadImageNotifyRoutine")==0)
    {
       printf("Oh,yeah! %s :%0x ",pSymInfo->Name,pSymInfo->Address);
    }
    if(strcmp((pSymInfo->Name), "PspCreateThreadNotifyRoutine")==0)
    {
       printf("Oh,yeah! %s :%0x ",pSymInfo->Name,pSymInfo->Address);
    }
    if(strcmp((pSymInfo->Name), "CmpCallBackVector")==0)
    {
       printf("Oh,yeah! %s :%0x ",pSymInfo->Name,pSymInfo->Address);
    }
    if(strcmp((pSymInfo->Name), "KeBugCheckCallBackListHead")==0)
    {
       printf("Oh,yeah! %s :%0x ",pSymInfo->Name,pSymInfo->Address);
    }

    return TRUE;
    }

    jpg改rar 

  • 相关阅读:
    人脸识别总结(附开源项目代码与各大数据集下载路径)
    simpledet 的配置
    论文笔记--PCN:Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks
    smallcorgi/Faster-RCNN_TF训练自己的数据
    保存文件名至txt文件中,不含后缀
    训练 smallcorgi/Faster-RCNN_TF 模型(附ImageNet model百度云下载地址)
    调试 smallcorgi/Faster-RCNN_TF 的demo过程遇到的问题
    python字符串前缀和格式化
    摩斯电码与字母相互转换
    django配置mysql
  • 原文地址:https://www.cnblogs.com/kuangke/p/9397614.html
Copyright © 2011-2022 走看看