การสร้างรหัสเครื่องเฉพาะ


104

ฉันต้องเขียนฟังก์ชันที่สร้าง id ที่ไม่ซ้ำกันสำหรับเครื่องที่ใช้ Windows OS

ขณะนี้ฉันใช้ WMI เพื่อค้นหาพารามิเตอร์ฮาร์ดแวร์ต่างๆและเชื่อมต่อเข้าด้วยกันและแฮชเพื่อรับ id เฉพาะ คำถามของฉันคืออะไรคือพารามิเตอร์ที่แนะนำที่ฉันควรใช้? ขณะนี้ฉันกำลังใช้ข้อมูลไบออส cpu \ disk ร่วมกันเพื่อสร้าง id เฉพาะ และกำลังใช้ผลลัพธ์แรกหากมีผลลัพธ์หลายรายการสำหรับแต่ละเมตริก

อย่างไรก็ตามฉันพบปัญหาที่เครื่องที่บู๊ตคู่ใน 2 ระบบปฏิบัติการ Windows ที่แตกต่างกันสร้างรหัสไซต์ที่แตกต่างกันในแต่ละระบบปฏิบัติการซึ่งไม่ควรเกิดขึ้น

สำหรับการอ้างอิงนี่คือเมตริกที่ฉันกำลังใช้:

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

คำตอบ:


25

แยกวิเคราะห์SMBIOSด้วยตัวคุณเองและแฮชตามความยาวโดยพลการ ดูข้อกำหนด PDFสำหรับโครงสร้าง SMBIOS ทั้งหมดที่มี

เพื่อสอบถามข้อมูล SMBIOS จาก Windows คุณสามารถใช้EnumSystemFirmwareEntries, และEnumSystemFirmwareTablesGetSystemFirmwareTable

IIRC "id เฉพาะ" จากคำสั่ง CPUID เลิกใช้งานจาก P3 และใหม่กว่า


14
โปรดทราบว่าฟังก์ชันเหล่านี้จำเป็นต้องใช้ Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 หรือ Windows Server 2003 ที่มี SP1 เป็นอย่างน้อย
jcoffland

34
หมายเหตุที่จะไม่ทำในสิ่งที่ฉันทำซึ่งเรียกว่า GetSystemFirmwareTable ('RSMB' ... ); และแฮชบัฟเฟอร์ SMBIOSTableData ทั้งหมด มันใช้งานได้ดีจนกระทั่งฉันวิ่งเข้าไปในเวิร์กสเตชันซึ่งเขียนอุณหภูมิภายในของซีพียูลงในตารางนั้นซึ่งหมายความว่า id เฉพาะของฉันจะเปลี่ยนทุกสองสามวินาที
โธมัส

มีซอร์สโค้ดสำหรับโซลูชันนี้หรือไม่
Just Shadow

@ โทมัสสุดท้ายแล้วคุณเลือกทางออกไหน?
Smith

@Smith เป้าหมายของฉันคือรหัสอักขระ 8 ตัวเล็ก ๆ เมื่ออ่านข้อมูลจำเพาะฉันได้ตัดสินใจว่าช่องใดที่อาจแตกต่างกันและไม่รวมไว้ จากนั้นในช่วงหลายปีที่ผ่านมาฉันตัดฟิลด์เพิ่มเติมที่ไม่ใช่ค่าคงที่จากเครื่องจักร สุดท้ายฉันลงเอยด้วยการจัดเก็บสำเนาข้อมูลดิบที่เข้ารหัสซึ่งฉันใช้เป็นอินพุตและสร้างcloseEnoughฟังก์ชันเพื่อที่ฉันจะยอมรับ ID ที่ไม่ตรงกันหากมีการเปลี่ยนแปลงใน 2 ฟิลด์เท่านั้น ฉันยังใส่รายละเอียดเกี่ยวกับโปรเซสเซอร์และฮาร์ดไดรฟ์ระบบไว้ในแฮชของฉันด้วยเนื่องจากในช่วงแรกฉันมีการชนกันระหว่างระบบที่เหมือนกัน
Thomas

72

