天天看点

《windows核心编程》笔记(三)

命名内核对象有一种问题:任何程序都可以创建一个命名对象,这样如果某个程序要实现单例运行而创建了一个内核对象,这种情况下另一程序也创建了同名的内核对象时,该单例程序就无法正常运行了。这是DoS攻击的一种。

《windows核心编程》笔记(三)

void CheckInstances() 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

{//检查实例

《windows核心编程》笔记(三)

   // Create the boundary descriptor

《windows核心编程》笔记(三)

   g_hBoundary = CreateBoundaryDescriptor(g_szBoundary, 0);

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   // Create a SID corresponding to the Local Administrator group

《windows核心编程》笔记(三)

   BYTE localAdminSID[SECURITY_MAX_SID_SIZE];

《windows核心编程》笔记(三)

   PSID pLocalAdminSID = &localAdminSID;

《windows核心编程》笔记(三)

   DWORD cbSID = sizeof(localAdminSID);

《windows核心编程》笔记(三)

   if (!CreateWellKnownSid(

《windows核心编程》笔记(三)

      WinBuiltinAdministratorsSid, NULL, pLocalAdminSID, &cbSID)

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

      ) 

《windows核心编程》笔记(三)

{

《windows核心编程》笔记(三)

      AddText(TEXT("AddSIDToBoundaryDescriptor failed: %u\r\n"), 

《windows核心编程》笔记(三)

         GetLastError());

《windows核心编程》笔记(三)

      return;

《windows核心编程》笔记(三)

   }

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   // Associate the Local Admin SID to the boundary descriptor

《windows核心编程》笔记(三)

   // --> only applications running under an administrator user

《windows核心编程》笔记(三)

   //     will be able to access the kernel objects in the same namespace

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   if (!AddSIDToBoundaryDescriptor(&g_hBoundary, pLocalAdminSID)) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   // Create the namespace for Local Administrators only

《windows核心编程》笔记(三)

   SECURITY_ATTRIBUTES sa;

《windows核心编程》笔记(三)

   sa.nLength = sizeof(sa);

《windows核心编程》笔记(三)

   sa.bInheritHandle = FALSE;

《windows核心编程》笔记(三)

   if (!ConvertStringSecurityDescriptorToSecurityDescriptor(

《windows核心编程》笔记(三)

      TEXT("D:(A;;GA;;;BA)"), 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

      SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL)) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

      AddText(TEXT("Security Descriptor creation failed: %u\r\n"), GetLastError());

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   g_hNamespace = 

《windows核心编程》笔记(三)

      CreatePrivateNamespace(&sa, g_hBoundary, g_szNamespace);

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   // Don't forget to release memory for the security descriptor

《windows核心编程》笔记(三)

   LocalFree(sa.lpSecurityDescriptor);

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   // Check the private namespace creation result

《windows核心编程》笔记(三)

   DWORD dwLastError = GetLastError();

《windows核心编程》笔记(三)

   if (g_hNamespace == NULL) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

      // Nothing to do if access is denied

《windows核心编程》笔记(三)

      // --> this code must run under a Local Administrator account

《windows核心编程》笔记(三)

      if (dwLastError == ERROR_ACCESS_DENIED) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

         AddText(TEXT("Access denied when creating the namespace.\r\n"));

《windows核心编程》笔记(三)

         AddText(TEXT("   You must be running as Administrator.\r\n\r\n"));

《windows核心编程》笔记(三)

         return;

《windows核心编程》笔记(三)

      }

《windows核心编程》笔记(三)

      else 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

《windows核心编程》笔记(三)

         if (dwLastError == ERROR_ALREADY_EXISTS) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

         // If another instance has already created the namespace, 

《windows核心编程》笔记(三)

         // we need to open it instead. 

《windows核心编程》笔记(三)

            AddText(TEXT("CreatePrivateNamespace failed: %u\r\n"), dwLastError);

《windows核心编程》笔记(三)

            g_hNamespace = OpenPrivateNamespace(g_hBoundary, g_szNamespace);

《windows核心编程》笔记(三)

            if (g_hNamespace == NULL) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

               AddText(TEXT("   and OpenPrivateNamespace failed: %u\r\n"), 

《windows核心编程》笔记(三)

               dwLastError);

《windows核心编程》笔记(三)

               return;

《windows核心编程》笔记(三)

            } 

《windows核心编程》笔记(三)

            else 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

               g_bNamespaceOpened = TRUE;

《windows核心编程》笔记(三)

               AddText(TEXT("   but OpenPrivateNamespace succeeded\r\n\r\n"));

《windows核心编程》笔记(三)

            }

《windows核心编程》笔记(三)

         } 

《windows核心编程》笔记(三)

         else

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

            AddText(TEXT("Unexpected error occured: %u\r\n\r\n"),dwLastError);

《windows核心编程》笔记(三)

            return;

《windows核心编程》笔记(三)

         }

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   // Try to create the mutex object with a name 

《windows核心编程》笔记(三)

   // based on the private namespace 

《windows核心编程》笔记(三)

   TCHAR szMutexName[64];

《windows核心编程》笔记(三)

   StringCchPrintf(szMutexName, _countof(szMutexName), TEXT("%s\\%s"), g_szNamespace, TEXT("Singleton"));

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   g_hSingleton = CreateMutex(NULL, FALSE, szMutexName);//创建互斥量

《windows核心编程》笔记(三)

   if (GetLastError() == ERROR_ALREADY_EXISTS) 

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

      // There is already an instance of this Singleton object

《windows核心编程》笔记(三)

      AddText(TEXT("Another instance of Singleton is running:\r\n"));

《windows核心编程》笔记(三)

      AddText(TEXT("--> Impossible to access application features.\r\n"));

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   else  

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

      // First time the Singleton object is created

《windows核心编程》笔记(三)

      AddText(TEXT("First instance of Singleton:\r\n"));

《windows核心编程》笔记(三)

      AddText(TEXT("--> Access application features now.\r\n"));

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

}

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

void AddText(PCTSTR pszFormat, 

《windows核心编程》笔记(三)

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   va_list argList;

《windows核心编程》笔记(三)

   va_start(argList, pszFormat);

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   TCHAR sz[20 * 1024];

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

   Edit_GetText(DETAILS_CTRL, sz, _countof(sz));

《windows核心编程》笔记(三)

   _vstprintf_s(

《windows核心编程》笔记(三)

      _tcschr(sz, TEXT('\0')), _countof(sz) - _tcslen(sz), 

《windows核心编程》笔记(三)

      pszFormat, argList);

《windows核心编程》笔记(三)

   Edit_SetText(DETAILS_CTRL, sz);

《windows核心编程》笔记(三)

   va_end(argList);

《windows核心编程》笔记(三)
《windows核心编程》笔记(三)

继续阅读