显示EXEDLL或PDB文件中指定函数的Parameter和local variables信息

RFdiffusion pdb文件处理函数 函数,用于读取 PDB 文件并提取特征。主要处理步骤包括解析 PDB 文件、零中心化、生成 27 原子表示等。 阅读详情
//============================================================================
// LFVars : A small tool used to display function symbol informaton from EXE, DLL or PDB files
//         L(ist)F(untion)Vars: list function parameters and local variabls.
// Author : zyq654321 --- Oct, 2004
// Comment: This is only a sample code to show you how to dump symbol information,
//          you can improve it and your advise is appreciated.
#include <windows.h>
#include <TCHAR.h>
#define _NO_CVCONST_H // We should define the constant in order to ...
#include <dbghelp.h>
#include <stdio.h>
 
#pragma comment( lib, "dbghelp.lib" )
 
BOOL CALLBACK LFVarsCallback( SYMBOL_INFO* pSymInfo, ULONG SymbolSize, PVOID UserContext )
{   
     if( pSymInfo != 0 )
     {
         // Increase the counter of found local variables and parameters
         if( UserContext != 0 )
              *(int*)UserContext += 1;
         // list parameters or variables
         _tprintf(_T("Name: %s /n"),pSymInfo->Name);
         _tprintf(_T("    Type: %s   "),
                        (pSymInfo->Flags & SYMFLAG_PARAMETER) ? "Function Parameter" :
                        ( (pSymInfo->Flags & SYMFLAG_LOCAL)? "Local Variable": "Unknown"));
         TCHAR tcsReg[10];
         switch(pSymInfo->Register)
         {
         case 17:
              _tcscpy(tcsReg,_T("[EAX]"));
              break;
         case 18:
              _tcscpy(tcsReg,_T("[ECX]"));
              break;
         case 19:
              _tcscpy(tcsReg,_T("[EDX]"));
              break;
         case 20:
              _tcscpy(tcsReg,_T("[EBX]"));
              break;
         case 21:
              _tcscpy(tcsReg,_T("[ESP]"));
              break;
         case 22:
              _tcscpy(tcsReg,_T("[EBP]"));
              break;
         case 23:
              _tcscpy(tcsReg,_T("[ESI]"));
              break;
         case 24:
              _tcscpy(tcsReg,_T("[EDI]"));
              break;
         default:
              _tcscpy(tcsReg,_T("Unknown"));
              break;
         }
         _tprintf( _T("Register: %s "), tcsReg );
         UINT uMax = 0xFFFFFFFF;
         _tprintf( _T("Address(Offset): %c0x%X   "),
                    (LONG)pSymInfo->Address >= 0? ' ' : '-',
                   (LONG)pSymInfo->Address >= 0? pSymInfo->Address : (uMax - pSymInfo->Address + 1));
         _tprintf( _T("Size: %d /n"), pSymInfo->Size);
 
         //ShowSymbolDetails( *pSymInfo );
     }
 
     return TRUE; // Continue enumeration
}
 
