2008-11-15 95 views
16

如何查找未公开的 Dll函数的参数?查找DLL函数参数

我在互联网上搜索过,最终找到了一种方法:它涉及装饰功能。但是,我找不到获取这些内容的方法。

任何帮助,将不胜感激。

回答

6

正如Paul指出的那样,您需要使用IDA Pro(或免费版本)的方式反汇编应用程序。

一个很好的介绍性资源是Wikibook,x86 Disassembly。具体来说,看看functions and stack frames的部分。对于采用标准类型的几个参数的简单函数,推导函数参数可以是直接的。

也许开始使用这种方法的最好方法是创建一个小型测试DLL,使用已知参数创建一些函数,然后反汇编DLL以查看模式。从你自己的函数中学习反汇编(你有源代码并知道完整的签名),而不是分解第三方的东西。

+1

Hrm ....根据我的回答:P(开玩笑确定;),无论如何,你根本不需要反汇编,你可以更快得到更准确的信息,然后再诉诸这个事实上,这是我建议的步骤之后的最后一个可能的办法。 – RandomNickName42 2009-07-02 09:40:14

5

要做到这一点的唯一方法是分解函数并查看它如何使用寄存器和堆栈。 IDA Pro是做这件事的最佳工具,但它不是微不足道的。

+0

好的答案,我应该删除我的。我必须努力我的简洁:) – 2008-11-15 05:35:38

1

如果您拥有的唯一信息是未修饰的函数名称,那么遗憾的是无法单独推导出函数参数。

如果你装配得很好,可以拆开功能的机器代码并对其进行逆向工程。但除了最简单的功能之外,这对所有人来说都很难做到。

1

我并不十分熟悉Windows使用的PE格式,但我很确定没有真正简单的方法来做到这一点。如果符号表没有被剥离,你可能能够找到一些信息(不知道Windows如何在PE中存储调试信息),但它几乎肯定无法帮助你处理参数类型。最好的办法是将DLL加载到调试器中并对其进行实验...监视堆栈帧上的原始内存,发送各种变量类型等。

即使您在调试信息中找到了很好的资源在一个PE文件中,几乎肯定不会有任何私人函数的信息。

4

它是COM Dll吗?如果它是一个COM Dll,然后注册它,使用OLE视图来了解Interafaces和参数。

2

首先,下载Dependency Walker并打开你的DLL。您将看到符号导出和导入。如果你的函数名称看起来像_MyFunction - 它是“C”风格(没有装饰),并且你没有太多处理它(可能会像前面说的那样拆卸)

如果它更像?_MyFunction @ LoNgSetOfSome @装饰,您可以尝试“去除装饰”,它使用{非官方的}信息从here

+0

PE资源管理器能够在内部取消使用Microsoft和Borland C++编译器编译的库导出的符号:http://www.heaventools.com/unmangle.htm – Wylder 2010-07-16 17:15:44

7

我做了相当深入的回答here,ReactOS的是你最好的选择,因为它似乎再次,大家在这里 - _StrangeChAracTers这是C++有点偏离基础。

我会强烈不鼓励试图反汇编系统DLL的。

一个MUCH更adventagious(我不这么认为远的东西看起来讨论),方法是枚举PDB的内容。

PDB文件是您可能已知的调试符号,但是,由于反托拉斯法庭案件的行动,Microsoft需要发布大量未记录的信息。对Windows API的巨量的

完全准确的,可用的和最新的信息是通过PDB文件的记录。调用约定,参数计数,甚至参数类型和名称都记录下来(但不是关于使用课程的具体细节:)。

回顾DIA SDK,dia2dump是随Visual Studio分发的一个很好的例子,为了进一步调查,它还提供了一个解开函数的解决方案,专门针对您的问题。

另外,kernel32提供了UnDecorateSymbolName,所以如果你不想链接到debug sdk库,也可以使用它。