ฉันมีปัญหาเดียวกันและหลังจากการวิจัยเล็กน้อยฉันตัดสินใจว่าสิ่งที่ดีที่สุดคือการอ่านMachineGuidในรีจิสตรีคีย์HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptographyตามที่ @Agnus แนะนำ สร้างขึ้นระหว่างการติดตั้งระบบปฏิบัติการและจะไม่เปลี่ยนแปลงเว้นแต่คุณจะทำการติดตั้งระบบปฏิบัติการใหม่ ขึ้นอยู่กับเวอร์ชันของระบบปฏิบัติการที่อาจมีที่อยู่ MAC ของอะแดปเตอร์เครือข่ายฝังอยู่ (รวมถึงหมายเลขอื่น ๆ รวมทั้งสุ่ม) หรือหมายเลขหลอกรุ่นที่ใหม่กว่าสำหรับระบบปฏิบัติการเวอร์ชันใหม่ (หลังจาก XP SP2 ฉันเชื่อ แต่ไม่แน่ใจ) หากเป็นของปลอมตามทฤษฎีก็สามารถปลอมแปลงได้ - หากเครื่องสองเครื่องมีสถานะเริ่มต้นเหมือนกันรวมถึงนาฬิกาตามเวลาจริง ในทางปฏิบัติสิ่งนี้จะหายาก แต่โปรดระวังหากคุณคาดหวังว่ามันจะเป็นฐานสำหรับความปลอดภัยที่แฮกเกอร์ไม่ยอมใครง่ายๆโจมตีได้

แน่นอนว่าทุกคนสามารถเปลี่ยนรายการรีจิสทรีได้อย่างง่ายดายเพื่อปลอม GUID ของเครื่อง แต่สิ่งที่ฉันพบก็คือสิ่งนี้จะขัดขวางการทำงานปกติของส่วนประกอบต่างๆของ Windows ซึ่งในกรณีส่วนใหญ่จะไม่มีผู้ใช้ทั่วไปทำเช่นนั้น (ระวังอีกครั้ง สำหรับแฮกเกอร์ที่ไม่ยอมใครง่ายๆ)


6
คุณสามารถใช้แฟล็ก KEY_WOW64_64KEY เพื่อให้แน่ใจว่าคุณได้รับคีย์รีจิสทรีเวอร์ชัน "จริง" เสมอฉันคิดว่า
Colen

13
หากคุณโคลนอิมเมจไดรฟ์สิ่งนี้จะยังคงเหมือนเดิม ดังนั้นนี่จึงไม่ปลอดภัยและไม่ปลอดภัยเลย
bitbonk

19
เพื่อชี้แจงประเด็นนี้เมื่อฉันวางมาตรการ DRM ในซอฟต์แวร์เป้าหมายหลักของฉันคือเพื่อป้องกันไม่ให้ผู้คนสร้างรอยแตกที่ทำให้โจรสลัด 'มืออาชีพ' สามารถขายสำเนาซอฟต์แวร์ที่ผิดกฎหมายได้โดยไม่มีข้อ จำกัด ฉันไม่ได้กังวลเกี่ยวกับแฮ็กเกอร์ในบางครั้งที่โคลนไดรฟ์ของเพื่อนของเขาเพียงเพื่อให้สามารถใช้ซอฟต์แวร์ของฉันได้ ในกรณีเช่นนี้คนเหล่านั้นมักจะมีเวลามากกว่าเงินและจะไม่จ่ายเงินให้ หากซอฟต์แวร์ราคา $ 100 และค่าจ้างของคุณมากกว่า $ 50 / h คุณก็จ่ายได้ ความยุ่งยากจะใช้เวลามากกว่า 2 ชม.
Fabio Ceconello

7
โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมที่มีการติดตั้ง Windows โดยการโคลนอิมเมจเครื่องหลัก MachineGuid จะเหมือนกันสำหรับทั้งหมด
nandhp

8
ไม่ใช่ถ้าคุณทำอย่างถูกต้องและถูกกฎหมายโดยใช้ sysprep & all สำหรับผู้ที่มีการละเมิดลิขสิทธิ์ของหน้าต่างและ "เพียงแค่โคลน" นั่นเป็นอีกเรื่องหนึ่ง แต่พวกเขาจะไม่หยุดง่ายๆอย่างนั้น
Fabio Ceconello

34

ด้วยเครื่องมือการออกใบอนุญาตของเราเราจะพิจารณาส่วนประกอบต่อไปนี้

  • หมายเลขทางกายภาพ
  • CPU (ไม่ใช่หมายเลขซีเรียล แต่เป็นโปรไฟล์ CPU จริงเช่นสเต็ปปิ้งและรุ่น)
  • หมายเลขซีเรียลของไดรฟ์ระบบ (ไม่ใช่ฉลากระดับเสียง)
  • หน่วยความจำ
  • ซีดีรอมรุ่นและผู้จำหน่าย
  • รุ่นการ์ดจอและผู้ขาย
  • IDE Controller
  • ตัวควบคุม SCSI

