Серийный номер процессора - PullRequest
       34

Серийный номер процессора

13 голосов
/ 18 сентября 2008

Как мне получить серийный номер процессора в ПК?

Ответы [ 14 ]

16 голосов
/ 28 января 2010

У меня есть окончательный ответ без каких-либо внешних библиотек. Просто введите это:

wmic bios получить серийный номер

Это даст вам серийный номер на корпусе ПК;) (находится в базе знаний Microsoft)

Привет!

6 голосов
/ 18 сентября 2008

На основании тега «лицензирование», который вы использовали для своего вопроса, вы можете получить лучшие результаты чтение сетевого MAC-адреса . Идентификация ПК по MAC-адресу не является абсолютно неразрушимым способом защиты от копирования, но иногда он используется.

6 голосов
/ 18 сентября 2008

Помните, что большинство компьютеров в наши дни поставляются с отключенным идентификатором CPU в BIOS. См. CPUID в Википедии

2 голосов
/ 05 января 2018

После Pentium III в процессорах Intel нет серийного идентификатора процессора (PSN; CPUID edx bit 18 "psn" Serial Number); и в чипах AMD никогда не было psn:

https://software.intel.com/en-us/forums/watercooler-catchall/topic/308483 (в 2005 году)

Однако имейте в виду, что только процессоры Pentium III Xeon, Mobile Pentium III и Pentium III поддерживают функцию серийного номера процессора, представленную процессором Pentium III. Никакой другой процессор Intel не поддерживает функцию серийного номера процессора

https://en.wikipedia.org/wiki/Pentium_III#Controversy_about_privacy_issues

https://en.wikipedia.org/wiki/CPUID#EAX=3:_Processor_Serial_Number

EAX = 3: серийный номер процессора См. Также: Pentium III § Спор о проблемах конфиденциальности

Возвращает серийный номер процессора. Серийный номер процессора был представлен на Intel Pentium III, но из-за проблем с конфиденциальностью эта функция больше не реализована в более поздних моделях (бит функции PSN всегда сбрасывается). Процессоры Transmeta Efficeon и Crusoe также предоставляют эту функцию. Однако в процессорах AMD эта функция не реализована ни в одной модели процессоров.

2 голосов
/ 15 апреля 2012

Это и старая ветка. Но у меня была та же проблема, но я получил следующую логику, работающую без слишком большого количества операций, но и ошибок.

Проблема с серийным номером процессора состоит в том, что он не всегда работает в виртуализированной среде.

Я выполнил следующую логику с набором серверов под управлением Windows:

Win32_BIOS может предоставить вам серийный номер BIOS. Мы должны помнить, что если система виртуализирована, вы можете получить одинаковый серийный номер BIOS для всех серверов.

Win32_NetworkAdapter может предоставить вам MAC, который вы также можете использовать. В тех случаях, когда у вас есть несколько сетевых карт, вы получите несколько MAC-адресов.

Объединив оба этих идентификатора, у меня был весь уникальный набор для набора из 6000 серверов, охватывающих физический и виртуальный. Это было действительно просто реализовать с помощью ManagementClass & ManagementObject.

Но только предостережение: когда вы пытаетесь получить экземпляр MO удаленно, это займет более нескольких секунд в оптической сети с задержкой <5 мс и 10 Гбит / с. Так что, если вы сделаете математику, мне понадобится более 3 часов на одну операцию потока. Поскольку это больше похоже на трафик с низким приоритетом, я не хотел спамить мою сеть для сбора <code>WMI данных по многопоточному вызову.

2 голосов
/ 18 сентября 2008

Даже с включенным CPUID, есть ли серийный номер в современных процессорах? Я помню, что в Pentium 3 дня был большой протест, когда возникла проблема с серийным номером.

1 голос
/ 12 октября 2018

Процессоры Ivy Bridge и более новые все включают PPIN (идентификационный номер защищенного процессора). Доступ к этой функции может быть заблокирован прошивкой компьютера.

