獲取網路卡MAC、硬碟序列號、CPU ID、BIOS編號(1) - 硬碟序列號 - 技術應用 - 豆豆網

chief1985發表於2008-10-12
導讀:
 以下程式碼可以取得系統特徵碼(網路卡MAC、硬碟序列號、CPU ID、BIOS編號)   BYTE szSystemInfo[4096]; // 在程式執行完畢後,此處儲存取得的系統特徵碼
   UINT uSystemInfoLen = 0; // 在程式執行完畢後,此處儲存取得的系統特徵碼的長度
   // 網路卡 MAC 地址,注意: MAC 地址是可以在登錄檔中修改的
   {
     UINT uErrorCode = 0;
     IP_ADAPTER_INFO iai;
     ULONG uSize = 0;
     DWORD dwResult = GetAdaptersInfo( &iai, &uSize );
     if( dwResult == ERROR_BUFFER_OVERFLOW )
     {
       IP_ADAPTER_INFO* piai = ( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ), 0, uSize );
       if( piai != NULL )
       {
         dwResult = GetAdaptersInfo( piai, &uSize );
         if( ERROR_SUCCESS == dwResult )
         {
           IP_ADAPTER_INFO* piai2 = piai;
           while( piai2 != NULL && ( uSystemInfoLen + piai2->AddressLength ) < 4096U )
           {
             CopyMemory( szSystemInfo + uSystemInfoLen, piai2->Address, piai2->AddressLength );
             uSystemInfoLen += piai2->AddressLength;
             piai2 = piai2->Next;            
           }
         }
         else
         {
           uErrorCode = 0xF0000000U + dwResult;
         }
         VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) );
       }
       else
       {
         return FALSE;
       }
     }
     else
     {
       uErrorCode = 0xE0000000U + dwResult;
     }
     if( uErrorCode != 0U )
     {
       return FALSE;
     }
   }
  // 硬碟序列號,注意:有的硬碟沒有序列號
   {
     OSVERSIONINFO ovi = { 0 };
     ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
     GetVersionEx( &ovi );
    
     if( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT )
     {
       // Only Windows 2000, Windows XP, Windows Server 2003...
       return FALSE;
     }
     else
     {
       if( !WinNTHDSerialNumAsPhysicalRead( szSystemInfo, &uSystemInfoLen, 1024 ) )
       {
         WinNTHDSerialNumAsScsiRead( szSystemInfo, &uSystemInfoLen, 1024 );
       }
     }
   }
   // CPU ID
   {
     BOOL bException = FALSE;
     BYTE szCpu[16] = { 0 };
     UINT uCpuID   = 0U;
  __try
     {
       _asm
       {
         mov eax, 0
         cpuid
         mov dword ptr szCpu[0], ebx
         mov dword ptr szCpu[4], edx
         mov dword ptr szCpu[8], ecx
         mov eax, 1
         cpuid
         mov uCpuID, edx
       }
     }
     __except( EXCEPTION_EXECUTE_HANDLER )
     {
       bException = TRUE;
     }
    
     if( !bException )
     {
       CopyMemory( szSystemInfo + uSystemInfoLen, &uCpuID, sizeof( UINT ) );
       uSystemInfoLen += sizeof( UINT );
  uCpuID = strlen( ( char* )szCpu );
       CopyMemory( szSystemInfo + uSystemInfoLen, szCpu, uCpuID );
       uSystemInfoLen += uCpuID;
     }
   }
  
   // BIOS 編號,支援 AMI, AWARD, PHOENIX
   {
     SIZE_T ssize;
  LARGE_INTEGER so;
     so.LowPart=0x000f0000;
     so.HighPart=0x00000000;
     ssize=0xffff;
     wchar_t strPH[30]=Ldevicephysicalmemory;
     DWORD ba=0;
     UNICODE_STRING struniph;
     struniph.Buffer=strPH;
     struniph.Length=0x2c;
     struniph.MaximumLength =0x2e;
     OBJECT_ATTRIBUTES obj_ar;
     obj_ar.Attributes =64;
     obj_ar.Length =24;
     obj_ar.ObjectName=&struniph;
     obj_ar.RootDirectory=0;
     obj_ar.SecurityDescriptor=0;
     obj_ar.SecurityQualityOfService =0;
     HMODULE hinstLib = LoadLibrary("ntdll.dll");
     ZWOS ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");
     ZWMV ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");
     ZWUMV ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");
    
     //呼叫函式,對實體記憶體進行對映
     HANDLE hSection;
     if( 0 == ZWopenS(&hSection,4,&obj_ar) &&
       0 == ZWmapV(
       ( HANDLE )hSection,  //開啟Section時得到的控制程式碼
       ( HANDLE )0xFFFFFFFF, //將要對映程式的控制程式碼,
       &ba,         //對映的基址
       0,
       0xFFFF,        //分配的大小
       &so,         //實體記憶體的地址
       &ssize,        //指向讀取記憶體塊大小的指標
       1,          //子程式的可繼承性設定
       0,          //分配型別
       2           //保護型別
       ) )
     //執行後會在當前程式的空間開闢一段64k的空間,並把f000:0000到f000:ffff處的內容對映到這裡
     //對映的基址由ba返回,如果對映不再有用,應該用ZwUnmapViewOfSection斷開對映
     {
       BYTE* pBiosSerial = ( BYTE* )ba;
       UINT uBiosSerialLen = FindAwardBios( &pBiosSerial );
       if( uBiosSerialLen == 0U )
       {
         uBiosSerialLen = FindAmiBios( &pBiosSerial );
         if( uBiosSerialLen == 0U )
         {
           uBiosSerialLen = FindPhoenixBios( &pBiosSerial );
         }
       }
       if( uBiosSerialLen != 0U )
       {
         CopyMemory( szSystemInfo + uSystemInfoLen, pBiosSerial, uBiosSerialLen );
         uSystemInfoLen += uBiosSerialLen;
       }
       ZWunmapV( ( HANDLE )0xFFFFFFFF, ( void* )ba );
     }
   }
   // 完畢, 系統特徵碼已取得。

  以下是其中用到的某些結構及函式的定義:



作者:黃友生    責編:豆豆技術應用

本文轉自
http://tech.ddvip.com/2007-03/117449704221903.html

相關文章