Деманглирование указанного символа c MSV C из двоичного файла с закрытым исходным кодом - PullRequest
0 голосов
/ 23 марта 2020

Преамбула

Я пишу код, который выгружает информацию о типах среды выполнения из двоичных файлов с закрытыми исходными кодами, используя структуры Microsoft C ++ RTTI. Во многих примерах, с которыми я столкнулся, я сталкиваюсь с определенным символом, который не разбирается, используя библиотеку demangle lib от Microsoft в DbgHelp.h

DWORD __stdcall UnDecorateSymbolName(PCSTR name, PSTR outputString, DWORD maxStringLength, DWORD flags)

В общем, я использую трюк, чтобы получить символы для декорирования в виде таблиц виртуальных функций. А именно удалив ".AV?" и заменив его на
"?? _ 7" -insertsymbol- "6B @", который работает для большинства символов, например

ORIGINAL SYMBOL FROM PROCESS MEMORY:
.?AV?$CUtlVector@DV?$CUtlMemory@D@@@@

MODIFIED SYMBOL:
??_7?$CUtlVector@DV?$CUtlMemory@D@@@@6B@

BECOMES:
const CUtlVector<char,class CUtlMemory<char> >::`vftable'

И это работает практически для всего.

Моя проблема

За исключением одного типа символа.
Вот несколько примеров

.?AV?$_Func_impl_no_alloc@P6AAAVCNullMetricsFactory@@XZAAVIMetricsFactory@@$$V@std@@
.?AV?$_Func_impl_no_alloc@V<lambda_b964aa0832b33143f93c0845c0cf1aac>@@X$$V@std@@
.?AV?$_Func_base@X$$$V@std@@
.?AV?$_Func_impl@U?$_Callable_obj@V<lambda_3820ce8ec0acf1c5550f74f5323b327d>@@$0A@@std@@U?$Allocator@X@?$SDDIRecorder@USResourceView_Gen8@ID3D10@@USUnorderedAccessView_Gen8@2@USShader_Gen8@2@@ID3D10@@X$$$V@std@@6B@

Я много экспериментировал при изменении символа в https://demangler.com/, но я не могу понять, как правильно деформировать этот символ даже при с помощью https://en.wikiversity.org/wiki/Visual_C%2B%2B_name_mangling
эти файлы есть в моих файлах журналов, но я просто не могу их решить. Тем временем я буду продолжать попытки, но помощь приветствуется, а также обратная связь по этому вопросу, если информация недостаточно детализирована.

C ++ фрагменты моего кода (я знаю, что это, вероятно, не самый лучший, но он работает в основном)

static const std::string VFTableSymStart = "??_7";
static const std::string VFTableSymEnd = "6B@";
constexpr auto MAX_BUFFER_LEN = 0x1000;

// Symbol Object automagically demangles symbol upon construction ->
bool Symbol::DemangleSymbol()
{
    {
        char demangleBuffer[MAX_BUFFER_LEN];
        memset(demangleBuffer, 0, MAX_BUFFER_LEN);
        char* pSymbol = this->rawSymbol;
        if (*(char*)(this->rawSymbol + 4) == '?') pSymbol = this->rawSymbol + 1;
        else if (*(char*)this->rawSymbol == '.') pSymbol = this->rawSymbol + 4;
        else if (*(char*)this->rawSymbol == '?') pSymbol = this->rawSymbol + 2;
        else {
            return false;
        }
        std::string ModifiedSymbol = std::string(pSymbol);
        ModifiedSymbol.insert(0, VFTableSymStart);
        ModifiedSymbol.insert(ModifiedSymbol.size(), VFTableSymEnd);
        if (!((UnDecorateSymbolName(ModifiedSymbol.c_str(), demangleBuffer, MAX_BUFFER_LEN, 0)) != 0))
        {
            this->symbolStr = std::string(this->rawSymbol);
            return false;
        }
        this->symbolStr = std::string(demangleBuffer);
        return true;
    }
}
...