Numéro de série de la CPU
-
01-07-2019 - |
Question
Comment puis-je obtenir le numéro de série de la CPU sur un PC?
La solution
Sur la base de la balise "licensing" que vous avez utilisée pour votre question, vous obtiendrez de meilleurs résultats lecture de l'adresse MAC du réseau . Identifier un PC avec une adresse MAC n’est pas une méthode de protection contre la copie totalement incassable, même si elle est parfois utilisée.
Autres conseils
J'ai la réponse ultime à cela, sans aucune bibliothèque externe. Tapez simplement ceci:
Le bios Wmic reçoit le numéro de série
Cela vous donnera le numéro de série sur le châssis du PC;) (trouvé dans la base de connaissances de Microsoft)
Cordialement!
N'oubliez pas que, de nos jours, la plupart des ordinateurs sont livrés avec l'ID du processeur désactivé dans le BIOS. Voir CPUID sur Wikipedia
Même avec l'UCID activé, existe-t-il réellement un numéro de série disponible dans les processeurs modernes? Je me souviens du grand tollé suscité par le Pentium 3 jours lorsque cette question de numéro de série a été soulevée.
Ceci est un ancien fil. Mais j’ai eu le même problème, mais j’ai eu la logique suivante qui fonctionne sans trop de ifs, ni de mais.
Le problème avec le numéro de série de la CPU est qu’il ne fonctionne pas toujours dans un environnement virtualisé.
J'ai utilisé la logique suivante avec un ensemble de serveurs Windows:
Win32_BIOS
peut vous fournir un numéro de série du bios. Nous devons garder à l’esprit que si le système est virtualisé, vous pouvez vous retrouver avec le même numéro de série de bios pour tous les serveurs.
Win32_NetworkAdapter
peut vous fournir un MAC que vous pouvez également utiliser. Si vous avez plusieurs cartes réseau, vous obtiendrez plusieurs MAC.
En combinant ces deux identifiants, je possédais un ensemble unique sur un ensemble de 6 000 serveurs, physiques et virtuels. C’était très simple à mettre en oeuvre avec ManagementClass
& Amp; ManagementObject
.
Mais juste une mise en garde: lorsque vous essayez d’obtenir l’instance MO
à distance, cela prend plus de quelques secondes sur un réseau optique < 5ms avec une latence de 5 ms. Donc, si vous faites le calcul, cela m'a pris plus de 3 heures sur une opération à un seul thread. Comme il s’agit plus d’un trafic de faible priorité, je n’ai pas voulu spammer mon réseau pour collecter WMI
des données lors d’un appel multi-thread.
Il n'y a pas d'identifiant de série de la CPU (PSN; CPUID bit edx 18 & "; psn &". Numéro de série du processeur) après le Pentium III dans les processeurs Intel; et il n'y a jamais eu de psn dans les puces AMD:
https://software.intel.com/fr -us / forums / watercooler-catchall / topic / 308483 (2005)
Cependant, gardez à l'esprit que seuls les processeurs Pentium III Xeon, Mobile Pentium III et Pentium III prennent en charge la fonctionnalité de numéro de série de processeur introduite par le processeur Pentium III. Aucun autre processeur Intel ne prend en charge la fonction de numéro de série du processeur
https://en.wikipedia.org/wiki/Pentium_III#Controversy_about_privacy_issues
https://en.wikipedia.org/wiki/CPUID#EAX = 3: _Processor_Serial_Number
EAX = 3: numéro de série du processeur Voir aussi: Pentium III & # 167; Controverse sur les questions de confidentialité
Ceci retourne le numéro de série du processeur. Le numéro de série du processeur a été introduit sur Intel Pentium III, mais pour des raisons de confidentialité, cette fonctionnalité n'est plus implémentée sur les modèles suivants (le bit de fonctionnalité PSN est toujours effacé). Les processeurs Efficeon et Crusoe de Transmeta fournissent également cette fonctionnalité. Cependant, les processeurs AMD n’implémentent pas cette fonctionnalité dans les modèles de processeurs.
Utilisez l'outil CPUZ: http://www.cpuid.com/cpuz.php
__get_cpuid (unsigned int __level, unsigned int *__eax, unsigned int *__ebx, unsigned int *__ecx, unsigned int *__edx);
- En-tête:
#include <cpuid.h>
Remarque: Le numéro de série du processeur a été introduit sur Intel Pentium III, mais pour des raisons de confidentialité, cette fonctionnalité n'est plus implémentée sur les modèles ultérieurs.
Source: wikipedia
Les processeurs Ivy Bridge et plus récents incluent tous un numéro d’identification protégé du processeur (PPIN). L'accès à cette fonctionnalité peut être bloqué par le micrologiciel de l'ordinateur.
Quelques précisions supplémentaires: système d'exploitation, langue.
Par exemple, sous Windows, vous pouvez l’obtenir en utilisant WMI et en lisant Win32_Processor. Identificateur de processus .
Dans Windows, je suis sûr qu’il existe un appel système. Sous Linux, vous pouvez essayer & "sudo lshw &"; mais la plupart des noyaux ne semblent pas supporter les numéros de série des processeurs, et des recherches préliminaires semblent indiquer que l'indignation générale à l'encontre d'ordinateurs uniquement identifiables signifie qu'il n'y a pas de réponse parfaite.
Qu'est-ce que vous essayez de faire? Il est presque certain que quelqu'un l'a déjà fait et il peut être judicieux de réutiliser ou d'imiter ce qu'il a fait.
L'exécution de l'instruction CPUID avec les paramètres de registre appropriés permet d'extraire le numéro de série du processeur dans EAX, EBX, ECX et EDX. Cependant, cette fonctionnalité n'est disponible que sur les processeurs Pentium 3 et ultérieurs. De plus, sur les processeurs Pentium 4 et plus récents, l'instruction renvoie toujours 0x00000000 dans les 4 registres. Les modèles plus récents de Pentium 3 peuvent également renvoyer 0x00000000. Cette fonctionnalité visait principalement la protection contre la copie, permettant de lier les logiciels à des processeurs spécifiques. Cela n'a pas bien marché avec la communauté et des poursuites judiciaires ont suivi. La fonctionnalité a été supprimée des derniers modèles de P3 et de tous les processeurs les plus récents. La fonctionnalité est présente dans les nouveaux processeurs pour des raisons de compatibilité. On dit que vous pouvez utiliser des processeurs de commande spéciale avec des numéros de série, mais l'achat minimum est d'environ un million de processeurs. Pour connaître les paramètres de registre spécifiques préalables à l'exécution de l'instruction CPUID, consultez le PDF du programmeur système d'Intels disponible sur son site Web.
Aussi -
#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]);
}//*/
Vous pouvez utiliser la commande CPUID .
Je suppose que pas mal de compilateurs proposent des wrappers ou similaires autour du commander. Voici un exemple
#include <stdlib.h>
#include <string.h>
#include <intrinsics.h>
_CPUID cpuinfo;
int main(void) {
_cpuid(&cpuinfo);
printf("Vendor: %s\n", cpuinfo.Vendor);
return 0;
}
Sortie:
Vendor: GenuineIntel