想象一下,您想要编写一个程序来测试 c++ dll 文件中的函数。
您应该允许用户选择一个 dll(我们假设我们正在讨论 c++ dll)。
他应该能够获得 dll 导出的所有函数的列表。
然后,用户应该能够从列表中选择一个函数名称,手动输入参数列表(参数都是基本类型,如 int、double、bool 或 char 数组(例如 c 类型字符串))并尝试使用指定的参数运行选定的函数。
他想知道该函数是否使用指定的参数运行,或者它们是否导致它崩溃(例如,因为它们与签名不匹配)。
主要问题是,C++ 作为一种强类型语言,要求您在编译时知道函数调用的参数的数量和类型。就我而言,我根本不知道这些参数是什么,直到用户在运行时选择它们。
我想出的唯一解决方案是使用程序集手动将参数推送到调用堆栈上。
然而,我开始明白,如果我想搞乱汇编,我最好确保我知道 dll 中的函数使用的是哪个调用约定。
所以(最后:)这是我的问题:我可以以编程方式推断出调用约定吗? Dependency Walker 不会帮助我,而且我不知道如何手动读取 PE 格式。
答案是maybe.
如果函数名称是 C++ 修饰的,那么您可以从名称修饰确定参数计数和类型,这是最好的情况,如果首先使用 MSVC 编写代码,则很有可能。
如果导出的函数是 stdcall 调用约定(Windows api 的默认设置),您可以确定要推送的字节数,但不能确定参数的类型。
坏消息是,对于 C 调用约定,没有任何方法可以通过查看符号名称来判断。您需要有权访问源代码或调试信息。
http://en.wikipedia.org/wiki/X86_calling_conventions http://en.wikipedia.org/wiki/X86_calling_conventions
函数作为导出给出的名称不是required与链接器看到的名称有任何关系,但大多数时候,导出的名称和链接器看到的符号名称是相同的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)