实现 DllMain 分析器

网络监视器使用 DllMain 导出函数来识别分析程序的存在,并释放网络监视器用于存储分析程序相关信息的资源。

当网络监视器首次调用 DllMain 时,分析程序 DLL 会调用 CreateProtocol 来执行以下操作:

  • 指定分析程序检测到的协议。
  • 为网络监视器调用的剩余分析程序导出函数提供入口点。

当网络监视器最后一次调用 DllMain 时, DllMain 调用 DestroyProtocol 以释放网络监视器用于存储有关分析程序的信息的所有资源。

以下过程标识实现 DllMain 所需的步骤。

实现 DllMain

  1. CreateProtocol 函数和全局 Attach 变量指定 ENTRYPOINTS 结构。 Attach 变量用于跟踪正在运行的协议实例数。

  2. 查看操作系统设置的 Command 参数的值。

    如果 Command 参数设置为 DLL_PROCESS_ATTACH而 Attach 为 0,则调用 CreateProtocol 来提供以下导出函数的协议名称和入口点。

    • 注册
    • 取消注册
    • RecognizeFrame
    • AttachProperties
    • 仅当网络监视器) 显示协议属性时,才需要 FormatProperties (。

    如果 Command 参数设置为 DLL_PROCESS_DETACH而 Attach 为 0,则使用 CreateProtocol 返回的实例句柄调用 DestroyProtocol

  3. 返回 TRUE ,因为 DllMain 分析器函数必须始终返回 TRUE

下面是 DllMain 的基本实现。 该代码示例使用 case 语句捕获 Command 参数的值,以确定应调用 CreateProtocol 还是 DestroyProtocol

#include <windows.h>

// Entry point structure for parser export functions and global
// Attach variable.
ENTRYPOINTS EntryPoints =
{
  Register,
  Deregister,
  RecognizeFrame,
  AttachProperties,
  FormatProperties
};

DWORD Attached = 0; 

BOOL WINAPI DllMain(HANDLE hInstance, ULONG Command, LPVOID Reserved)
{
  switch(Command)
  {
  // Call CreateProtocol.
  case DLL_PROCESS_ATTACH:
       // Loading parser DLL.
       if(Attached == 0)
       {
         hProtocol = CreateProtocol( "ProtocolName",
                                     &EntryPoints,
                                     ENTRYPOINTS_SIZE);
       }
       Attached++;
       break;
  // Call DestroyProtocol.
  case DLL_PROCESS_DETACH:
       // Unloading parser DLL.
       Attached--;
       if(Attached == 0)
       {
         DestroyProtocol( hProtocol);
       }
       break;
  }
  return TRUE;
}