DllMain 和 DllEntryPoint 的区别

逆向工程 视窗 恶意软件 dll
2021-07-07 03:13:00

我有一个恶意软件要分析。根据IMAGE_FILE_HEADER->Characteristics. 我试图对其进行一些动态分析。我做了以下工作:

  • 使用rundll32.exe, 通过调用其导出来运行它没有什么。
  • 将二进制文件的特征更改为 exe。没有什么。

所以我转向静态分析,加载到 IDA 和 OllyDbg。这让我想到了我的问题。:)

DllMain之间的主要区别是DllEntryPoint什么?

一个人何时/如何接到另一个电话?

[编辑]

所以在阅读了 MSDN 和几本关于 MS 编程的书之后。我明白了DllEntryPointDllEntryPoint是您DllMain在编写代码时。对?!那么为什么有DllMain. 换句话说,在 IDA 中打开二进制文件时,您有DllEntryPointDllMain.

我知道这可能很简单,但我是视觉人士,所以显然这里没有看到任何东西。

3个回答

这两种,DllMainDllEntryPoint仅仅是相同的符号名称概念他们甚至共享相同的原型。但它们不一样:

该函数必须用__stdcall调用约定定义参数和返回值必须按照WinMain(对于 .exe 文件)或DllEntryPoint(对于 DLL)的 Win32 API 中的说明进行定义建议您让链接器设置入口点,以便正确初始化 C 运行时库,并执行静态对象的 C++ 构造函数。

(来自 Visual Studio 2005 的 MSDN 库)

DLL 中的入口点在技术上EXE 中的入口点相同,但具有不同的语义和原型(EXE 与 DLL)。两者都可以在 中找到IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint但是,在 DLL 中,此入口点是可选的(尽管通常由运行时库提供)。入口点没有通过导出目​​录明确导出(尽管 IDA 例如在“导出”下显示它们)。大多数情况下,此入口点没有附加公共名称,这就是文档将其称为DllEntryPoint. 如果您在 PE 文件的导出目录中找到此名称,它可能不是 PE 可选标头的实际入口点(不过,这必须通过查看确切示例来确认)。最后一点,顺便说一句,DllMain同样适用。

DllMain运行时库(ATL、MFC ...)实现希望您提供的名称。这是链接器将看到的一个名称,该名称在运行时实现中命名的默认实现中引用查看 CRT 源文件如果你有 Visual Studio。DllEntryPoint_DllMainCRTStartupcrtdll.cdllcrt0.c

这意味着DllEntryPoint 调用 DllMain- 假设默认行为。运行时实现的入口点函数 ( _DllMainCRTStartup) 执行其他初始化。

您可以使用指向链接器/entry命令行开关覆盖此名称同样,它只是一个名字,你可以选择任何你喜欢的。限制(无法LoadLibrary从入口点内使用加载另一个 DLL等)与您为函数指定的名称无关。


旁注:在 EXE 中,TLS 回调在入口点代码之前运行,这在恶意软件研究中可能很危险。不过,我认为这与 DLL 无关,但是如果有人在该领域有更多知识,我有兴趣查看指向材料的指针。

杰出的逆向分析者和恶意软件分析师Peter Ferrie在对此答案的评论中指出:

TLS 回调总是在静态链接的 DLL 中运行,从 Vista 开始,它们也在动态链接的 DLL 中运行!有关更多信息,请参阅我的 TLS 演示,当然还有我的“终极”反调试参考

谢谢彼得。

DllEntryPoint- 是加载器完成 PE 映像加载过程后执行将开始的地址(但如果我们谈论的是恶意软件则不必)。该地址在 PE 可选标头内指定。请看这里的另一个名称DllEntryPointAddressOfEntryPoint

DllMain- 是在 DLL 开发期间给出的默认函数名称,它是编译器如何知道它应该获取此函数的地址并将其放入 PEAddressOfEntryPoint字段的方式。开发人员可以将此名称更改为他想要的任何名称,但他应该指示编译器在这种情况下使用什么函数。此外,如果库只是一堆函数(假设不​​是应用程序),那么编译器将提供该DllMain函数的默认实现在此处进一步查看备注。

当涉及加载时间时,入口点是 DllMain。
(例如,COM 进程内服务器 DLL)。
当涉及运行时间时,入口点是 DllEntryPoint。
(例如 LoadLibrary 被调用)。