解析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 ...\n");
    }
 可以用函数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\n",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 ...\n");
 }
 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\n",pSymInfo->Name,pSymInfo->Address);
 }
 if(strcmp((pSymInfo->Name), "PspLoadImageNotifyRoutine")==0)
 {
    printf("Oh,yeah! %s :%0x\n",pSymInfo->Name,pSymInfo->Address);
 }
 if(strcmp((pSymInfo->Name), "PspCreateThreadNotifyRoutine")==0)
 {
    printf("Oh,yeah! %s :%0x\n",pSymInfo->Name,pSymInfo->Address);
 }
 if(strcmp((pSymInfo->Name), "CmpCallBackVector")==0)
 {
    printf("Oh,yeah! %s :%0x\n",pSymInfo->Name,pSymInfo->Address);
 }
 if(strcmp((pSymInfo->Name), "KeBugCheckCallBackListHead")==0)
 {
    printf("Oh,yeah! %s :%0x\n",pSymInfo->Name,pSymInfo->Address);
 }
return TRUE;
 }
jpg改rar 
解析pdb文件得到未导出变量地址(转)的更多相关文章
- 在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里
		这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件. 1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xm ... 
- 命令行解析Crash文件
		做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友 ... 
- 命令行工具解析Crash文件,dSYM文件进行符号化
		备份 文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ... 
- 告别硬编码-发个获取未导出函数地址的Dll及源码
		还在为找内核未导出函数地址而苦恼嘛? 还在为硬编码通用性差而不爽吗? 还在为暴搜内核老蓝屏而痛苦吗? 请看这里: 最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的 ... 
- 使用Windbg解析dump文件
		WinDbg OllyDbg SoftICE (已经停止更新) 虽说WinDbg在无源码调试方面确实比较困难,但在调试内核方面却真的有独到之处. https://www.pediy.com/kssd/ ... 
- [Docker核心之容器、数据库文件的导入导出、容器镜像的导入导出]
		[Docker核心之容器.数据库文件的导入导出] 使用 Docker 容器 在 Docker 中,真正对外提供服务的还是容器,容器是对外提供服务的实例,容器的本质是进程. 运行一个容器 docker ... 
- 驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead
		PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其Act ... 
- PDB文件:每个开发人员都必须知道的
		PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05 ... 
- dll的概念 dll导出变量 函数 类
		1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接 ... 
随机推荐
- (笔记)Mysql命令use:使用数据库
			use命令可以让我们来使用数据库. use命令格式: use <数据库名>; 例如,如果xhkdb数据库存在,尝试存取它: mysql> use xhkdb;屏幕提示:Datab ... 
- 了解VIM的寄存器
			VIM下的删除:delete; 复制:yank; 粘帖:put; 都会用到VIM下的相关寄存器,今天就说说这个寄存器的问题: VIM中有多种寄存器:包括: 有名寄存器,用名字("a-&quo ... 
- OpenStack配置解析库oslo.config的使用方法
			OpenStack的oslo项目旨在独立出系统中可重用的基础功能,oslo.config就是其中一个被广泛使用的库,该项工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf ... 
- MyMVC配置
			<system.webServer> <validation validateIntegratedModeConfiguration="false"/> & ... 
- Vue中计算属性与class,style绑定
			var vm=new Vue({ el:'#app', data:{ a:2, }, computed:{ //这里的b是计算属性:默认getter b:{ get:function(){ retur ... 
- greenplum日常维护手册
			1. 数据库启动:gpstart 常用可选参数: -a : 直接启动,不提示终端用户输入确认 -m:只启动master 实例,主要在故障处理时使用 2. 数据库停止:gpsto ... 
- webpack学习简单总结
			webpack使用总结: 入门使用: 这个报错说明需要安装相应的Loader,并在引用时指定相应的loader 执行成功如图: chunk指相应的区块. 要是css引入正确:必须引入css-loade ... 
- (Dos)/BAT命令入门与高级技巧详解(转)
			目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1.REM 和 :: 2.ECHO 和 @ 3.PAUSE 4.ERRORLEVEL 5.TITLE 6.COLOR 7.mode 配置系统设 ... 
- 用FileExplorer查看android手机中的数据库
			想查看一下手机中的通讯录数据库,google之后找到了办法. 参考: http://stackoverflow.com/questions/4867379/android-eclipse-ddms-c ... 
- docker开启api端口,docker启用加速
			此篇是针对centos6的docker,注意ubantu和centos7的会有区别. 需要在docker配置文件中修改信息 centos中是这个文件 /etc/sysconfig/docker,Ubu ... 
