Generazione di un ID macchina univoco


104

Ho bisogno di scrivere una funzione che generi un ID univoco per una determinata macchina che esegue un sistema operativo Windows.

Attualmente, sto usando WMI per interrogare vari parametri hardware e concatenarli insieme e sottoporli a hash per ricavare l'id univoco. La mia domanda è: quali sono i parametri suggeriti che dovrei usare? Attualmente, sto usando una combinazione di dati bios \ cpu \ disk per generare l'ID univoco. E sto usando il primo risultato se sono presenti più risultati per ogni metrica.

Tuttavia, ho riscontrato un problema in cui una macchina che esegue il doppio avvio in 2 diversi sistemi operativi Windows genera diversi codici del sito su ciascun sistema operativo, il che idealmente non dovrebbe accadere.

Per riferimento, queste sono le metriche che sto attualmente utilizzando:

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

Risposte:


25

Analizza tu stesso l' SMBIOS e modificalo a una lunghezza arbitraria. Vedere la specifica PDF per tutte le strutture SMBIOS disponibili.

Per interrogare le informazioni SMBIOS da Windows potresti usare EnumSystemFirmwareEntries, EnumSystemFirmwareTablese GetSystemFirmwareTable.

IIRC, l '"ID univoco" dall'istruzione CPUID è deprecato da P3 e versioni successive.


14
Notare che queste funzioni richiedono almeno Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 o Windows Server 2003 con SP1.
jcoffland

33
Una nota per non fare quello che ho fatto, ovvero chiamare GetSystemFirmwareTable ('RSMB' ...); e hash l'intero buffer SMBIOSTableData. Ha funzionato alla grande finché non mi sono imbattuto in una workstation che ha scritto la sua temperatura interna della CPU su quella tabella, il che significa che il mio ID univoco cambiava ogni pochi secondi.
Thomas,

Esiste un codice sorgente disponibile per questa soluzione?
Just Shadow

@Thomas, quindi quale soluzione hai finalmente scelto?
Smith

@ Smith Il mio obiettivo era un piccolo id di 8 caratteri. Leggendo le specifiche, ho deciso quali campi potevano variare e li ho esclusi. Poi per molti anni ho tagliato più campi che non sono costanti dalle macchine. Alla fine, ho finito per archiviare una copia crittografata dei dati grezzi che ho usato come input e ho creato una closeEnoughfunzione in modo da accettare un ID non corrispondente se variava solo in 2 campi. Includo anche dettagli sul processore e sul disco rigido del sistema nel mio hash perché all'inizio ho avuto collisioni tra sistemi identici.
Thomas

72

Ho avuto lo stesso problema e dopo una piccola ricerca ho deciso che la cosa migliore sarebbe stata leggere la MachineGuidchiave di registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, come suggerito da @Agnus. Viene generato durante l'installazione del sistema operativo e non cambierà a meno che non si effettui un'altra nuova installazione del sistema operativo. A seconda della versione del sistema operativo, potrebbe contenere l'indirizzo MAC dell'adattatore di rete incorporato (più alcuni altri numeri, inclusi quelli casuali) o un numero pseudocasuale, il successivo per le versioni del sistema operativo più recenti (dopo XP SP2, credo, ma non sono sicuro). Se è uno pseudocasuale in teoria, può essere contraffatto, se due macchine hanno lo stesso stato iniziale, compreso l'orologio in tempo reale. In pratica, questo sarà raro, ma fai attenzione se ti aspetti che sia una base per la sicurezza che può essere attaccata da hacker incalliti.

Ovviamente una voce di registro può anche essere facilmente modificata da chiunque per creare un GUID della macchina, ma quello che ho scoperto è che ciò interromperebbe il normale funzionamento di così tanti componenti di Windows che nella maggior parte dei casi nessun utente regolare lo farebbe (di nuovo, fai attenzione per hacker accaniti).


6
Puoi usare il flag KEY_WOW64_64KEY per assicurarti di ottenere sempre la versione "reale" della chiave di registro, credo.
Colen

13
Se cloni un'immagine di unità, rimarrà la stessa. Quindi questo non è affatto sicuro e molto insicuro.
bitbonk