อย่างไรก็ตามแทนที่จะเพียงแค่การแฮชส่วนประกอบและการสร้างระบบผ่าน / ล้มเหลวเราได้สร้างลายนิ้วมือที่เทียบเคียงกันได้ซึ่งสามารถใช้เพื่อกำหนดว่าโปรไฟล์ของเครื่องทั้งสองแตกต่างกันอย่างไร หากคะแนนความแตกต่างสูงกว่าค่าเผื่อที่ระบุให้ขอให้ผู้ใช้เปิดใช้งานอีกครั้ง

เราพบว่าในช่วง 8 ปีที่ผ่านมามีการใช้งานกับการติดตั้งของผู้ใช้ปลายทางหลายแสนครั้งว่าชุดค่าผสมนี้ทำงานได้ดีเพื่อให้รหัสเครื่องที่ไม่ซ้ำใครน่าเชื่อถือแม้กระทั่งสำหรับเครื่องเสมือนและการติดตั้งระบบปฏิบัติการที่โคลน


1
คุณจะทราบได้อย่างไรว่าคุณใช้ที่อยู่ MAC ใด? เครื่องสามารถมี NIC ได้หลายเครื่องและจะมีการเพิ่มแบบไดนามิก (การเชื่อมต่อกับ VPN ใหม่ผ่านแอพเพล็ตจะเพิ่ม NIC เสมือน) บางตัวเป็นเสมือนมีประเภทอีเทอร์เน็ตและยากที่จะระบุว่าเป็นเสมือน อื่น ๆ ขึ้น / ลงขึ้นอยู่กับสภาพเครือข่าย (wifi)
Marek

เราใช้ NIC ทางกายภาพทั้งหมด - ไม่รวม NICS เสมือนบลูทู ธ ฯลฯ ทั้งหมดนี้รวมกันเพื่อสร้างแฮชที่เป็นหนึ่งเดียว
Paul Alexander

ทำไมคุณไม่แนะนำให้ใช้หมายเลขซีเรียลของ CPU
Mojtaba Rezaeian

3
หมายเลขซีเรียลของ CPU ไม่ได้เปิดใช้งานในชิป Intel มาหลายปีแล้ว การเรียกระบบยังคงมีอยู่ แต่จะไม่ส่งคืนค่าที่เสถียร ฉันจำไม่ได้ว่ามันส่งคืนอะไร - ข้อมูลจำลองหรือค่าเดียวกันสำหรับทุกเครื่อง ไม่ว่าจะด้วยวิธีใดก็ไม่ใช่เมตริกฮาร์ดแวร์ที่เชื่อถือได้
Paul Alexander

1
@PaulAlexander เครื่องมือที่คุณอ้างถึงตรวจสอบความถูกต้องของพารามิเตอร์ทั้งหมดที่คุณกล่าวถึงหรือไม่กี่ตัวจะใช้งานได้? เนื่องจากระบบในปัจจุบันมักไม่ประกอบด้วยซีดีรอม
FaizanHussainRabbani

3

แล้วการใช้ UniqueID ของโปรเซสเซอร์ล่ะ?


14
ทุกวันนี้ทรัพย์สินที่คิดค่าเสื่อมราคาไม่ใช่เหรอ
Jake Wilson

15
บางทีเขาอาจหมายถึง 'เลิกใช้แล้ว' ... ผู้ผลิต CPU เริ่มใส่ ID เฉพาะในขั้นตอนเดียว แต่เนื่องจากฟันเฟืองเรื่องความเป็นส่วนตัวพวกเขาจึงหยุดอีกครั้ง ดังนั้นคุณจะพบว่าบางตัวมี ID เฉพาะ แต่ซีพียูสมัยใหม่ส่วนใหญ่ไม่มี
TripleAntigen

1
สำหรับการอ้างอิงมีเพียงชุดสั้น ๆ ของ Pentium III เท่านั้นที่มีหมายเลขซีเรียลของ CPU ที่สามารถอ่านได้ แม้ว่าเวอร์ชันที่ใหม่กว่าจะมีหมายเลขประจำเครื่อง แต่ก็ถูกปิดใช้งานโดยค่าเริ่มต้น Pentium IV และซีพียูรุ่นหลังไม่รองรับเลย
Paul Alexander

