Visual c++ 如何解码Visual C++;损坏修饰名称的方法参数?

Visual c++ 如何解码Visual C++;损坏修饰名称的方法参数?,visual-c++,Visual C++,给出以下导出名称示例: 0x00cf ?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z 0x0119 ?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z 0x014f ?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z 对于方法GetI、ParseTypeInformation、PyObject\u F

给出以下导出名称示例:

0x00cf ?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z
0x0119 ?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z
0x014f ?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z
对于方法GetIParseTypeInformationPyObject\u FromSTGMEDIUM,方法参数是什么

当前的解决方法是跳过对参数的解析,但是我有如下所示的不具信息性的漏洞:)

参考资料:

stdcall的形式为_name@xfastcall的形式是@name@x

解码参数的算法应该是什么样子?C#中的例子将非常棒

限制:PInvoke不可用。

请在anwser中给出上述示例的参数。 谢谢大家!

< P>是一篇文章,说明Visual C++使用的算法。

在您的情况下,我认为第一个功能是:

static ::IDispatch* PyIDispatch::GetI(::_object*);
但是,我没有访问Windows计算机进行测试的权限。

您可以使用该功能

不幸的是,pinvoke.net上还没有可用的p/invoke声明

尝试以下方法:

[DllImport("Dbghelp.dll", SetLastError = true)]
static extern uint UnDecorateSymbolName(string decorated, StringBuffer undecoratedBuffer, uint undecoratedBufferLength, uint flags);

从Visual Studio命令提示符运行undname.exe实用程序。使用“系统”菜单中的“编辑+粘贴”命令,以避免键入名称。样本输出:

C:\temp>undname ?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z"
is :- "public: static struct IDispatch * __cdecl PyIDispatch::GetI(struct _objec
t *)"

我实际上是在寻找实现。使用PInvoke直到它不可用。假设undname和Dbghelp.dll不可用。我正在寻找实际的实现。你必须闯入雷德蒙德某处的一个金库。只有编译器有足够的标识符信息来生成完整的名称。您能否扩展您的答案以包括查找答案所采取的步骤?非常感谢。我是按照我喜欢的语法手工做的(看起来已经过时了)。
C:\temp>undname ?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z"
is :- "public: static struct IDispatch * __cdecl PyIDispatch::GetI(struct _objec
t *)"