1

我正在编写一个在进程中运行的加载项。我能够可靠地发现已在该进程中加载​​的 DLL 的内存地址。偏移处的内存清楚地显示了一个“MZ”DOS 头和一个“PE”头。后来,似乎有导出函数的名称等。这就像加载的 DLL 一样走路和说话。

所以,现在,我想更多地了解 DLL 是什么,更有趣的是,我可以用它什么。

我过去使用过 PE 实用程序,但它们总是使用基于文件的 DLL。除了在十六进制编辑器中检查进程外,如何列出内存中 DLL 的导出函数?有什么方法可以发现当前加载的基于文件的 DLL?(我对加载 dll 时发生的链接不太熟悉。)

如果我有导出函数的名称,是否只是尝试调用这些函数并猜测它们的参数和返回值?还是可以执行一些更强大的逆向工程?

给定 DLL 的起始地址和函数名,我将如何在 C# 中进行调用?

4

1 回答 1

0

这里实际上有很多问题(有些问题非常广泛)。我会尝试为一些人提供答案。

显然,从.dll中获取函数签名并不是一项简单的任务(有时这是不可能的)。这里有 3 个 URL,但谷歌会在这个主题上产生大量结果:

但是.dll带有一个或多个包含(除其他外)函数/类声明的头文件。缺少标题将意味着:

  • .dll符号仅供内部使用(不得称为“手动” )
  • 它们是私有的(例如受许可证保护),在这种情况下对它们进行逆向工程就不太合乎道德

无论如何,考虑到您获得函数名称和签名的一种或另一种方式,您可以通过[MSDN]: GetProcAddress function加载函数,然后调用它们。

.NET ( C# ) 做所有事情(同样,需要函数名和签名),只会增加额外的复杂性,因为C#代码在托管环境中运行,而C / C++本机环境中运行,并且当数据在2 个需要编组/组的环境([MSDN]:C++ 编组概述)。
以下是 3 个 URL,但同样,互联网上充满了信息:

于 2017-10-17T18:22:18.730 回答