Benzersiz bir makine kimliği oluşturma


104

Windows işletim sistemi çalıştıran belirli bir makine için benzersiz bir kimlik oluşturan bir işlev yazmam gerekiyor.

Şu anda, çeşitli donanım parametrelerini sorgulamak ve bunları bir araya getirmek ve benzersiz kimliği elde etmek için hash etmek için WMI kullanıyorum. Sorum şu, kullanmam gereken önerilen parametreler nelerdir? Şu anda, benzersiz kimliği oluşturmak için bios \ cpu \ disk verilerinin bir kombinasyonunu kullanıyorum. Ve her metrik için birden fazla sonuç varsa ilk sonucu kullanıyorum.

Ancak, 2 farklı Windows işletim sisteminde çift önyükleme yapan bir makinenin her işletim sisteminde farklı site kodları oluşturduğu ve ideal olarak olmaması gereken bir sorunla karşılaştım.

Referans olarak, şu anda kullandığım metrikler:

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

Yanıtlar:


25

SMBIOS'u kendiniz ayrıştırın ve rastgele bir uzunlukta hash edin. Mevcut tüm SMBIOS yapıları için PDF spesifikasyonuna bakın .

Windows'tan SMBIOS bilgilerini sorgulamak için EnumSystemFirmwareEntries, EnumSystemFirmwareTablesve kullanabilirsiniz GetSystemFirmwareTable.

IIRC, CPUID talimatındaki "benzersiz kimlik" P3 ve daha yeni sürümlerden kaldırılmıştır.


14
Bu işlevlerin en az Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 veya Windows Server 2003 SP1 gerektirdiğini unutmayın.
jcoffland

33
GetSystemFirmwareTable ('RSMB' ...) olarak adlandırdığım şeyi yapmama notu; ve tüm SMBIOSTableData arabelleğini hashleyin. İşlemci iç sıcaklığını bu tabloya yazan bir iş istasyonuyla karşılaşana kadar harika çalıştı, yani benzersiz kimliğim birkaç saniyede bir değişti.
Thomas

Bu çözüm için herhangi bir kaynak kodu var mı?
Just Shadow

@Thomas, sonunda hangi çözümü seçtin?
Smith

@Smith Amacım 8 karakterli küçük bir kimlikti. Spesifikasyonu okurken hangi alanların değişebileceğine karar verdim ve bunları hariç tuttum. Sonra yıllar içinde, makinelerden sabit olmayan daha fazla alanı kestim. Son olarak, girdi olarak kullandığım ham verilerin şifrelenmiş bir kopyasını depoladım ve closeEnougheşleşmeyen bir kimliği yalnızca 2 alanda değişse kabul edeceğim bir işlev yaptım . İşlemci ve sistem sabit sürücüsüyle ilgili ayrıntıları da hashime dahil ettim, çünkü erken dönemde aynı sistemler arasında çarpışmalar yaşadım.
Thomas

72

Aynı sorunu yaşadım ve küçük bir araştırmadan sonra en iyisinin MachineGuidkayıt defteri anahtarında okumak olduğuna karar verdim, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography@Agnus'un önerdiği gibi. İşletim sistemi kurulumu sırasında oluşturulur ve yeni bir işletim sistemi yüklemesi yapmadığınız sürece değişmez. İşletim sistemi sürümüne bağlı olarak, yerleşik ağ bağdaştırıcısı MAC adresini (artı rasgele dahil olmak üzere bazı diğer numaraları) veya daha yeni işletim sistemi sürümleri için daha sonra olan bir sahte rasgele sayı içerebilir (inanıyorum ki XP SP2'den sonra, ama emin değilim). Eğer sözde rasgele ise teorik olarak sahte olabilir - eğer iki makine gerçek zamanlı saat dahil aynı başlangıç ​​durumuna sahipse. Pratikte bu nadir olacaktır, ancak sert bilgisayar korsanları tarafından saldırıya uğrayabilecek bir güvenlik üssü olmasını bekliyorsanız dikkatli olun.

