Gerando uma ID de máquina única


104

Eu preciso escrever uma função que gere um id que seja exclusivo para uma determinada máquina executando um sistema operacional Windows.

Atualmente, estou usando o WMI para consultar vários parâmetros de hardware e concatená-los juntos e hash para derivar o id exclusivo. Minha pergunta é: quais são os parâmetros sugeridos que devo usar? Atualmente, estou usando uma combinação de dados bios \ cpu \ disk para gerar a id exclusiva. E estou usando o primeiro resultado se houver vários resultados para cada métrica.

No entanto, encontrei um problema em que uma máquina que inicializa duas vezes em dois sistemas operacionais Windows diferentes gera códigos de site diferentes em cada sistema operacional, o que idealmente não deveria acontecer.

Para referência, estas são as métricas que estou usando atualmente:

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

Respostas:


25

Analise o SMBIOS por conta própria e crie um hash para um comprimento arbitrário. Consulte a especificação em PDF para todas as estruturas SMBIOS disponíveis.

Para consultar as informações SMBIOS do Windows, você pode usar EnumSystemFirmwareEntries, EnumSystemFirmwareTablese GetSystemFirmwareTable.

IIRC, o "id exclusivo" da instrução CPUID foi substituído pelo P3 e mais recentes.


14
Observe que essas funções requerem pelo menos Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 ou Windows Server 2003 com SP1.
jcoffland

33
Uma nota para não fazer o que fiz, que foi chamar GetSystemFirmwareTable ('RSMB' ...); e hash todo o buffer SMBIOSTableData. Funcionou muito bem até que encontrei uma estação de trabalho que escreveu sua temperatura interna de cpu naquela tabela, o que significa que minha id única mudava a cada poucos segundos.
Thomas

Existe algum código-fonte disponível para esta solução?
Just Shadow

@Thomas, então qual solução você finalmente escolheu?
Smith,

@Smith Meu objetivo era um pequeno id de 8 caracteres. Lendo a especificação, tomei decisões sobre quais campos podem variar e os excluí. Então, ao longo de muitos anos, cortei mais campos que não são constantes de máquinas. Por fim, acabei armazenando uma cópia criptografada dos dados brutos que usei como entrada e fiz uma closeEnoughfunção para aceitar um id não correspondente se variasse apenas em 2 campos. Também incluo detalhes sobre o processador e o disco rígido do sistema em meu hash porque no início tive colisões entre sistemas idênticos.
Thomas,

72

Tive o mesmo problema e após um pouco de pesquisa decidi que o melhor seria ler a MachineGuidchave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, como sugeriu @Agnus. Ele é gerado durante a instalação do sistema operacional e não mudará, a menos que você faça uma nova instalação do sistema operacional. Dependendo da versão do sistema operacional, ele pode conter o endereço MAC do adaptador de rede embutido (mais alguns outros números, incluindo aleatório), ou um número pseudoaleatório, o mais recente para versões mais recentes do sistema operacional (após o XP SP2, eu acredito, mas não tenho certeza). Se for um pseudo-aleatório, teoricamente, pode ser forjado - se duas máquinas tiverem o mesmo estado inicial, incluindo relógio de tempo real. Na prática, isso será raro, mas esteja ciente se você espera que seja uma base de segurança que pode ser atacada por hackers radicais.

É claro que uma entrada de registro também pode ser facilmente alterada por qualquer pessoa para forjar um GUID de máquina, mas o que eu descobri é que isso interromperia a operação normal de tantos componentes do Windows que na maioria dos casos nenhum usuário regular faria isso (de novo, cuidado para hackers hardcore).


6
Você pode usar o sinalizador KEY_WOW64_64KEY para ter certeza de sempre obter a versão "real" da chave do registro, eu acho.
Colen

13
Se você clonar uma imagem de unidade, ela permanecerá a mesma. Portanto, isso não é totalmente seguro e muito inseguro.
bitbonk