https://lore.kernel.org/patchwork/patch/736614/

1 голос
/ 11 марта 2016

__get_cpuid (unsigned int __level, unsigned int *__eax, unsigned int *__ebx, unsigned int *__ecx, unsigned int *__edx);

  • Заголовок: #include <cpuid.h>

Примечание: Серийный номер процессора был представлен на Intel Pentium III, но из-за соображений конфиденциальности эта функция больше не реализована в более поздних моделях.

Источник: Википедия

1 голос
/ 18 сентября 2008

Используйте инструмент CPUZ: http://www.cpuid.com/cpuz.php

0 голосов
/ 02 мая 2019

Выполнение инструкции CPUID с правильными настройками регистра приведет к получению серийного номера процессора в EAX, EBX, ECX и EDX. Однако эта функциональность доступна только на процессорах Pentium 3 и новее. Также на Pentium 4 и более новых процессорах инструкция всегда возвращает 0x00000000 во всех 4 регистрах. Более поздние модели Pentium 3 также могут возвращать 0x00000000. Эта функция была в первую очередь направлена ​​на защиту от копирования, позволяя связывать программное обеспечение с конкретными процессорами. Это не прошло хорошо с сообществом, и судебные процессы последовали. Эта функция была удалена из последней модели P3 и всех более новых процессоров. Эта функция присутствует в новых процессорах по причинам совместимости. Ходят слухи, что вы можете заказать специальные процессоры с серийными номерами, но минимальная покупка составляет около 1 миллиона процессоров. Конкретные настройки регистра перед выполнением инструкции CPUID можно найти в PDF-файле системного программиста Intel, доступном на их веб-сайте.

Также -


#include <Windows.h>
#include <stdio.h>
#include <xmmintrin.h>
#include <iphlpapi.h>
#include <Rpc.h>

static void GetMACaddress(void);
static void uuidGetMACaddress(void);

int main(){
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    printf("Processors - %d\n" , SysInfo.dwNumberOfProcessors);
    DWORD a , b , c , d , e;
    DWORD BasicLeaves;
    char* VendorID = (char*)malloc(20);
    char* message = (char*)malloc(20);
    _asm {
        pusha
        pushfd
        pop eax
        push eax
        xor eax , 0x00200000
        push eax
        popfd
        pushfd
        pop ecx
        pop eax
        xor eax , ecx
        mov [a] , eax
        }
    if(a & 0x00200000){
        printf("CPUID opcode supported.\n");
        } else {
        printf("CPUID opcode not supported, exiting...\n");
        return 0;
        }

    //DWORD* pa = &a[0];
    //DWORD* pb = &a[1];
    //DWORD* pc = &a[2];
    //DWORD* pd = &a[3];
    //a[4] = 0;
    e = 0;
    __asm {
        mov eax , 0
        cpuid
        mov [BasicLeaves] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }
    memcpy(&VendorID[0] , &b , 4);
    memcpy(&VendorID[4] , &d , 4);
    memcpy(&VendorID[8] , &c , 4);
    VendorID[12] = 0;

    printf("%d Basic Leaves\nVendorID - %s\n" , BasicLeaves , VendorID);

    __asm {
        mov eax , 1
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }
    if(d & 0x00000001) printf("FPU\n");
    if(d & 0x00000200) printf("APIC On-Chip\n");
    if(d & 0x00040000) printf("Processor Serial Number Present\n");
    if(d & 0x00800000) printf("MMX\n");
    if(d & 0x01000000) printf("SSE\n");
    if(d & 0x02000000) printf("SSE2\n");
    if(d & 0x08000000) printf("Hyperthreading (HTT)\n");

    if(c & 0x00000001) printf("SSE3\n");
    if(c & 0x00000200) printf("SSSE3\n");
    if(c & 0x00080000) printf("SSE4.1\n");
    if(c & 0x00100000) printf("SSE4.2\n");
    if(c & 0x02000000) printf("AES\n");


    __asm {
        mov eax , 0x80000000
        cpuid
        and eax , 0x7fffffff;
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }

    printf("%d Extended Leaves\n" , a);

    printf("Processor Brand String - ");
    __asm {
        mov eax , 0x80000002
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }
    memcpy(&message[0] , &a , 4);
    memcpy(&message[4] , &b , 4);
    memcpy(&message[8] , &c , 4);
    memcpy(&message[12] , &d , 4);
    message[16] = 0;
    printf("%s" , message);

    __asm {
        mov eax , 0x80000003
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        }

    memcpy(&message[0] , &a , 4);
    memcpy(&message[4] , &b , 4);
    memcpy(&message[8] , &c , 4);
    memcpy(&message[12] , &d , 4);
    message[16] = 0;
    printf("%s" , message);

    __asm {
        mov eax , 0x80000004
        cpuid
        mov [a] , eax;
        mov [b] , ebx;
        mov [c] , ecx;
        mov [d] , edx;
        popa
        }
    memcpy(&message[0] , &a , 4);
    memcpy(&message[4] , &b , 4);
    memcpy(&message[8] , &c , 4);
    memcpy(&message[12] , &d , 4);
    message[16] = 0;
    printf("%s\n" , message);

    char VolumeName[256]; DWORD VolumeSerialNumber; DWORD MaxComponentLength; DWORD FileSystemFlags; char FileSystemNameBuffer[256]; 
    GetVolumeInformationA("c:\\" , VolumeName , 256 , &VolumeSerialNumber , &MaxComponentLength , &FileSystemFlags , (LPSTR)&FileSystemNameBuffer , 256);
    printf("Serialnumber - %X\n" , VolumeSerialNumber);

    GetMACaddress();
    uuidGetMACaddress();

    return 0;
    }