Elbette bir kayıt defteri girişi, bir makine GUID'sini taklit etmek için herkes tarafından kolayca değiştirilebilir, ancak bulduğum şey, bu, çoğu durumda normal bir kullanıcının yapmayacağı kadar çok sayıda Windows bileşeninin normal çalışmasını bozacağıdır (yine, dikkat edin) sert hackerlar için).


6
Her zaman kayıt anahtarının "gerçek" sürümünü aldığınızdan emin olmak için KEY_WOW64_64KEY bayrağını kullanabilirsiniz, sanırım.
Colen

13
Bir sürücü görüntüsünü klonlarsanız, bu aynı kalacaktır. Yani bu hiç de güvenli değil ve çok güvensiz.
bitbonk

19
Konuyu açıklığa kavuşturmak için, DRM önlemlerini yazılıma koyduğumda, asıl amacım insanların 'profesyonel' korsanların yazılımın yasadışı kopyalarını herhangi bir sınırlama olmaksızın satmasını sağlayan bir çatlak oluşturmasını engellemektir. Sırf benim yazılımımı kullanabilmek için arkadaşının sürücüsünü klonlayan ara sıra bir bilgisayar korsanı için endişelenmiyorum. Bu gibi durumlarda, bu insanlar genellikle paradan daha fazla zamana sahip olurlar ve zaten bunun için para ödemeyeceklerdir. Yazılım 100 $ 'a mal oluyorsa ve ücretiniz 50 $ / saatten fazlaysa, sadece ücretini ödersiniz. Güçlük, 2 saatten daha fazla zamanınızı alacaktır.
Fabio Ceconello

7
Özellikle, Windows'un bir ana makine görüntüsünü klonlayarak kurulduğu bir ortamda, MachineGuid hepsi için aynı olacaktır.
nandhp

8
Bunu sysprep & all kullanarak doğru ve yasal bir şekilde yaparsanız, hayır. Korsan pencere kopyalarına sahip olanlar ve "sadece klonla" olanlar için bu başka bir mesele. Ama yine de bu kadar kolay durdurulamazlar.
Fabio Ceconello

34

Bizim ile lisans aracı aşağıdaki bileşenleri göz önünde

  • Mac Adresi
  • CPU (Seri numarası değil, adım ve model gibi gerçek CPU profili)
  • Sistem Sürücüsü Seri Numarası (Birim Etiketi Değil)
  • Hafıza
  • CD-ROM modeli ve satıcı
  • Ekran Kartı modeli ve satıcısı
  • IDE Denetleyicisi
  • SCSI Denetleyicisi

Bununla birlikte, bileşenlere hashing uygulamak ve bir başarılı / başarısız sistemi oluşturmak yerine, iki makine profilinin ne kadar farklı olduğunu belirlemek için kullanılabilecek karşılaştırılabilir bir parmak izi oluşturuyoruz . Fark derecesi belirtilen toleransın üzerindeyse, kullanıcıdan yeniden etkinleştirmesini isteyin.

Son 8 yılda yüz binlerce son kullanıcı yüklemesiyle kullanımda olan bu kombinasyonun, sanal makineler ve klonlanmış işletim sistemi kurulumları için bile güvenilir şekilde benzersiz bir makine kimliği sağlamak için iyi çalıştığını gördük.


