我目前正在浏览 MSVC++2003 可执行文件中可用的 RTTI 信息(编写 IDAPython 脚本以重新创建类层次结构的结构)。显然,正如这里所看到的,RTTI 类型描述符存储类名称或它们的构造函数之类的内容:
.?AVexception@@
.?AUescaped_list_error@boost@@
.?AVruntime_error@stlp_std@@
但是,它采用了我还不认识的重整方案。该名称以 a 开头.
,根据此wiki,它甚至不是损坏的 MSVC 名称的有效开头。IDA 和在线名称 demangler也无法对这些名称进行 demangle。根据这些脚本(s. ms_rtti4.idc) 这些应该映射到:
typeid(struct exception)
typeid(struct boost::escaped_list_error)
typeid(struct stlp_std::runtime_error)
我尝试删除前导点以至少获得有效的开始,但它仍然无效。快速编写一个过于简单的 python 行来至少修复命名空间类名......
return "::".join(reversed(name[4:-2].split("@")))
...它当然会因泛型类型名称而失败,就像这里的这些类一样:
ns::FunctionBase (.?AVFunctionBase@ns@@)
ns::Z::P6AXPAX::?$FunctionT (.?AV?$FunctionT@P6AXPAX@Z@ns@@)
ns::Z::P6AHH::?$FunctionT (.?AV?$FunctionT@P6AHH@Z@ns@@)
ns::Z::P6AHPB_W::?$FunctionT (.?AV?$FunctionT@P6AHPB_W@Z@ns@@)
ns::Z::P6AHI::?$FunctionT (.?AV?$FunctionT@P6AHI@Z@ns@@)
我注意到从这些中删除.?AU
or.?AV
前缀会产生一些有用的结果(遗憾地缺少命名空间):
FunctionT@ns@@
FunctionT<void (__cdecl*)(void *)>
FunctionT<int (__cdecl*)(int)>
FunctionT<int (__cdecl*)(wchar_t const *)>
FunctionT<int (__cdecl*)(unsigned int)>
...但同样,现在这个名称不适用于非通用名称。
我想知道 RTTI 类型描述符名称方案是否已记录在案,或者是否有逻辑将其转换为实际的 RTTI 名称,我可以使用常用工具进行修改?