我有一个要分析的恶意软件。根据IMAGE_FILE_HEADER->Characteristics是DLL。我试图对此进行一些动态分析。我已经完成了以下操作:

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

所以我开始进行静态分析,并加载到IDA和OllyDbg上。
这使我想到了我的问题。 :)
DllMainDllEntryPoint之间的主要区别是什么?
何时/如何获得呼叫与另一个获得呼叫?
[EDIT]
因此,在阅读MSDN和几个有关MS编程的书籍。我了解DllEntryPoint
编写代码时,DllEntryPoint是您的DllMain。是吗?!
那为什么还要DllMain呢?换句话说,当在IDA中打开二进制文件时,您会看到DllEntryPointDllMain
我知道这可能很简单,但我是视觉对象,因此显然在这里看不到任何东西。

#1 楼

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可选标头中的实际入口点(不过,必须通过查看确切的示例来确认)。最后一点btw也适用于DllMain

DllMain是运行时库(ATL,MFC ...)实现希望您提供的名称。这是链接器将看到的名称,该名称是从DllEntryPoint的默认实现中引用的,该默认实现在运行时实现中名为_DllMainCRTStartup。如果您有Visual Studio,请参见CRT源文件crtdll.cdllcrt0.c

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

您可以使用链接器上的/entry命令行开关来覆盖此名称。同样,它只是一个名字,您可以选择任何您喜欢的东西。局限性(无法从入口点使用LoadLibrary加载其他DLL等)与您给函数指定的名称无关。


侧面注释:在EXE中TLS回调在入口点代码之前运行,这在恶意软件研究中可能很危险。我认为这与DLL无关,但是,如果有人对此领域有更多的了解,我很想看到指向材料的指针。

杰出的反向器和恶意软件分析师Peter Ferrie,在对此答案的注释中指出:


TLS回调始终在静态链接的DLL中运行,而从Vista开始,
它们也在动态链接的DLL中运行!有关更多信息,请参阅我的
TLS演示文稿,以及我的“最终”反调试参考课程的



感谢彼得。

评论


TLS回调始终在静态链接的DLL中运行,并且自Vista以来,它们还在动态链接的DLL中运行!有关更多信息,请参阅我的TLS演示文稿(pferrie.host22.com/papers/com2008.htm),当然也请参见我的“最终”反调试参考(pferrie.host22.com/papers/unp2011.htm)。

–彼得·弗里
13年5月23日在15:46



#2 楼

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

DllMain-是DLL开发过程中提供的默认函数名称,这是编译器如何知道应使用该函数的地址并将其放入PE的方法AddressOfEntryPoint栏位。开发人员可以将此名称更改为自己想要的名称,但是他应该指示编译器在这种情况下使用什么功能。另外,如果库只是一堆函数(比如说不是应用程序),则编译器将提供DllMain函数的默认实现。请在备注中进一步查看。

评论


在MMavipc编写的内容中,我补充说,在可以调用实际的dll逻辑之前,需要DllMain来准备环境或对各种事件(线程创建,将dll加载到进程,进程终止)做出不同的反应。有时在IDA中可以将对实际Dll逻辑的调用视为StartAddress。

– PhoeniX
13年5月23日在8:39



#3 楼

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