int main( int argc, const TCHAR* argv[] )
{
     if(argc < 3)
     {
        goto FAILED_PARAM;
     }
 
     // Set debug options
     DWORD dwOpn = SymGetOptions();
     dwOpn |= SYMOPT_DEBUG;
     SymSetOptions(dwOpn);
 
     // Initilaize the symbol handle for the current process
     if(!SymInitialize( GetCurrentProcess(), 
                                    NULL,                
                               FALSE ))  
     {
         _tprintf(_T("Failed when SymInitialize():%d/n"), GetLastError());
         return 0;
     }
 
     if( argv[1] == NULL || argv[2] == NULL)
     {
         goto FAILED_PARAM;
     }
 
     //------------------------------------------------------------------------
     // Set initial parameters
     TCHAR pszExt[MAX_PATH];
     _tsplitpath( argv[1], NULL, NULL, NULL, pszExt );
     DWORD64 dw64Base     = 0; // if the image is a .pdb file, dw64Base cannot be zero.
                               // if the value is zero, the library obtains the load address
                               // from the symbol file.
     DWORD   dwFileSize = 0; // if the image is a .pdb file, dwFileSize cannot be zero.
                                  // if the value is zero, the library obtains the size
                               // from the symbol file.
 
     _tcslwr(pszExt);
     if(_tcsicmp(pszExt, _T(".pdb")) == 0)
     {
         // this is a .pdb file, and so we should set the load address and file size;
         dw64Base = 0x10000000;
         // get the file size
         HANDLE hFile = CreateFile( argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
         if( INVALID_HANDLE_VALUE == hFile )
         {
              _tprintf(_T("Failed when open %s: %d"), argv[1], GetLastError());
              goto FAILED_PARAM;
         }
         if( INVALID_FILE_SIZE == ( dwFileSize = GetFileSize(hFile, NULL) ))
         {
              _tprintf(_T("Failed when read the size of %s: %d"), argv[1], GetLastError());
              goto FAILED_PARAM;
         }
         CloseHandle(hFile);
     }
 
     //------------------------------------------------------------------------
     // Load symbol table
     _tprintf(_T("Load %s...../n"), argv[1]);
     DWORD64 dw64ModAddress = SymLoadModule64( GetCurrentProcess(),
                                                     NULL,              
                                                    argv[1],          
                                                    NULL,              
                                                    dw64Base,         
                                                    dwFileSize);
 
     if( dw64ModAddress == 0 )
     {
         _tprintf(_T("Failed when SymLoadModule64(): %d /n"), GetLastError());
         return 0;
     }
     _tprintf(_T("Load Address: %I64x /n"), dw64ModAddress);
 
     //------------------------------------------------------------------------
     // Display the function parameters and local variables according to the
     // specified function name.
     SYMBOL_INFO symInfo;
     symInfo.SizeOfStruct = sizeof(SYMBOL_INFO);   
     if(! SymFromName( GetCurrentProcess(),
                        argv[2],           
                        &symInfo) )
     {
         _tprintf( _T("Failed When SymFromName(): %d /n"), GetLastError() );
         goto FAILED_AFTER_LOAD;
     }
 
     // We only need functon symbol
     if( symInfo.Tag != SymTagFunction )
     {
         _tprintf( _T("Invalid Function Name or Not Found./n") );
         goto FAILED_AFTER_LOAD;
     }
 
     // List funtion's parameters and its local variables
     IMAGEHLP_STACK_FRAME stackFrm;
     stackFrm.InstructionOffset = symInfo.Address;
     if(!SymSetContext( GetCurrentProcess(),
                         &stackFrm,                
                         0 ))
     {
         _tprintf( _T("Failed when SymSetContext: %d /n"), GetLastError() );
         goto FAILED_AFTER_LOAD;
     }
 
     int nVarsCnt = 0;
     if(!SymEnumSymbols( GetCurrentProcess(),
                            0,                  
                            0,                  
                            LFVarsCallback, 
                            &nVarsCnt ) )
     {
         _tprintf( _T("Failed when SymEnumSymbols(): %d /n"), GetLastError() );
         goto FAILED_AFTER_LOAD; 
     }
 
     _tprintf( _T("%d function parmeters and local variables had been listed./n"), nVarsCnt );   
 
 
FAILED_AFTER_LOAD:
     //------------------------------------------------------------------------
     // Unload symbols table
     if(!SymUnloadModule64( GetCurrentProcess(), dw64ModAddress ))       
     {
         _tprintf( _T("Failed when SymUnloadModule64() : %d /n"), GetLastError() );
     }
 
     if(!SymCleanup(GetCurrentProcess()))
     {
         _tprintf(_T("Failed when SymCleanup(): %d /n"), GetLastError());
         return 0;
     }
 
 
     return 0;
 
FAILED_PARAM:
     _tprintf(_T("Failed Parameter!/n"));
     _tprintf(_T("Usage: LFVars -filename -function_name/n"));
     _tprintf(_T("filename: a EXE, DLL or PDB file/n"));
     return 0;
}
 
“PDB是什么文件? C#“ - 解析PDB文件以获取调试信息 在C#中,PDB文件包含与源代码编译后的可执行文件(如DLL或EXE)关联的调试信息。本文将详细介绍PDB文件的作用、如何生成PDB文件以及如何使用它们来调试C#代码。PDB文件是用于存储C#可执行文件的调试信息的文件格式。熟练使用PDB文件和调试器是成为一名高效的C#开发人员的重要技能之一。PDB文件包含了与源代码对应的调试符号信息,这些信息可以帮助开发人员在调试过程中定位和修复错误。在C#中,生成PDB文件的方式取决于使用的编译器和设置。一旦生成了PDB文件,就可以在调试过程中使用它来定位和修复错误。 阅读详情

相关推荐

是否可以从使用dbghelp库获得的地址中读取值并将其写入地址

我有一种情况是,我使用dbghelp库获取变量的地址。我先加载符号,然后使用SymFromName获取变量的地址。现在我有一个独立运行的exe,其中我必须设置变量的值我可以设置并获取...的值吗?

显示EXE,DLL或PDB文件中指定函数的Parameter和local variables信息

源码例子:显示EXE,DLL或PDB文件中指定函数的Parameter和local variables信息        上次写了列出EXE,DLL或PDB文件中的符号信息,这次再贴一段代码。举例说明如何列举一指定函数的局部信息,即函数的参数和局部变量信息。呵呵,本人即不爱说废话,又怕打字太累。^_^,开门见山,来看下面代码吧。Enjoy!//=====================

eaglenet的专栏 2343

两路半桥LLC谐振变换器软开关Simulink仿真(模拟谐振参数不同、分裂电容)

内容概要:本文介绍了“两路半桥LLC谐振变换器软开关Simulink仿真”资源包,重点在于基于Simulink平台对两路半桥LLC谐振变换器进行高精度建模与动态仿真,特别考虑了谐振参数不一致及分裂电容等非理想工况对系统性能的影响。该仿真模型不仅涵盖了主电路拓扑、软开关实现机制与谐振网络设计,还深入分析了不同参数配置下系统的启动特性、稳态效率、动态响应及软开关条件的满足情况。通过参数扫描与对比仿真,帮助用户掌握LLC变换器的关键设计要素与优化方法,具备较强的工程指导价值和科研教学意义。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事高频开关电源、新能源变换器、车载充电机等领域的研发工程师和技术人员。; 使用场景及目标:① 掌握两路并联半桥LLC谐振变换器的建模与仿真方法;② 理解软开关技术在提升变换器效率与降低EMI方面的关键作用;③ 分析谐振参数偏差与分裂电容结构对系统均流特性、增益曲线及软开关范围的影响;④ 支持科研项目中的拓扑验证、控制策略开发与故障工况分析; 阅读建议:建议结合Simulink仿真模型与配套说明文档进行学习,重点关注谐振腔参数设置、驱动时序设计及软开关波形观测;可通过调整谐振电感、电容值或引入参数失配,观察系统行为变化,深入理解LLC变换器的稳定边界与优化设计原则。

STM32驱动四位共阳极数码管实现高精度秒表计时器

本文详细介绍了如何使用STM32驱动四位共阳极数码管实现高精度秒表计时器。项目基于STM32F103C8T6最小系统板,通过定时器中断和GPIO控制,实现0.1秒精度的计时功能,并解析了共阳极数码管的动态扫描原理及按键消抖等关键技术。

n8m7b6v5c4的博客 951

PaddleOCR训练自己的数据

一 、数据准备 采用PPOCRLabel标注自己的数据 PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,内置PP-OCR模型对数据自动标注和重新识别。使用Python3和PyQT5编写,支持矩形框标注和四点标注模式,导出格式可直接用于PaddleOCR检测和识别模型的训练。 1.1 安装PaddlePaddle pip3 install --upgrade pip # 如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装 python3 -m pip in.

zyb的博客 1万+

KEIL5软件实现查看各个模块的寄存器

下图为:Debug选项中Dialog DLL和Parameter默认设置。

weixin_75034744的博客 1816

用AI从0开始量化交易-制定学习计划安装学习环境

量化小白,利用AI从零开始学量化

weixin_52285994的博客 2113

通过符号文件获取函数地址

//通过符号文件获取函数地址 #include #include #include #include #include "ntdll.h" #pragma comment(lib,"dbghelp.lib") //获取函数地址PDB ULONG_PTR GetFunctionAddressPDB(HMODULE hMod, const WCHAR * szApiName) {

125096 3645

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 780

量化 insider 爆料! 散户打板必亏?(打板必看!量化资金如何“隔日砸盘”收割散户)

量化开发 insider 爆料💥 散户追的涨停板📉,可能是机构故意做的陷阱!本文从技术视角拆解“涨停陷阱”,帮你看清市场真实逻辑🧠。

XiaoqiangClub的博客 459

PDB文件详解

PDB文件的介绍 PDB(Program Data Base),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。 PDB文件的调用过程 模块(Module),EXE和DLL...

weixin_30802171的博客 4749

基于Simulink的压缩空气储能(Compressed Air Energy Storage, CAES)

压缩空气储能(CAES)是一种将电能转化为压缩空气存储在高压容器中,然后在需要时释放空气驱动涡轮机发电的技术。它具有大规模、长寿命和环境友好的特点,在电力系统中用于削峰填谷、频率调节和备用电源等应用。本项目将详细介绍如何在MATLAB/Simulink中搭建一个完整的基于压缩空气储能的系统,并提供具体的代码实现和设计步骤。如果你需要实现更复杂的控制逻辑,可以使用MATLAB Function模块。以下是一个简单的例子,展示了如何在该模块中实现一个条件逻辑:Matlab深色版本Kp = 1;

MHD0815的博客 1276

warning LNK4099 未找到 PDB“vc90.pdb”……

帖子链接: http://topic.youkuaiyun.com/u/20070604/11/7dfb11ac-768f-4049-b75e-8dc572e77c9d.html 警告: Linking with DDK linker... libcid.lib(streamb.obj) : warning LNK4099: PDB 'libcid.pdb' was not found with 'D:/Program Files/WINDDK/2600/lib/wxp/i386/libcid.lib' or

Nicole的成长 5128

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

PDB 文件

PDB 文件 什么是 PDB 文件 PDB (Program Data Base) 即程序的基本数据,是 VS 编译链接时生成的文件,每个程序集(EXE 或 DLL)都有一个与之对应的 PDB 文件。DPB 文件主要存储了 VS 调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、对应的行号等等。因为存储的是调试信息,所以一般情况下 PDB 文件是在 Debug 模式下才会生成。...

Iron 的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

利用PDB文件获取未导出全局变量、函数等信息

方法来源于对Sysinternals的procexp的逆向。 在通过kernel的pdb获取未导出的MmSizeOfPagedPoolInBytes和MmMaximumNonPagedPoolInBytes时,procexp执行了如下几个步骤: 1. 获取kernel的映像文件名称     调用IsProcessorFeaturePresent判断PAE是否开启,以确定使用ntoskrn

0xC0000005 2365

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

偶识PDB文件

作为一名小白,我也是在遇到问题的时候才了解到了PDB文件。就是在一次重装系统后,我执行代码的时候出错了,告诉我无法打开PDB文件。 最后发现了是在编译的时候,程序所依赖的动态链接库也会被编译,编译过程中每个 dll 都会产生一个pdb文件,又称为“符号文件”,是一个存储数据的信息文件,其包含 dll 库在编译过程的某些调试信息,例如程序中所用到的全局变量、局部变量、函数名以及他们的入口地址等动态库无法找到PDB文件。所以就出现找不到PDB文件的问题。最后我通过在网上寻求帮助,找了 打开VS2013,点击菜

wnx_hh的博客 408

DLL调试方法

一、DLL调试方法:   (1)、 打开DLL所在的工程,选择run->parameters,在Host Application中选择调用DLL的EXE文件。单击【OK】   (2)、按ctrl+alt+m打开modules,右键Add Module选择EXE调用的DLL所在路径,运行DLL的工程,按ctrl+alt+m,选择DLL,右键单击Reload Symbol Table,在DLL

988

c++ 调试跳出子函数_Python使用pdb更优雅的调试代码

什么是pdb不知道大家在用Python写代码出现报错时是怎样调试的,从报错提示定位回去一步一步check每一行?如果没有IDE或者命令行写代码时又该怎样快速调试?这时如果使用pdb进行调试将会异常方便。Pdb就是Python debugger ,是python自带的调试器。通过 pdb 我们可以交互式的查看运行过程中变量的值、设置断点、逐行执行代码、查看代码的调用栈等等。并且如果环境没有...

weixin_35659005的博客 659

保留PDB,节省调试耗时

转自:http://blog.163.com/hao_dsliu/blog/static/131578908201411314610310/ 我们在解决Bug的时候经常遇到一些难重现的Bug。例如偶尔崩溃的问题,如果错失现场,也许花几天时间也难重现,最后不了了之。在发布后,可能在客户那里重新出现,这种Bug很让人懊恼。 如果我们能掌握一些Release模式下的调试技巧,事情

Adam040606的博客 1490

学习自建调试体系(二)

目录 获取模块信息 NtQuerySystemInformation RtlMoveMemory 枚举符号 SymInitialize SymLoadModule64 SymEnumSymbolsW 回调函数Enum...

weixin_30553837的博客 714

简单地使用sym*函数族导出函数栈(Based on x86)

在有时我们需要导致当前线程的函数栈调用,但是我们又不期望自己来实现这个功能,下面的源代码可以帮你解决。 导出函数栈其实就是sym*函数族的应用,该函数在dbghelp.dll中的,下面只是实现了简单的用法,使用的缺省的符号搜索路径,没有设置用户自定义的搜索路径: 这样有两方面的考虑:  1. 这不是一个GUI程序,不想让使用者觉得麻烦,这里更合适的说法是提供了一个函数供用户调用。 2.一般

申晓龙的专栏 1594
上一篇: MS Internet Explorer 6/7 (XML Core Services) Remote Code Exec Exploit 2
下一篇: PE 结构分析技术在反病毒中的应用
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值