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

时间:2009-02-16 21:04:41

标签: c++ dll signature method-signature dumpbin

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

有没有办法调用此方法?

谢谢,

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

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

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

  • 打开(Visual Studio)
  • 附带的depends.exe中的dll
  • 验证您要呼叫的功能的签名
  • 使用LoadLibrary()来加载此dll(小心路径)
  • 使用GetProcAddress()获取指向您要调用的函数的指针
  • 使用此指针到函数来使用有效参数进行调用
  • 使用FreeLibrary()释放句柄
  

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

对于带有dlopen的* nix,存在一些类似的机制,但之后我的记忆开始失败。名为objdumpnm的内容应该让您开始检查函数。

答案 2 :(得分:5)

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

尝试免费的"Dependency Walker" (a.k.a. "depends")实用程序。 “Undecorate C ++ Functions”选项应该确定C ++方法的签名。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

如果您确实知道或强烈怀疑该函数存在,您可以使用loadLibrary动态加载DLL并使用getProcAddress获取指向该函数的指针。见MSDN

请注意,这是一种加载库的手动动态方式;你仍然需要知道正确的函数签名来映射到函数指针才能使用它。 AFAIK无法在加载时功能中使用dll并使用没有头文件的函数。

答案 5 :(得分:1)

调用非外部函数是在第3方DLL更新时让程序中断的好方法。

尽管如此,undname实用程序也可能有所帮助。