// Fetches the MAC address and prints it
static void GetMACaddress(void){
    IP_ADAPTER_INFO AdapterInfo[16];        // Allocate information 
                                            // for up to 16 NICs
    DWORD dwBufLen = sizeof(AdapterInfo);   // Save memory size of buffer

    DWORD dwStatus = GetAdaptersInfo(       // Call GetAdapterInfo
    AdapterInfo,                            // [out] buffer to receive data
    &dwBufLen);                             // [in] size of receive data buffer
    //assert(dwStatus == ERROR_SUCCESS);    // Verify return value is 
                                            // valid, no buffer overflow

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to
                                            // current adapter info
    do {
        printf("Adapter MAC Address - %X-%X-%X-%X-%X-%X\n" , pAdapterInfo->Address[0] , pAdapterInfo->Address[1] , pAdapterInfo->Address[2] , pAdapterInfo->Address[3] , pAdapterInfo->Address[4] , pAdapterInfo->Address[5]);
        printf("Adapter IP Address  - %s\n" , pAdapterInfo->CurrentIpAddress);
        printf("Adapter Type        - %d\n" , pAdapterInfo->Type);
        printf("Adapter Name        - %s\n" , pAdapterInfo->AdapterName);
        printf("Adapter Description - %s\n" , pAdapterInfo->Description);
        uuidGetMACaddress();

        printf("\n");
        //PrintMACaddress(pAdapterInfo->Address); // Print MAC address
        pAdapterInfo = pAdapterInfo->Next;      // Progress through 
                                                // linked list
        } while(pAdapterInfo);                  // Terminate if last adapter
    }

// Fetches the MAC address and prints it

static void uuidGetMACaddress(void)
{
  unsigned char MACData[6];

  UUID uuid;
  UuidCreateSequential( &uuid );    // Ask OS to create UUID

  for (int i=2; i<8; i++)  // Bytes 2 through 7 inclusive 
                           // are MAC address
    MACData[i - 2] = uuid.Data4[i];

  printf("UUID MAC Address - %X-%X-%X-%X-%X-%X\n" , MACData[0] , MACData[1] , MACData[2] , MACData[3] , MACData[4] , MACData[5]);
}//*/
...