1
Hangi MAC adresini kullandığınızı nasıl belirlersiniz? Bir makinede birden çok NIC bulunabilir ve bunlar dinamik olarak eklenir (yeni bir VPN'e bir uygulama aracılığıyla bağlanmak sanal bir NIC ekleyecektir). Bazıları sanaldır, Ethernet türüne sahiptir ve sanal olarak tanımlanması zordur. Diğerleri ağ koşullarına bağlı olarak Yukarı / Aşağı (wifi)
Marek

Sanal NICS, mavi diş vb. Hariç tüm fiziksel NIC'leri kullanıyoruz. Hepsi birleşik karma oluşturmak için birleştirilmiştir.
Paul Alexander

Neden CPU seri numarasını kullanmamanızı tavsiye ediyorsunuz?
Mojtaba Rezaeian

3
CPU seri numarası yıllardır bir Intel çipinde etkinleştirilmemiştir. Sistem çağrıları hala var, ancak kararlı bir değer döndürmüyor. Ne döndürdüğünü hatırlayamıyorum - ya kukla veriler ya da tüm makineler için aynı değer. her iki durumda da güvenilir bir donanım ölçütü değildir.
Paul Alexander

1
@PaulAlexander bahsettiğiniz araç, bahsettiğiniz tüm parametreleri doğrular mı yoksa birkaç tanesi çalışır mı? Sistemler artık bir gün yapmak Çünkü genellikle bir CD-ROM'u oluşur
FaizanHussainRabbani

3

İşlemcinin UniqueID'sini kullanmaya ne dersiniz?


14
Bu günlerde amortismana tabi bir mülk değil mi?
Jake Wilson

15
Belki de 'kullanımdan kaldırıldı' demek istiyor ... CPU üreticileri bir aşamada benzersiz kimlikler koymaya başladılar, ancak gizlilik konularındaki geri tepme nedeniyle tekrar durdular. Dolayısıyla, bazılarının benzersiz bir kimliği olduğunu ancak çoğu modern CPU'nun olmadığını göreceksiniz.
TripleAntigen

1
Referans olarak, sadece kısa bir Pentium III grubunun okunabilen CPU seri numaraları vardı. Sonraki sürümlerin bir seri numarası varken, varsayılan olarak devre dışı bırakıldı. Pentium IV ve sonraki CPU'lar bunu hiç desteklemiyordu.
Paul Alexander

2

"Yanlış yapıyorsun" diyen adam olmaktan nefret ediyorum (o adamdan her zaman nefret ederim;) ama ...

Benzersiz makine için tekrarlanabilir şekilde oluşturulması gerekiyor mu? Sadece tanımlayıcıyı atayabilir misiniz veya bir genel / özel anahtar yapabilir misiniz? Belki değeri oluşturabilir ve depolayabilirseniz, ona aynı diskteki her iki işletim sistemi kurulumundan da erişebilirsiniz?

Muhtemelen bu seçenekleri keşfetmişsinizdir ve sizin için işe yaramazlar, ancak değilse, dikkate alınması gereken bir şeydir.

Kullanıcı güveni meselesi değilse, sadece MAC adreslerini kullanabilirsiniz.


5
Makinede ağ kartı yoksa MAC adresleri çalışmayacaktır.
Brian

7
@Brian - Ağ kartı olmayan bir bilgisayarı tanımlamak için gerçekten benzersiz bir değere ihtiyacınız var mı? Makinede bir kart var oldukça güvenli bir bahis gibi görünüyor.
romandas

1

Ağ kartındaki (varsa) MAC adresini kullanmayı araştırmalısınız. Bunlar genellikle benzersizdir ancak fabrikasyon yapılabilir. Lisans dosyasını ağ bağdaştırıcınızın MAC adresinize göre oluşturan bir yazılım kullandım, bu nedenle bilgisayarlar arasında ayrım yapmanın oldukça güvenilir bir yolu olarak görülüyor.


6
Hayır, değiller. Birçok üretici bunları değiştirmenize izin verir. Bu, kümelerle çalışırken çok yardımcıdır çünkü bazı satıcılar size tüm bilgisayarı aynı MAC adresine verir (bu sorunu birkaç yıl önce ele aldık).
gizmo

Bu birçok durumda geçerli bir fikirdir, soru sahtekarlığı belirtmez veya çevrimdışıdır - genellikle bir ağda tanımlamak istiyorsanız benzersiz bir kimlik oluşturmak istersiniz
Hurda

Aynı makinede birden fazla Ağ cihazına sahip olmak mümkündür; Her zaman aynı sırada tespit edilecekleri veya bir noktada değiştirilmeyecekleri garanti edilmez. Daha kalıcı olma ihtimali olan bazı donanımları kullanmak daha iyidir.
Agi Hammerthief

1

Uygulamalarımdan biri için, ya etki alanı olmayan bilgisayarsa bilgisayar adını ya da etki alanı bilgisayarları için etki alanı makine hesabı SID'sini kullanıyorum. Mark Russinovich, Machine SID adlı bu blog gönderisinde bundan bahsediyor :

SID yinelemesinin bir sorun olacağı son durum, dağıtılmış bir uygulamanın bilgisayarları benzersiz şekilde tanımlamak için makine SID'lerini kullanmasıdır. Hiçbir Microsoft yazılımı bunu yapmaz ve makine SID'sini bu şekilde kullanmak, yalnızca tüm DC'lerin aynı makine SID'sine sahip olduğu gerçeği için işe yaramaz. Benzersiz bilgisayar kimliklerine dayanan yazılım, bilgisayar adlarını veya bilgisayar Etki Alanı SID'lerini (Etki Alanındaki bilgisayar hesaplarının SID'si) kullanır.

