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

时间:2010-02-15 01:50:41

标签: windows dll

我有一个我需要使用的DLL。我还有一个程序可以调用这个dll来使用它。我需要能够在另一个程序中使用这个DLL,但是之前的程序员没有留下任何文档或源代码。有没有办法可以监控对此dll的调用以及传递的内容是什么?

3 个答案:

答案 0 :(得分:4)

总的来说,你不能。这来自Dependency Walker常见问题解答:

  

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

     

答:对于大多数功能,这个   信息根本就不存在   模块。 Windows的模块文件   format仅提供单个文本   字符串来标识每个函数。   没有结构化的方式来列出   参数个数,参数   类型或返回类型。然而,   有些语言做了一些事情   功能“装饰”或“整理”,   这是编码的过程   信息到文本字符串中。对于   例如,像int Foo这样的函数(int,   int)用简单的装饰编码   可能会导出为_Foo @ 8。 8   指的是使用的字节数   参数。如果是C ++装饰的话   使用后,该函数将被导出   as?Foo @@ YGHHH @ Z,可以   直接解码回来了   函数的原始原型:int   Foo(int,int)。依赖沃克   通过使用支持C ++ undecoration   Undecorate C ++ Functions Command。

编辑:我认为,你可以做的一件事就是获得一个反汇编程序并反汇编DLL和/或调用代码,并从中得出参数的数量和类型,和返回类型。但是你无法找到参数的名称。

答案 1 :(得分:1)

你可以在DLL上使用dumpbin(这是Visual Studio Professional或VC ++ Express的一部分,或者下载平台工具包,甚至使用OpenWatcom C ++)来寻找'exports'部分,作为一个例子:

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

看看序数,有两个函数导出...唯一的问题是找出使用的参数......

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

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:0)

你可以 hook 你希望监控的DLL中的函数(如果你知道它们有多少参数)