19
Para esclarecer, quando coloco medidas de DRM no software, meu principal objetivo é impedir que as pessoas criem um crack que permita a piratas 'profissionais' vender cópias ilegais do software sem qualquer limitação. Não estou preocupado com um hacker ocasional que clona a unidade de seu amigo apenas para poder usar meu software. Nesses casos, essas pessoas geralmente têm mais tempo do que dinheiro e não estariam pagando por isso de qualquer maneira. Se o software custar $ 100 e seu salário for superior a $ 50 / h, você apenas paga por ele. O aborrecimento vai demorar mais do que 2h.
Fabio Ceconello

7
Em particular, em um ambiente onde o Windows é instalado por clonagem de uma imagem de máquina mestre, o MachineGuid será idêntico para todos eles.
nandhp de

8
Não se você fizer isso de forma correta e legal, usando sysprep & all. Para quem tem cópias piratas do windows e "apenas clona", isso é outro assunto. Mas eles não seriam parados tão facilmente, de qualquer maneira.
Fabio Ceconello

34

Com nossa ferramenta de licenciamento , consideramos os seguintes componentes

  • Endereço MAC
  • CPU (não é o número de série, mas o perfil real da CPU, como revisão e modelo)
  • Número de série da unidade do sistema (não etiqueta de volume)
  • Memória
  • Modelo e fornecedor de CD-ROM
  • Modelo e fornecedor da placa de vídeo
  • Controlador IDE
  • Controlador SCSI

No entanto, em vez de apenas fazer o hash dos componentes e criar um sistema aprovado / reprovado, criamos uma impressão digital comparável que pode ser usada para determinar a diferença entre dois perfis de máquina. Se a classificação de diferença estiver acima de uma tolerância especificada, peça ao usuário para ativar novamente.

Descobrimos nos últimos 8 anos, em uso com centenas de milhares de instalações de usuário final, que essa combinação funciona bem para fornecer uma id de máquina única e confiável - mesmo para máquinas virtuais e instalações de SO clonadas.


1
Como você determina qual endereço MAC você usa? Uma máquina pode ter várias NICs e elas são adicionadas dinamicamente (conectar-se a uma nova VPN por meio de um miniaplicativo adicionará uma NIC virtual). Alguns são virtuais, possuem tipo Ethernet e são difíceis de identificar como virtuais. Outros são Up / Down dependendo das condições da rede (wi-fi)
Marek

Usamos todos os NICs físicos - exceto NICS virtuais, dente azul, etc. Eles são todos combinados para criar hash unificado.
Paul Alexander

Por que você recomenda não usar o número de série da CPU?
Mojtaba Rezaeian

3
O número de série da CPU não é habilitado em um chip Intel há anos. As chamadas do sistema ainda existem, mas não retorna um valor estável. Não consigo me lembrar o que ele retorna - dados fictícios ou o mesmo valor para todas as máquinas. de qualquer forma, não é uma métrica de hardware confiável.
Paul Alexander de

1
@PaulAlexander a ferramenta que você referiu valida todos os parâmetros que você mencionou ou alguns deles irão funcionar? Porque os sistemas hoje em dia geralmente não consistem em um CD-ROM
FaizanHussainRabbani

3

Que tal usar apenas o UniqueID do processador?


14
Não é uma propriedade depreciada hoje em dia?
Jake Wilson

15
Talvez ele queira dizer 'obsoleto' ... Os fabricantes de CPU começaram a colocar IDs exclusivos em um estágio, mas devido a reações adversas em relação a questões de privacidade, eles pararam novamente. Portanto, você descobrirá que alguns têm um ID exclusivo, mas a maioria das CPUs modernas não.
TripleAntigen

1
Para referência, apenas um pequeno lote de Pentium IIIs teve números de série de CPU que podiam ser lidos. Embora as versões posteriores tenham um número de série, ele foi desativado por padrão. Pentium IV e CPUs posteriores simplesmente não o suportavam.
Paul Alexander

2

Eu odeio ser o cara que diz: "você só está fazendo errado" (eu sempre odeio aquele cara;) mas ...

Ele precisa ser gerado repetidamente para a máquina exclusiva? Você poderia apenas atribuir o identificador ou fazer uma chave pública / privada? Talvez se você pudesse gerar e armazenar o valor, você poderia acessá-lo de ambas as instalações do sistema operacional no mesmo disco?

Você provavelmente já explorou essas opções e elas não funcionam para você, mas se não, é algo a se considerar.

