我可以以编程方式推断出C++ DLL使用的调用约定吗?

Emi*_*l D 5 c++ dll assembly calling-convention name-decoration

想象一下,你想编写一个在c ++ dll文件中测试函数的程序.您应该让用户选择一个DLL(我们假设我们正在谈论c ++ dll).他应该能够获得由dll导出的所有函数的列表.然后,用户应该能够从列表中选择一个函数名,手动输入一个参数列表(参数都是基本类型,如int,double,bool或char数组(例如c-type字符串))并尝试使用指定的参数运行所选函数.他想知道函数是否使用指定的参数运行,或者是否导致它崩溃(因为它们与签名不匹配).

主要问题是C++是一种强类型语言,需要你在编译时知道函数调用的参数的数量和类型.在我的例子中,我根本不知道这些参数是什么,直到用户在运行时选择它们.

我想出的唯一解决方案是使用程序集手动推送调用堆栈上的参数.

但是,我已经明白,如果我想搞乱程序集,我最好确定我知道哪个调用约定是dll中使用的函数.

所以(最后:)这是我的问题:我可以推断出programmaticaly的调用约定吗?Dependency Walker不会帮助我,我也不知道如何手动读取PE格式.

Joh*_*ler 3

答案是也许

如果函数名称是 C++ 修饰的,那么您可以从名称修饰中确定参数计数和类型,这是最好的情况,如果首先使用 MSVC 编写代码,则很有可能。

如果导出的函数是 stdcall 调用约定(Windows api 的默认设置),您可以确定要推送的字节数,但不能确定参数的类型。

坏消息是,对于 C 调用约定,没有任何方法可以通过查看符号名称来判断。您需要有权访问源代码或调试信息。

http://en.wikipedia.org/wiki/X86_calling_conventions

作为导出给出的函数名称不需要链接器看到的名称有任何关系,但大多数时候,导出的名称和链接器看到的符号名称是相同的。