2

ฉันเกลียดที่จะเป็นผู้ชายที่พูดว่า "คุณทำมันผิด" (ฉันเกลียดผู้ชายคนนั้นมาตลอด) แต่ ...

ต้องสร้างซ้ำสำหรับเครื่องที่ไม่ซ้ำกันหรือไม่? คุณสามารถกำหนดตัวระบุหรือทำคีย์สาธารณะ / ส่วนตัวได้หรือไม่? บางทีถ้าคุณสามารถสร้างและจัดเก็บค่าได้คุณสามารถเข้าถึงได้จากการติดตั้ง OS ทั้งสองบนดิสก์เดียวกัน?

คุณอาจได้สำรวจตัวเลือกเหล่านี้แล้วและไม่ได้ผลสำหรับคุณ แต่ถ้าไม่เป็นเช่นนั้นก็เป็นสิ่งที่ต้องพิจารณา

หากไม่ใช่เรื่องของความไว้วางใจของผู้ใช้คุณสามารถใช้ที่อยู่ MAC ได้


5
ที่อยู่ MAC จะไม่ทำงานหากเครื่องไม่มีการ์ดเครือข่าย
Brian

7
@ ไบรอัน - คุณต้องการค่าเฉพาะเพื่อระบุคอมพิวเตอร์ที่ไม่มีการ์ดเครือข่ายหรือไม่? ดูเหมือนว่าการเดิมพันค่อนข้างปลอดภัยที่เครื่องมีการ์ด
romandas

1

คุณควรตรวจสอบโดยใช้ที่อยู่ MAC บนการ์ดเครือข่าย (ถ้ามี) สิ่งเหล่านี้มักจะไม่ซ้ำกัน แต่สามารถประดิษฐ์ได้ ฉันใช้ซอฟต์แวร์ที่สร้างไฟล์ใบอนุญาตตามที่อยู่ MAC ของอะแดปเตอร์เครือข่ายของคุณดังนั้นจึงถือว่าเป็นวิธีที่ค่อนข้างน่าเชื่อถือในการแยกแยะระหว่างคอมพิวเตอร์


6
ไม่พวกเขาไม่ได้ ผู้ผลิตจำนวนมากอนุญาตให้คุณเปลี่ยนได้ นี่เป็นประโยชน์มากเมื่อทำงานกับคลัสเตอร์เนื่องจากผู้ขายบางรายให้คอมพิวเตอร์ทั้งหมดที่มีที่อยู่ MAC เดียวกัน (เราพบปัญหานี้เมื่อไม่กี่ปีที่ผ่านมา)
gizmo

นี่เป็นแนวคิดที่ถูกต้องในหลาย ๆ กรณีคำถามคือ | t ระบุการปลอมแปลงหรือออฟไลน์ - คุณมักต้องการสร้าง ID ที่ไม่ซ้ำกันหากคุณต้องการระบุในเครือข่าย
Hurda

เป็นไปได้ที่จะมีอุปกรณ์เครือข่ายหลายเครื่องในเครื่องเดียวกัน คุณไม่รับประกันว่าจะตรวจพบในลำดับเดียวกันเสมอหรือจะไม่มีการแทนที่ในบางจุด ควรใช้ฮาร์ดแวร์บางตัวที่น่าจะถาวรกว่า
Agi Hammerthief

1

สำหรับหนึ่งในแอปพลิเคชันของฉันฉันจะใช้ชื่อคอมพิวเตอร์ถ้าเป็นคอมพิวเตอร์ที่ไม่ใช่โดเมนหรือ SID ของบัญชีเครื่องโดเมนสำหรับคอมพิวเตอร์โดเมน Mark Russinovich พูดถึงเรื่องนี้ในบล็อกโพสต์Machine SID :

กรณีสุดท้ายที่การทำสำเนา SID จะเป็นปัญหาคือหากแอปพลิเคชันแบบกระจายใช้ SID ของเครื่องเพื่อระบุคอมพิวเตอร์โดยไม่ซ้ำกัน ไม่มีซอฟต์แวร์ของ Microsoft ทำเช่นนั้นและการใช้ SID ของเครื่องในลักษณะนั้นไม่ได้ผลเพียงเพราะ DC ทั้งหมดมี SID ของเครื่องเดียวกัน ซอฟต์แวร์ที่อาศัยข้อมูลประจำตัวของคอมพิวเตอร์ที่ไม่ซ้ำกันจะใช้ชื่อคอมพิวเตอร์หรือโดเมน SID ของคอมพิวเตอร์ (SID ของบัญชีคอมพิวเตอร์ในโดเมน)

