Prawdziwy hardware lock

Jak donosi serwis BoingBoing, firmy które zakupiły wysokiej klasy urządzenia typu CNC firmy Mori Seiki NV5000 A/40 nie mogą bez specjalnego kodu odblokowującego przenosić fizycznie urządzenia w inne miejsce.

Urządzenie na bieżąco monitoruje położenie dzięki wbudowanemu GPS oraz żyroskopowi i jakiekolwiek zmiany w jego położeniu wyłączają urządzenie i blokują jego funkcjonowanie kodem, który należy wpisać, aby „odblokować” maszynę (swoją drogą ciekawe jak to działa).

nv-5000-vertical-machining-center1

Wprowadzone blokady mają rzekomo chronić przed eksportem urządzeń do objętego embargiem Iranu.

Więcej na ten temat na:

http://boingboing.net/2014/01/06/high-end-cnc-machines-cant-b.html

 

Sprzętowy identyfikator w C#

Sprzętowy identyfikator komputera

Krótki snippet w C# dla .NET 4 (jak skorygowali mnie koledzy, zadziała także od .NET 2) pobierający sprzętowy identyfikator maszyny, wykorzystując interfejs WMI, podobne algorytmy stosowane są w aplikacjach, których klucze licencyjne przypisywane są do jednego komputera

using System.Management;
using System.Security.Cryptography;

/// 
/// pobiera sprzętowy identyfikator maszyny korzystając z interfejsu WMI
/// 
/// identyfikator sprzętowy w formie hasha SHA1
public static String hardwareId()
{
    // tymczasowy string
    String tempString = "";

    // "baza danych", z której pobieramy informacje o systemie
    String wmiScope = @"root\CIMV2";

    // tabela zapytań WMI i pobieranych elementów
    String[,] wmiQueries = new String[,]
    {
        { "SELECT ProcessorId FROM Win32_Processor", "ProcessorId" },
        { "SELECT Caption FROM Win32_Processor", "Caption" },
        { "SELECT Manufacturer FROM Win32_Processor", "Manufacturer" },
        { "SELECT Caption FROM Win32_BIOS", "Caption" }
    };

    // wywołujemy kolejne zapytania WMI
    for (int i = 0; i < wmiQueries.GetLength(0); i++)
    {
        try
        {
            // wykonaj zapytanie WMI
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiScope, wmiQueries[i, 0]);

            // zbuduj string z kolejnymi elementami odpowiedzi po zapytaniach WMI
            foreach (ManagementObject obj in searcher.Get())
            {
                tempString += obj[wmiQueries[i, 1]].ToString();
            }
        }
        catch (ManagementException exception)
        {
            // loguj błąd odczytu danych z WMI
        }
    }

    // generuj hash SHA1 ze wszystkich zebranych danych WMI
    SHA1 hash = SHA1CryptoServiceProvider.Create();

    // ciąg znaków zamień na tablicę bajtów
    byte[] plainTextBytes = Encoding.ASCII.GetBytes(tempString);

    // oblicz hash SHA1
    byte[] hashBytes = hash.ComputeHash(plainTextBytes);

    // konwertuj hash SHA1 na postać tekstową (i usuń zbędne znaki "-")
    tempString = BitConverter.ToString(hashBytes).Replace("-", "");

    return tempString;
}

Więcej o WMI na CodeProject:
http://www.codeproject.com/KB/system/WQLByExample.aspx