我想从dll调用一个方法,但我没有源文件头文件。我试图使用dumpbin / exports来查看方法的名称,但我可以找到方法签名?
有没有办法调用此方法?
谢谢,
答案 0 :(得分:10)
如果该函数是C ++函数,您可以从损坏的名称派生函数签名。 Dependency Walker是一个可以为您完成此任务的工具。但是,如果DLL是使用C链接创建的(Dependency Walker会告诉你),那么你就不走运了。
答案 1 :(得分:6)
C ++语言对dll一无所知。
这是在Windows上吗?一种方法是:
depends.exe
中的dll
LoadLibrary()
来加载此dll(小心路径)GetProcAddress()
获取指向您要调用的函数的指针FreeLibrary()
释放句柄BTW:此方法通常也称为运行时动态链接,而不是编译时动态链接,您可以使用关联的
lib
文件编译源。
对于带有dlopen
的* nix,存在一些类似的机制,但之后我的记忆开始失败。名为objdump
或nm
的内容应该让您开始检查函数。
答案 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实用程序也可能有所帮助。