คุณสามารถเข้าถึง SID บัญชีเครื่องโดเมนผ่าน LDAP System.DirectoryServicesหรือ


1

ในโปรแกรมของฉันฉันจะตรวจสอบ Terminal Server ก่อนและใช้ WTSClientHardwareId อื่น ๆ ที่อยู่ MAC ของเครื่องพีซีควรเพียงพอ

ถ้าคุณอยากจะใช้รายการของคุณสมบัติที่คุณให้ลาออกจากสิ่งที่ชอบNameและDriverVersion, Clockspeedฯลฯ เพราะมันอาจจะขึ้นอยู่กับระบบปฏิบัติการ ลองแสดงข้อมูลเดียวกันบนระบบปฏิบัติการทั้งสองระบบและปล่อยให้ข้อมูลที่แตกต่างกัน


1

มีไลบรารีสำหรับรับข้อมูลเฉพาะฮาร์ดแวร์: ตัวแยกหมายเลขซีเรียลของฮาร์ดแวร์ (CPU, RAM, HDD, BIOS)


2
เป็นไลบรารีเชิงพาณิชย์แบบปิด
Gab

@ Gab- ซอร์สโค้ดสามารถใช้ได้ และราคาของ DLL (29) นั้นไม่มีอะไรเทียบกับไลบรารีอื่น ๆ ที่ใกล้เคียงกับ $ 2,000 ใช่มันทำงาน
InTheNameOfScience

0

ทำไมไม่ใช้ที่อยู่ MAC ของการ์ดเครือข่ายของคุณ?


14
ที่อยู่ Mac สามารถปลอมแปลงได้
Henry B

นี่เป็นแนวคิดที่ถูกต้องในหลาย ๆ กรณีคำถาม | t ระบุการปลอมแปลงหรือออฟไลน์ - คุณมักต้องการสร้าง ID ที่ไม่ซ้ำกันหากคุณต้องการระบุในเครือข่าย
Hurda

0

อาจจะโกงเล็กน้อย แต่ที่อยู่ MAC ของอะแดปเตอร์อีเธอร์เน็ตของเครื่องแทบจะไม่เปลี่ยนไปเลยโดยที่เมนบอร์ดไม่เปลี่ยนในทุกวันนี้


ผู้ผลิตจำนวนมากอนุญาตให้คุณเปลี่ยนได้ นี่เป็นประโยชน์อย่างมากเมื่อทำงานกับคลัสเตอร์เนื่องจากผู้ขายบางรายให้คอมพิวเตอร์ทุกเครื่องที่มีที่อยู่ MAC เดียวกัน (เราพบปัญหานี้เมื่อไม่กี่ปีที่ผ่านมา)
gizmo

1
MAC ไม่น่าเชื่อถือโดยสิ้นเชิงเพราะสามารถเปลี่ยนแปลงได้ง่ายมาก (เพียงแค่ค้นหาโดย Google แล้วคุณจะเห็นเครื่องมือฟรีมากมายที่ทำเช่นนี้) เช่นเดียวกับ WMI
InTheNameOfScience

0

คุณสามารถดึงหมายเลขซีเรียลของผู้ผลิตหรือแท็กบริการได้หรือไม่?

ร้านค้าของเราเป็นร้านค้าของ Dell ดังนั้นเราจึงใช้ป้ายบริการซึ่งเป็นเอกลักษณ์ของแต่ละเครื่องเพื่อระบุตัวตน ฉันรู้ว่าสามารถสอบถามได้จาก BIOS อย่างน้อยก็ใน Linux แต่ฉันไม่รู้ว่าจะทำอย่างไรใน Windows


0

ฉันมีข้อ จำกัด เพิ่มเติมฉันใช้. net express ดังนั้นฉันจึงไม่สามารถใช้กลไกการสืบค้นฮาร์ดแวร์มาตรฐานได้ ดังนั้นฉันจึงตัดสินใจใช้ power shell เพื่อทำแบบสอบถาม โค้ดแบบเต็มมีลักษณะดังนี้:

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

ค้นหา CPUID สำหรับตัวเลือกเดียว อาจมีปัญหาบางอย่างกับระบบหลาย CPU


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.