19
Per chiarire il punto, quando inserisco misure DRM nel software, il mio obiettivo principale è impedire alle persone di creare un crack che consenta ai pirati "professionisti" di vendere copie illegali del software senza alcuna limitazione. Non sono così preoccupato per un hacker occasionale che clona l'unità di un suo amico solo per poter utilizzare il mio software. In questi casi quelle persone di solito hanno più tempo che denaro e comunque non lo pagherebbero. Se il software costa $ 100 e il tuo stipendio è superiore a $ 50 / h, lo paghi. La seccatura richiederà più del tuo tempo di 2 ore.
Fabio Ceconello

7
In particolare, in un ambiente in cui Windows viene installato clonando un'immagine della macchina master, MachineGuid sarà identico per tutti loro.
nandhp

8
No, se lo fai correttamente e legalmente, usando sysprep e all. Per quelli che hanno copie piratate di Windows e "solo clone", questa è un'altra questione. Ma comunque non sarebbero stati fermati così facilmente.
Fabio Ceconello

34

Con il nostro strumento di licenza consideriamo i seguenti componenti

  • Indirizzo MAC
  • CPU (non il numero di serie, ma il profilo effettivo della CPU come stepping e modello)
  • Numero di serie dell'unità di sistema (non l'etichetta del volume)
  • Memoria
  • Modello e fornitore del CD-ROM
  • Modello e fornitore della scheda video
  • Controller IDE
  • Controller SCSI

Tuttavia, invece di eseguire semplicemente l'hashing dei componenti e creare un sistema pass / fail, creiamo un'impronta digitale comparabile che può essere utilizzata per determinare quanto siano diversi i due profili della macchina. Se la valutazione della differenza è superiore a una tolleranza specificata, chiedere all'utente di attivarla nuovamente.

Negli ultimi 8 anni, in uso con centinaia di migliaia di installazioni di utenti finali, abbiamo scoperto che questa combinazione funziona bene per fornire un ID macchina univoco affidabile, anche per macchine virtuali e installazioni di sistemi operativi clonati.


