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


layout: post
title: 关于C++名称修饰的解析
categories: C/C++
description: 关于C++名称修饰的解析
keywords: 名称修饰
url: https://lichao890427.github.io/ https://github.com/lichao890427/


  曾有人发过该功能代码,然而近日发现微软已经提供了专用API实现这一功能,而且比较复杂。该函数为UnDecorateSymbolName,为调试API之一,下面是测试用例:

#include <DbgHelp.h>  
#include <iostream>  
using namespace std;  
#pragma comment(lib,"Dbghelp.lib")  
   
void main()  
{  
    char str[100];  
    strcpy(str,"?getArgumentTypes@UnDecorator@@CG?AVDName@@XZ");  
    UnDecorateSymbolName(str,str,100,UNDNAME_COMPLETE);  
    cout<<str<<endl;  
} 

  为了了解该函数运作原理,我进行资料搜索和部分逆向工作,下面代码便是我的成果:

#include "undname.h"  
#include <iostream>  
using namespace std;  
   
HANDLE hHeap=NULL;  
   
void * AllocIt( size_t dwBytes)  
{  
    if(dwBytes == 0)  
        return NULL;  
    LPVOID lpMem=HeapAlloc(hHeap,HEAP_ZERO_MEMORY,dwBytes);  
    if(!lpMem)  
        SetLastError(ERROR_NOT_ENOUGH_MEMORY);  
    return lpMem;  
}  
   
void FreeIt(void* lpMem)  
{  
    if(lpMem)  
        HeapFree(hHeap,0,lpMem);  
}  
   
DWORD __stdcall MyUnDecorateSymbolName(  
    PCTSTR DecoratedName,//经过C++修饰的字符串  
    PTSTR UnDecoratedName,//去修饰的字符串  
    DWORD UndecoreatedLength,//修饰字符串长度  
    DWORD Flags)//去修饰标志位  
{  
    int retlen;  
   
    if(DecoratedName == NULL || UnDecoratedName == NULL || UndecoreatedLength < 2)  
    {  
        SetLastError(ERROR_INVALID_PARAMETER);  
        return 0;  
    }  
   
    retlen=0;  
    __try 
    {  
        if(unDName(UnDecoratedName,DecoratedName,UndecoreatedLength-1,AllocIt,FreeIt,(WORD)Flags))  
        {  
            retlen=strlen(UnDecoratedName);  
        }  
    }  
    __except(1)  
    {  
        if(retlen == 0)  
            SetLastError(ERROR_INVALID_PARAMETER);  
    }  
    return retlen;  
}  
   
void main()  
{  
    hHeap=HeapCreate(0,0x100000,0);  
    if(!hHeap)  
        return;  
   
    char str[100];  
    strcpy(str,"?getArgumentTypes@UnDecorator@@CG?AVDName@@XZ");  
    MyUnDecorateSymbolName(str,str,100,UNDNAME_COMPLETE);  
    cout<<str<<endl;  
   
    HeapDestroy(hHeap);  
} 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,831评论 25 709
  • 每天能吃到自己喜欢的食物,而且坚持自己亲自料理,再怎么粗茶淡饭也是一种简单的幸福。最近爱上了浓烈的味道,好怀念那个...
    凌霖阅读 222评论 1 1
  • 我半夜做了个恶梦!吓醒了!但是想想又不能说是恶梦!我嫁了一个比我又矮又丑的人!好像因为虽然他又矮又丑但是总以为人老...
    她和他_a7c7阅读 243评论 0 0
  • 以前感觉618是京东的,然而我感觉错了,618已然成为了一个年中大促节,连线下许多店都在搞618了。 说起618,...
    kelee阅读 331评论 0 0