문제

PC에서 CPU의 일련번호를 어떻게 얻나요?

도움이 되었습니까?

해결책

질문에 사용한 '라이선스' 태그를 기반으로 하면 더 나은 결과를 얻을 수 있습니다. 네트워크 MAC 주소 읽기.MAC 주소로 PC를 식별하는 것은 복사 방지를 위해 완전히 깨지지 않는 방법은 아니지만 때때로 사용됩니다.

다른 팁

나는 외부 라이브러리 없이 이에 대한 궁극적인 답을 가지고 있습니다.간단히 다음을 입력하세요.

wmic bios는 일련 번호를 얻습니다.

이것은 PCS 섀시의 일련 번호를 제공합니다;) (Microsoft의 지식 기반에 있음)

문안 인사!

요즘 대부분의 컴퓨터는 BIOS에서 CPU ID가 비활성화된 상태로 출시됩니다.보다 Wikipedia의 CPUID

CPUID가 활성화된 경우에도 실제로 최신 프로세서에서 사용할 수 있는 일련 번호가 있습니까?펜티엄 3일에 이 일련번호 문제가 전부 제기되었을 때 큰 항의가 있었던 것으로 기억합니다.

이것은 오래된 스레드입니다.그러나 나는 같은 문제가 있었지만 너무 많은 if, ands 또는 but 없이 작동하는 다음 논리를 얻었습니다.

CPU 일련번호의 문제점은 가상화된 환경에서 항상 작동하지 않는다는 것입니다.

Windows 기반 서버 세트를 사용하여 다음 논리를 수행했습니다.

Win32_BIOS 바이오스 일련번호를 알려드릴 수 있습니다.시스템이 가상화되면 모든 서버에 대해 동일한 BIOS 일련 번호가 생길 수 있다는 점을 명심해야 합니다.

Win32_NetworkAdapter 사용할 수 있는 MAC도 제공할 수 있습니다.NIC가 여러 개인 경우에는 MAC도 여러 개 있게 됩니다.

이 두 ID를 결합하여 물리적 서버와 가상 서버에 걸쳐 6000대의 서버 집합에 대한 고유한 집합을 모두 갖게 되었습니다.이것은 다음을 사용하여 구현하는 것이 정말 간단했습니다. ManagementClass & ManagementObject.

하지만 주의할 점은 다음과 같습니다.당신이 그것을 얻으려고 할 때 MO 인스턴스를 원격으로 연결하는 경우 대기 시간이 5ms 미만인 10Gbps 광 네트워크에서는 몇 초 이상이 소요됩니다.따라서 계산해 보면 단일 스레드 작업에 3시간 이상이 걸렸습니다.이것은 우선 순위가 낮은 트래픽에 가깝기 때문에 수집을 위해 네트워크에 스팸을 보내고 싶지 않았습니다. WMI 다중 스레드 호출에 대한 데이터.

CPU 일련 ID(PSN;Intel CPU의 Pentium III 이후 CPUID edx 비트 18 "psn" 프로세서 일련 번호;AMD 칩에는 psn이 전혀 없었습니다.

https://software.intel.com/en-us/forums/watercooler-catchall/topic/308483 (2005년 기준)

그러나 Pentium III Xeon, Mobile Pentium III 및 Pentium III 프로세서만이 Pentium III 프로세서에 도입된 프로세서 일련 번호 기능을 지원한다는 점을 명심하십시오.다른 인텔 프로세서는 프로세서 일련 번호 기능을 지원하지 않습니다.

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

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

EAX=3:프로세서 일련 번호도 참조하십시오.펜티엄 III § 개인 정보 보호 논란

그러면 프로세서의 일련 번호가 반환됩니다.프로세서 일련 번호는 Intel Pentium III에 도입되었지만 개인 정보 보호 문제로 인해 이 기능은 이후 모델에서는 더 이상 구현되지 않습니다(PSN 기능 비트는 항상 지워집니다).Transmeta의 Efficeon 및 Crusoe 프로세서도 이 기능을 제공합니다.그러나 AMD CPU는 어떤 CPU 모델에서도 이 기능을 구현하지 않습니다.

CPUZ 도구를 사용하십시오. http://www.cpuid.com/cpuz.php

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

  • 머리글: #include <cpuid.h>

메모: 프로세서 일련 번호는 Intel Pentium III에 도입되었지만 개인정보 보호 문제로 인해 이 기능은 이후 모델에서는 더 이상 구현되지 않습니다.

원천 : 위키피디아

Ivy Bridge CPU 이상에는 모두 PPIN(Protected Processor Identification Number)이 포함되어 있습니다.이 기능에 대한 액세스는 컴퓨터 펌웨어에 의해 차단될 수 있습니다.

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

좀 더 자세한 내용을 알려주세요:운영체제, 언어.

예를 들어 Windows에서는 WMI를 사용하여 얻을 수 있습니다. Win32_Processor.ProcessorId.

Windows에서는 시스템 호출이 있다고 확신합니다. Linux에서는 "sudo lshw"를 시도할 수 있지만 대부분의 커널은 CPU 일련 번호를 지원하지 않는 것 같습니다. 예비 연구에 따르면 고유하게 식별 가능한 컴퓨터에 대한 일반적인 분노는 완벽한 대답은 아닙니다.

무엇을 하려고 하시나요?거의 확실히 누군가가 이전에 해본 적이 있으므로 그들이 한 일을 재사용하거나 모방하는 것이 현명할 수 있습니다.

적절한 레지스터 설정으로 CPUID 명령을 실행하면 EAX, EBX, ECX 및 EDX의 프로세서 일련 번호가 검색됩니다.그러나 이 기능은 Pentium 3 이상의 프로세서에서만 사용할 수 있습니다.또한 Pentium 4 및 최신 프로세서에서는 명령이 항상 4개 레지스터 모두에서 0x00000000을 반환합니다.최신 모델 Pentium 3도 0x00000000을 반환할 수 있습니다.이 기능은 주로 복사 방지를 목표로 하여 소프트웨어를 특정 프로세서에 연결할 수 있도록 합니다.커뮤니티와 잘 어울리지 않아 소송이 이어졌습니다.이 기능은 최신 모델 P3 및 모든 최신 프로세서에서 제거되었습니다.이 기능은 호환성상의 이유로 최신 프로세서에 존재합니다.일련 번호가 있는 프로세서를 특별 주문할 수 있다는 소문이 있지만 최소 구매량은 프로세서 100만개 정도입니다.CPUID 명령을 실행하기 전 특정 레지스터 설정에 대해서는 해당 웹 사이트를 통해 제공되는 Intel 시스템 프로그래머 PDF를 확인하십시오.

또한 -


#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]);
}//*/

당신이 사용할 수있는 CPUID 명령.

나는 몇 개의 컴파일러가 언급 된 명령 주위에 래퍼 등을 제공한다고 생각합니다.여기에 예가 있습니다

#include <stdlib.h>
#include <string.h>
#include <intrinsics.h>

_CPUID cpuinfo;
int main(void) {
_cpuid(&cpuinfo);
printf("Vendor: %s\n", cpuinfo.Vendor);
return 0;
}

산출:

Vendor: GenuineIntel
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top