查找DLL函数参数

时间:2008-11-15 05:15:22

标签: function dll parameters name-decoration

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

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

任何帮助都将不胜感激。

7 个答案:

答案 0 :(得分:8)

正如Paul所说,您需要使用IDA Pro(或其免费版本)之类的东西来反汇编应用程序。

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

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

答案 1 :(得分:8)

我做了一个相当深入的回答here,ReactOS是你最好的选择,因为它似乎再次,每个人这里有点偏离基础。

我强烈反对试图反汇编系统DLL。

MUCH 更加冒险(我不相信到目前为止讨论过的事情),技术是枚举PDB的内容。

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

大量Windows API的完全准确,可用和更新的信息仅通过PDB文件 记录。调用约定,参数计数,甚至参数类型和名称都记录在案(但不是关于使用课程的具体内容:)。

回顾DIA SDK,dia2dump是与Visual Studio一起分发的一个很好的例子,为了进一步研究,它还提供了一个解决未设计功能的解决方案,专门针对您的问题。

此外,kernel32提供了UnDecorateSymbolName,因此如果您不希望链接到调试sdk库,也可以使用它。

答案 2 :(得分:5)

执行此操作的唯一方法是通过反汇编函数并查看它如何使用寄存器和堆栈。 IDA Pro是实现这一目标的最佳工具,但它不是一件容易的事。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

如果它更像?_MyFunction @ LoNgSetOfSome @ _StrangeChAracTers它是C ++ - 装饰你可以尝试使用来自here的{unofficial}信息来“解开”它

答案 5 :(得分:1)

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

如果您对装配很好,可以拆卸功能的机器代码并对其进行反向工程。但除了最简单的功能之外,这对所有人来说都是相当难的。

答案 6 :(得分:1)

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

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