找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3022|回复: 1

关于C++名称修饰的解析

[复制链接]

307

主题

228

回帖

7345

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5595 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
发表于 2015-1-3 19:07:52 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
曾有人发过该功能代码,然而近日发现微软已经提供了专用API实现这一功能,而且比较复杂。该函数为UnDecorateSymbolName,为调试API之一,下面是测试用例:
  1. #include <windows.h>
  2. #include <DbgHelp.h>
  3. #include <iostream>
  4. using namespace std;
  5. #pragma comment(lib,"Dbghelp.lib")

  6. void main()
  7. {
  8.         char str[100];
  9.         strcpy(str,"?getArgumentTypes@UnDecorator@@CG?AVDName@@XZ");
  10.         UnDecorateSymbolName(str,str,100,UNDNAME_COMPLETE);
  11.         cout<<str<<endl;
  12. }
复制代码
为了了解该函数运作原理,我进行资料搜索和部分逆向工作,下面代码便是我的成果:
  1. #include <windows.h>
  2. #include "undname.h"
  3. #include <iostream>
  4. using namespace std;

  5. HANDLE hHeap=NULL;

  6. void * AllocIt( size_t dwBytes)
  7. {
  8.         if(dwBytes == 0)
  9.                 return NULL;
  10.         LPVOID lpMem=HeapAlloc(hHeap,HEAP_ZERO_MEMORY,dwBytes);
  11.         if(!lpMem)
  12.                 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
  13.         return lpMem;
  14. }

  15. void FreeIt(void* lpMem)
  16. {
  17.         if(lpMem)
  18.                 HeapFree(hHeap,0,lpMem);
  19. }

  20. DWORD __stdcall MyUnDecorateSymbolName(
  21.         PCTSTR DecoratedName,//经过C++修饰的字符串
  22.         PTSTR UnDecoratedName,//去修饰的字符串
  23.         DWORD UndecoreatedLength,//修饰字符串长度
  24.         DWORD Flags)//去修饰标志位
  25. {
  26.         int retlen;

  27.         if(DecoratedName == NULL || UnDecoratedName == NULL || UndecoreatedLength < 2)
  28.         {
  29.                 SetLastError(ERROR_INVALID_PARAMETER);
  30.                 return 0;
  31.         }

  32.         retlen=0;
  33.         __try
  34.         {
  35.                 if(unDName(UnDecoratedName,DecoratedName,UndecoreatedLength-1,AllocIt,FreeIt,(WORD)Flags))
  36.                 {
  37.                         retlen=strlen(UnDecoratedName);
  38.                 }
  39.         }
  40.         __except(1)
  41.         {
  42.                 if(retlen == 0)
  43.                         SetLastError(ERROR_INVALID_PARAMETER);
  44.         }
  45.         return retlen;
  46. }

  47. void main()
  48. {
  49.         hHeap=HeapCreate(0,0x100000,0);
  50.         if(!hHeap)
  51.                 return;

  52.         char str[100];
  53.         strcpy(str,"?getArgumentTypes@UnDecorator@@CG?AVDName@@XZ");
  54.         MyUnDecorateSymbolName(str,str,100,UNDNAME_COMPLETE);
  55.         cout<<str<<endl;

  56.         HeapDestroy(hHeap);
  57. }
复制代码
运行结果:private: static class DName  __stdcall UnDecorator::getArgumentTypes(void)

你会用到的工程文件,均出自W2K源码:
undname.cxx       
undname.h
undname.hxx
undname.inl
由于总共5000+代码较多,因此后面有时间我会做详细解释
回复

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24261 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2015-1-4 02:08:28 | 显示全部楼层
你让我想起了之前我们吵架的内容。。。好吧看来还是不提黑历史的好
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-29 21:58 , Processed in 0.039638 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表