Etki alanı makine hesabı SID'sine LDAP veya aracılığıyla erişebilirsiniz System.DirectoryServices.


1

Programımda önce Terminal Server'ı kontrol ediyorum ve WTSClientHardwareId'yi kullanıyorum. Aksi takdirde, yerel bilgisayarın MAC adresi yeterli olmalıdır.

Eğer gerçekten özelliklerinin listesini kullanmak istiyorsanız gibi şeyler dışarı izin verilen Nameve DriverVersion, Clockspeedmuhtemelen işletim sistemi bağımlı olduğundan, vb. Her iki işletim sisteminde de aynı bilgileri çıkarmayı deneyin ve farklı olanı dışarıda bırakın.



0

Neden ağ kartınızın MAC adresini kullanmıyorsunuz?


14
Mac adresi sahte olabilir
Henry B

Bu birçok durumda geçerli bir fikirdir, soru sahtekarlığı veya çevrimdışı olduğunu belirtmez - genellikle bir ağda tanımlamak istiyorsanız benzersiz bir kimlik oluşturmak istersiniz
Hurda

0

Belki biraz hile yapabilir, ancak bir makinenin Ethernet adaptörünün MAC Adresi, bu günlerde anakart değişmeden nadiren değişir.


Birçok üretici bunları değiştirmenize izin verir. Bu, kümelerle çalışırken çok yardımcıdır çünkü bazı satıcılar size tüm bilgisayarı aynı MAC adresine verir (bu sorunu birkaç yıl önce ele aldık).
gizmo

1
MAC tamamen güvenilmez çünkü çok kolay değiştirilebilir (sadece bir google aramasına ve bunu yapan birçok ücretsiz araç göreceksiniz). WMI için de aynı.
InTheNameOfScience

0

Bir çeşit üretici seri numarası veya servis etiketi alabilir misiniz?

Mağazamız bir Dell mağazası olduğundan, her makineyi tanımlamak için her makineye özgü servis etiketini kullanıyoruz. En azından Linux'ta BIOS'tan sorgulanabileceğini biliyorum, ancak bunu Windows'ta nasıl yapacağımı önceden bilmiyorum.


0

Ek bir kısıtlamam vardı, .net express kullanıyordum, bu yüzden standart donanım sorgu mekanizmasını kullanamıyordum. Bu yüzden sorguyu yapmak için power shell kullanmaya karar verdim. Tam kod şuna benzer:

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

Bir seçenek için CPUID'ye bakın. Çoklu CPU sistemlerinde bazı sorunlar olabilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.