博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取网卡MAC、硬盘序列号、CPU ID、BIOS编号(1) - 硬盘序列号 - 技术应用 - 豆豆网
阅读量:2400 次
发布时间:2019-05-10

本文共 4590 字,大约阅读时间需要 15 分钟。

导读:
 以下代码可以取得系统特征码(网卡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 );
     }
   }
   // 完毕, 系统特征码已取得。

  以下是其中用到的某些结构及函数的定义:

1

作者:黄友生    责编:豆豆技术应用

本文转自

转载地址:http://wniob.baihongyu.com/

你可能感兴趣的文章
握着你的“手”清除DLL后门(转)
查看>>
中文自定义字体打印解决!(转)
查看>>
告诉大家一个非常好的工具--netselect(转)
查看>>
中文显示原理研究(转)
查看>>
JSP显示中文问题的解决方案(转)
查看>>
秀一下我的xpdf(转)
查看>>
Software Packages in `experimental' - 安装方法(转)
查看>>
小议jsp页面中的下载功能(转)
查看>>
自认为最简单的中文latex配置,3步就可以了!(转)
查看>>
问题实录(二)(转)
查看>>
when i run tasksel,system give me following report,what's means?(转)
查看>>
问题实录(三)(转)
查看>>
Java Servlet和JSP教程(1)(转)
查看>>
Java Servlet和JSP教程(3)(转)
查看>>
Debian 安全手册 第 4 章 - 安装后(转)
查看>>
Java Servlet和JSP教程(4)(转)
查看>>
xp上的shutdown(转)
查看>>
转换RM为MP3(转)
查看>>
Java中文问题详解(转)
查看>>
制作多系统安装盘(转)
查看>>