Se não for uma questão de confiança do usuário, você pode apenas usar endereços MAC.


5
Os endereços MAC não funcionarão se a máquina não tiver uma placa de rede.
Brian de

7
@Brian - você realmente precisa de um valor exclusivo para identificar um computador que não possui uma placa de rede? Parece uma aposta bastante segura que a máquina tem um cartão.
romandas,

1

Você deve procurar usar o endereço MAC na placa de rede (se houver). Geralmente são únicos, mas podem ser fabricados. Usei um software que gera seu arquivo de licença com base no endereço MAC do adaptador de rede, por isso é considerado uma maneira bastante confiável de distinguir entre computadores.


6
Não, eles não são. Muitos fabricantes permitem que você os altere. Isso é muito útil ao trabalhar com clusters, pois alguns dos fornecedores fornecem todos os computadores com o mesmo endereço MAC (encontramos esse problema há alguns anos).
gizmo

Esta é uma ideia válida em muitos casos, a pergunta | não especifica spoof-proodness ou offline - você geralmente deseja gerar um ID exclusivo se quiser se identificar em uma rede
Hurda

É possível ter vários dispositivos de rede na mesma máquina; você não tem garantia de que eles sempre serão detectados na mesma ordem ou que não serão substituídos em algum ponto. É melhor usar algum hardware que provavelmente seja mais permanente.
Agi Hammerthief

1

Para um dos meus aplicativos, eu uso o nome do computador, se for um computador sem domínio, ou o SID da conta da máquina de domínio para computadores de domínio. Mark Russinovich fala sobre isso nesta postagem do blog, Machine SID :

O último caso em que a duplicação de SIDs seria um problema é se um aplicativo distribuído usasse SIDs de máquina para identificar computadores de maneira exclusiva. Nenhum software da Microsoft faz isso e usar o SID da máquina dessa forma não funciona apenas pelo fato de que todos os DCs têm o mesmo SID da máquina. O software que depende de identidades de computador exclusivas usa nomes de computador ou SIDs de domínio de computador (o SID das contas de computador no domínio).

Você pode acessar o SID da conta da máquina de domínio via LDAP ou System.DirectoryServices.


1

Em meu programa, primeiro verifico o Terminal Server e uso o WTSClientHardwareId. Caso contrário, o endereço MAC do PC local deve ser adequado.

Se você realmente quiser usar a lista de propriedades que forneceu deixar de fora coisas como Namee DriverVersion, Clockspeed, etc., já que é possivelmente OS dependente. Tente gerar as mesmas informações em ambos os sistemas operacionais e omita as diferenças entre eles.



0

Por que não usar o endereço MAC da sua placa de rede?


14
O endereço Mac pode ser falsificado
Henry B

Esta é uma ideia válida em muitos casos, a pergunta não especifica spoof-proodness ou offline - você geralmente deseja gerar um ID exclusivo se quiser se identificar em uma rede
Hurda

0

Talvez trapaceando um pouco, mas o endereço MAC do adaptador Ethernet de uma máquina raramente muda sem a mudança da placa-mãe atualmente.


Muitos fabricantes permitem que você os altere. Isso é muito útil ao trabalhar com clusters, pois alguns dos fornecedores fornecem todos os computadores com o mesmo endereço MAC (encontramos esse problema há alguns anos).
gizmo

1
O MAC não é totalmente confiável porque pode ser facilmente alterado (basta fazer uma pesquisa no google e você verá muitas ferramentas gratuitas que fazem isso). O mesmo para WMI.
InTheNameOfScience

0

Você pode puxar algum tipo de número de série do fabricante ou etiqueta de serviço?

Nossa loja é uma loja Dell, então usamos a etiqueta de serviço que é exclusiva para cada máquina para identificá-los. Sei que pode ser consultado na BIOS, pelo menos no Linux, mas não sei de imediato como fazer no Windows.


0

Eu tinha uma restrição adicional, estava usando .net express, então não podia usar o mecanismo de consulta de hardware padrão. Portanto, decidi usar o power shell para fazer a consulta. O código completo se parece com isto:

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

Procure CPUID para uma opção. Pode haver alguns problemas com sistemas multi-CPU.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.