在之前的一篇文章《PE文件格式的一些研究
》我简单谈了PE文件格式的基本机构。在文章的最后我提到由于C++的命名空间和虚函数的影响,编译器对C++库的导出函数进行了名称修饰。
今晚简单研究了一下如何把这个名称修饰去掉,还原函数的真实名称。对于VC编译器编译出来的DLL,微软提供了一个函数UnDecorateSymbolName(在Dbghelp.lib,使用时需要添加该库)来将修饰后的函数名称转换为函数签名(注意这里的函数签名不能简单认为是函数原本的名字,函数签名等于函数所在的命名空间加函数所在类再加函数名字)。UnDecorateSymbolName的原型如下(据Imagehlp.h):
Name -- 待转换的函数名
outputString -- 转换后函数签名的输出字符串
maxStringLength -- 输出字符串的缓冲区大小
flags -- 转换符号,0表示完全转换
VS 2008+ sp1对应的MSDN对这个函数的解释有差错,VS 2008+ sp1对应的MSDN上的UnDecorateSymbolName第一个参数是__in PCTSTR DecoratedName,这意味着这个函数可以处理unicode字符串。实际上我在VS2005(带sp1)和VS2008(带sp1)上测试,UnDecorateSymbolName的第一个参数的类型应为PCSTR,就是说它只能处理多字节字符串。
UnDecorateSymbolName基本用法如下:
测试了一下,basic_ostream的成员函数flush的修饰名为?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ,函数签名为public: class std::basic_ostream<char,struct std::char_traits<char> > &
__thiscall std::basic_ostream<char,struct std::char_traits<char> >::flush(void),
真够复杂的。值得注意的是该函数只能还原VC编译的pe文件的函数修饰,因为不同编译器的函数修饰法则并不相同。
参考文献:
1. 《程序员的自我修养--链接、装载与库》,俞甲子、石凡、潘爱民等
分享到:
相关推荐
查看PE文件导出的函数,很好用.图形界面,功能单一,但是很实用!
获取PE文件的导出函数列表,提供代码。PE文件是windows的下的文件格式
大部分人通过pNTHeader.OptionalHeader.DataDirectory[0].VirtualAddress获取导出函数,但不少DLL需要重新计算偏移,本例通过暴力搜索Section,避免某些情况下读取失败
查看PE文件中,导入的函数(VC++源码).
函数调用方式决定了函数参数入栈的顺序,是由调用者函数还是被调用函数负责清除栈中的参数等问题,而函数名修饰规则决定了编译器使用何种名字修饰方式来区分不同的函数,如果函数之间的调用约定不匹配或者名字修饰不...
应用WinAPI函数修饰程序窗体实例
众所周知,PE文件格式是Windows平台下可执行文件的格式。为什么要研究PE文件格式?可能有人认为,做这件事就是一件重复造轮子的事,因为之前已经有无数人做过这样的事。但是有些事不是简单地以是不是重复造轮子来...
文件操作函数大全文件操作函数大全文件操作函数大全文件操作函数大全文件操作函数大全文件操作函数大全文件操作函数大全文件操作函数大全
主要介绍了python函数修饰符@的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
VC手动解析PE文件调用DLL函数(资源+文件) 详情http://blog.csdn.net/wangningyu/article/details/8716586
这个相对简单些,在PE文件头部分,IMAGE_OPTION_HEADER中有个ImportAddress目录,这个目录中只是一些jmp指令,我们可以修改jmp指令跳转的地址,使其指向在PE文件中我们新增加的代码。这需要在原PE文件中增加代码,PE...
为了获得PE 文件中所包含的重要信息, 我编写了一个名为PEFILE.DLL 的动态链 接库, 本文中所有出现的源码示例亦均摘自于此。这个DLL 和它的源代码都作为PEFile 示例程序的一部分包含在了CD 中( 译注:示例程序请在...
DLL查看器,dll文件导出函数查看,便于查看DLL文件中的函数名
JIURL PE 格式学习总结(三)-- PE文件中的输入函数
JIURL PE 格式学习总结(二)-- PE文件中的输出函数
C文件操作函数C文件操作函数文件操作函数
讲叙在嵌入式系统中,在c文件中如何调用c++文件中的函数的方法,并且还着重讲叙了c++文件中编写可以被c文件中调用函数的规则及方法。
pb函数库之文件操作函数 FileClose() FileDelete() FileExists() FileOpen() ...
PE 文件解析,解析汇编代码的流程图,直线,分支,循环
应用WinAPI函数修饰程序窗体实例