Преамбула
Я пишу код, который выгружает информацию о типах среды выполнения из двоичных файлов с закрытыми исходными кодами, используя структуры 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;
}
}