如何在不知道参数的情况下使用dll?

问题描述:

我有一个我需要使用的dll。我也有一个程序,调用这个DLL来使用它。我需要能够在另一个程序中使用这个DLL,然而之前的程序员没有留下任何文档或源代码。有没有一种方法可以监视对此dll的调用以及传递的内容?如何在不知道参数的情况下使用dll?

+0

它是什么语言,任何线索? – 2010-02-15 01:56:06

+0

客户端不知道,但使用DependencyWalker它看起来像c或C++风格的函数名称。 – user273114 2010-02-15 02:08:56

你一般不能。这是从Dependency Walker FAQ:

问:如何查看参数和 返回类型的函数?

答:对于大多数函数,这个 信息根本不存在于 模块中。 Windows的模块文件 格式仅提供单个文本 字符串来标识每个函数。 没有结构化的方式来列出 参数数量,参数 类型或返回类型。然而, 某些语言做了一些叫做 函数的“修饰”或“mangling”, 这是将 信息编码成文本字符串的过程。例如,对于 示例,使用简单装饰 编码的函数(如int Foo(int, int))可能会导出为_Foo @ 8。 8 指的是参数 使用的字节数。如果使用的C++装饰为 ,函数将作为?Foo @@ YGHHH @ Z导出为 ,可以将该函数直接解码回 函数的原始原型:int Foo(int,int)。 Dependency Walker 通过使用 Undecorate C++函数命令来支持C++ undecoration。

编辑:有一两件事你可以做,我想,是让反汇编和拆卸DLL和/或调用代码,并从数量和类型的参数制定,以及返回类型。尽管如此,您将无法找到参数的名称。

您可以hook在要监视(如果你知道有多少参数需要)

您可以使用dumpbin(这是Visual Studio Professional或VC++速成的一部分,该DLL的功能或下载平台套件,甚至使用OpenWatcom C++)中的DLL来寻找“出口”部分,作为一个例子:

 
dumpbin /all SimpleLib.dll | more 

Output would be: 
    Section contains the following exports for SimpleLib.dll 

    00000000 characteristics 
    4A15B11F time date stamp Thu May 21 20:53:03 2009 
     0.00 version 
      1 ordinal base 
      2 number of functions 
      2 number of names 

    ordinal hint RVA  name 

      1 0 00001010 fnSimpleLib 
      2 1 00001030 fnSimpleLib2 

看那序,也有出口...唯一的两个功能事情是制定出什么参数e used ...

您还可以使用PE Explorer为您找到。计算参数有点棘手,需要反汇编二进制文件,然后在文件偏移处查找函数调用,然后通过查看'SP','BP'寄存器来计算参数。

希望这会有所帮助, 最好的问候, 汤姆。