在没有标题的情况下调用c ++ dll中的函数

mil*_*het 14 c++ dll signature method-signature dumpbin

我想从一个DLL调用一个方法,但我没有源文件头文件.我试图使用dumpbin/exports来查看方法的名称,但我可以找到方法签名?

有没有办法调用这种方法?

谢谢,

zda*_*dan 10

如果函数是C++函数,则可以从损坏的名称派生函数签名.Dependency Walker是一个可以为您完成此任务的工具.但是,如果DLL是使用C链接创建的(Dependency Walker会告诉你),那么你就不走运了.


dir*_*tly 6

C++语言对dll一无所知.

这是在Windows上吗?一种方法是:

  • depends.exe随附(Visual Studio)打开dll
  • 验证要调用的函数的签名
  • 使用LoadLibrary()得到加载这个DLL(小心的路径)
  • 用于GetProcAddress()获取指向要调用的函数的指针
  • 使用此指针到函数来使用有效参数进行调用
  • 使用FreeLibrary()以释放手柄

BTW:此方法通常也称为运行时动态链接,而不是编译时动态链接,您可以使用关联lib文件编译源.

*nixes有一些类似的机制dlopen,但之后我的记忆开始失败.有些东西叫objdumpnm应该让你开始检查功能.


小智 5

如您所见,DLL中的导出列表仅存储名称,而不存储签名.如果您的DLL导出C函数,您可能必须对这些函数进行反汇编和反向工程以确定方法签名.但是,C++会对导出名称中的方法签名进行编码.将方法名称和签名组合在一起的过程称为"名称重整". 此Stackoverflow问题有一个参考,用于从损坏的导出名称确定方法签名.

尝试免费的"Dependency Walker"(又名"依赖")实用程序."Undecorate C++ Functions"选项应确定C++方法的签名.


小智 4

通过分析反汇编的开头可以找出 C 函数签名。函数参数将位于堆栈上,函数将执行一些“弹出”操作以相反的顺序读取它们。您将找不到参数名称,但您应该能够找到它们的数量和类型。返回值可能会变得更加困难 - 它可能是通过“eax”寄存器或通过作为最后一个伪参数(位于堆栈顶部)传递给函数的特殊指针。