22

如何找到未记录的Dll 函数的参数?

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

任何帮助,将不胜感激。

4

7 回答 7

10

正如 Paul 所指出的,您需要使用 IDA Pro(或相同的免费版本)之类的工具来反汇编应用程序。

一个很好的介绍性资源是 Wikibook, x86 Disassembly。具体来说,请查看有关函数和堆栈帧的部分。对于采用一些标准类型参数的简单函数,推导函数参数可以很简单。

开始做这类事情的最好方法可能是创建一个小型测试 DLL,创建一些具有已知参数的函数,然后反汇编您的 DLL 以查看模式。从你自己的函数中学习反汇编(你有源代码并且知道完整的签名),而不是一头扎进反汇编第三方的东西。

于 2008-11-16T07:36:26.937 回答
10

我在这里做了一个相当深入的回答,看起来 ReactOS 是你最好的选择,这里的每个人都有点偏离基础。

强烈反对尝试反汇编系统 DLL。

一种更具冒险性的技术(我不相信从事物的外观到目前为止讨论过),技术是枚举 PDB 的内容。

PDB 文件是您可能知道的调试符号,但是,由于反垄断法庭案件的行动,微软需要发布大量其他未记录的信息。

大量 Windows API 的完全准确、可用和更新的信息通过 PDB 文件记录。调用约定、参数计数甚至参数类型和名称都记录在案(但当然没有关于使用的细节:)。

Review the DIA SDK, dia2dump is a good example distributed with Visual Studio, to investigate further, it also provides a solution to undecorate function's, to speak specifically to your question.

Also, kernel32 provides UnDecorateSymbolName, so you can use that also if you do not wish to link to the debug sdk libraries.

于 2009-07-02T09:37:16.210 回答
5

做到这一点的唯一方法是反汇编函数并查看它如何使用寄存器和堆栈。IDA Pro 是执行此操作的最佳工具,但它并非微不足道。

于 2008-11-15T05:34:02.630 回答
4

是COM Dll吗?如果是COM Dll,则注册它,使用OLE 视图了解接口和参数。

于 2008-11-16T07:24:19.177 回答
3

首先,下载Dependency Walker并在其中打开您的 DLL。您将看到导出和导入的符号。如果您的函数名称看起来像 _MyFunction - 它是“C”样式(未装饰)并且您与它没有太多关系(可能如前所述反汇编)

如果它更像 ?_MyFunction@LoNgSetOfSome@_StrangeChAracTers 它是 C++ - 已装饰,您可以尝试使用此处的 {unofficial} 信息“取消装饰”它

于 2008-11-18T20:08:50.613 回答
1

如果您拥有的唯一信息是未修饰的函数名称,那么不幸的是,仅凭此信息无法推断出函数参数。

如果您擅长组装,则可以反汇编该功能的机器代码并对其进行逆向工程。但除了最简单的功能之外,这对于所有功能来说都很难做到。

于 2008-11-15T05:34:26.653 回答
1

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

即使您在 PE 文件中找到有关调试信息的良好资源,也几乎可以肯定不会有任何有关私有函数的信息。

于 2008-11-15T05:34:37.933 回答