1
Come si determina quale indirizzo MAC si utilizza? Una macchina può avere più NIC e queste vengono aggiunte dinamicamente (la connessione a una nuova VPN tramite un'applet aggiungerà una NIC virtuale). Alcuni sono virtuali, hanno il tipo Ethernet e sono difficili da identificare come virtuali. Altri sono su / giù a seconda delle condizioni della rete (wifi)
Marek

Usiamo tutti i NIC fisici, esclusi NICS virtuali, blue-tooth, ecc. Sono tutti combinati per creare hash unificato.
Paul Alexander

Perché si consiglia di non utilizzare il numero di serie della CPU?
Mojtaba Rezaeian

3
Il numero di serie della CPU non è abilitato da anni in un chip Intel. Le chiamate di sistema esistono ancora, ma non restituiscono un valore stabile. Non ricordo cosa restituisce: dati fittizi o lo stesso valore per tutte le macchine. in entrambi i casi non è una metrica hardware affidabile.
Paul Alexander

1
@PaulAlexander lo strumento a cui hai fatto riferimento convalida tutti i parametri che hai menzionato o alcuni di essi funzioneranno? Perché i sistemi ora un giorno di solito non consistono in un CD-ROM
FaizanHussainRabbani

3

Che ne dici di utilizzare solo l'ID univoco del processore?


14
Non è una proprietà ammortizzata di questi tempi?
Jake Wilson

15
Forse significa "deprecato" ... I produttori di CPU hanno iniziato a inserire ID univoci in una fase, ma a causa di contraccolpi su questioni di privacy, si sono fermati di nuovo. Quindi scoprirai che alcuni hanno un ID univoco ma la maggior parte delle CPU moderne no.
TripleAntigen

1
Per riferimento, solo un breve lotto di Pentium III aveva numeri di serie della CPU che potevano essere letti. Mentre le versioni successive avevano un numero di serie, era disabilitato per impostazione predefinita. Il Pentium IV e le successive CPU non lo supportavano affatto.
Paul Alexander

2

Odio essere il ragazzo che dice "stai solo sbagliando" (odio sempre quel ragazzo;) ma ...

Deve essere generato ripetutamente per la macchina unica? Potresti semplicemente assegnare l'identificatore o fare una chiave pubblica / privata? Forse se potessi generare e memorizzare il valore, potresti accedervi da entrambe le installazioni del sistema operativo sullo stesso disco?

Probabilmente hai esplorato queste opzioni e non funzionano per te, ma in caso contrario, è qualcosa da considerare.

Se non è una questione di fiducia degli utenti, puoi semplicemente utilizzare gli indirizzi MAC.


5
Gli indirizzi MAC non funzioneranno se la macchina non dispone di una scheda di rete.
Brian,

7
@ Brian - hai davvero bisogno di un valore univoco per identificare un computer che non dispone di una scheda di rete? Sembra una scommessa abbastanza sicura che la macchina abbia una carta.
romandas

1

Dovresti cercare di utilizzare l'indirizzo MAC sulla scheda di rete (se esiste). Di solito sono unici ma possono essere fabbricati. Ho utilizzato un software che genera il suo file di licenza in base all'indirizzo MAC della scheda di rete, quindi è considerato un modo abbastanza affidabile per distinguere tra computer.


6
No, non lo sono. Molti produttori ti permettono di cambiarli. Questo è molto utile quando si lavora con i cluster perché alcuni fornitori forniscono a tutti i computer lo stesso indirizzo MAC (abbiamo riscontrato questo problema alcuni anni fa).
gizmo

Questa è un'idea valida in molti casi, la domanda non specifica lo spoof-proodness o offline: in genere si desidera generare un ID univoco se si desidera identificare in una rete
Hurda

È possibile avere più dispositivi di rete nella stessa macchina; non è garantito che verranno sempre rilevati nello stesso ordine o che non verranno sostituiti a un certo punto. È meglio utilizzare hardware che probabilmente sarà più permanente.
Agi Hammerthief

1

Per una delle mie applicazioni, utilizzo il nome del computer se non è un computer di dominio o il SID dell'account della macchina del dominio per i computer del dominio. Mark Russinovich ne parla in questo post del blog, Machine SID :

L'ultimo caso in cui la duplicazione di SID sarebbe un problema è se un'applicazione distribuita utilizzava i SID della macchina per identificare in modo univoco i computer. Nessun software Microsoft lo fa e l'utilizzo del SID della macchina in questo modo non funziona solo per il fatto che tutti i controller di dominio hanno lo stesso SID della macchina. Il software che si basa su identità di computer univoche utilizza nomi di computer o SID di dominio del computer (il SID degli account computer nel dominio).

È possibile accedere al SID dell'account della macchina del dominio tramite LDAP o System.DirectoryServices.


1

Nel mio programma controllo prima la presenza di Terminal Server e utilizzo WTSClientHardwareId. Altrimenti l'indirizzo MAC del PC locale dovrebbe essere adeguato.

Se davvero si vuole utilizzare l'elenco delle proprietà che hai fornito lasciare fuori le cose come Namee DriverVersion, Clockspeede così via in quanto è forse dipende dal sistema operativo. Prova a fornire le stesse informazioni su entrambi i sistemi operativi e tralascia quelle che differiscono tra loro.



0

Perché non utilizzare l'indirizzo MAC della scheda di rete?


14
L'indirizzo Mac può essere falsificato
Henry B,

Questa è un'idea valida in molti casi, la domanda non specifica lo spoof-proodness o offline - in genere si desidera generare un ID univoco se si desidera identificare in una rete
Hurda

0

Forse barare un po ', ma l'indirizzo MAC dell'adattatore Ethernet di una macchina cambia raramente senza che la scheda madre cambi in questi giorni.


Molti produttori ti permettono di cambiarli. Questo è molto utile quando si lavora con i cluster perché alcuni fornitori forniscono a tutti i computer lo stesso indirizzo MAC (abbiamo riscontrato questo problema alcuni anni fa).
gizmo

1
Il MAC è totalmente inaffidabile perché può essere cambiato così facilmente (basta una ricerca su Google e vedrai molti strumenti gratuiti che lo fanno). Lo stesso per WMI.
InTheNameOfScience

0

Puoi estrarre un qualche tipo di numero di serie del produttore o tag di servizio?

Il nostro negozio è un negozio Dell, quindi utilizziamo il codice di matricola che è univoco per ogni macchina per identificarli. So che può essere interrogato dal BIOS, almeno in Linux, ma non so improvvisamente come farlo in Windows.


0

Avevo un vincolo aggiuntivo, stavo usando .net express, quindi non potevo usare il meccanismo di query hardware standard. Quindi ho deciso di utilizzare Power Shell per eseguire la query. Il codice completo ha questo aspetto:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

-1

Cerca CPUID per un'opzione. Potrebbero esserci dei problemi con i sistemi multi-CPU.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.