8
votes

C ++ obtenir un identifiant de processeur

Ce fil est ok. Comment obtenir un processeur et une carte mère?

Je voulais obtenir un identifiant de processeur à l'aide du code C ++ n'utilise pas WMI ou Toute tiers lib.

ou n'importe quoi sur un ordinateur qui s'avère être unique. Une chose est une pièce d'identité Ethernet mais qui est à nouveau amovible sur certaines machines. Ceci je veux utiliser principalement pour obtenir des licences.

est un identifiant de processeur unique et disponible sur tous les grands processeurs?


1 commentaires

Doit lire: Stackoverflow.com/questions/5488249/... (en particulier les deux derniers paragraphes).


4 Réponses :


4
votes

Si vous utilisez Visual Studio, Microsoft fournit le __ CPUID Instinsic dans le en-tête. Exemple sur le site de MSDN lié.


1 commentaires

Telle est la CPU type . A peine unique, il peut y avoir des milliards de doublons. Par exemple. à partir de la page liée, vous pouvez obtenir « CPU Véritable Intel (R) 2.80GHz » et quelques drapeaux de bits.



3
votes

hm ...

Il existe des bibliothèques spéciales pour générer un identifiant unique basé sur le matériel installé (donc pour l'ordinateur spécifié, cet identifiant est toujours le même). La plupart d'entre eux prennent une carte mère ID + ID HDD + ID CPU et mélangez ces valeurs.

Whe réinventer la roue? Pourquoi ne pas utiliser ces bibliothèques? Toute raison grave?


2 commentaires

Quels sont les libs, nom me aiderait


1. DLL + Sources 2 . Sources + Article



19
votes

J'ai eu un problème similaire ces derniers temps et j'ai fait ce qui suit. D'abord, j'ai gagné des valeurs d'identification du système uniques:

  • getvolumeInformation pour le numéro de série HDD

  • GetComputerername (cela n'est bien sûr pas unique, mais notre système utilisait les noms d'ordinateur pour identifier les clients sur un réseau local, il était donc bon pour moi)

  • __cpuid (et spécifiquement le champ Numéro de série PSN - Processor)

  • gettapaptersinfo pour les adresses MAC

    J'ai pris ces valeurs et je les ai combinées de manière arbitraire mais déterministe (mise à jour de lecture ci-dessous!) (ajoutant, xoring, divisant et maintenant le reste, etc.). Itérer sur les valeurs comme s'il s'agissait de cordes et d'être créatif. À la fin, vous obtiendrez un littéral des octets que vous pouvez transformer en une gamme ASCII de lettres et de chiffres pour obtenir un code unique "lisible" qui ne ressemble pas à un bruit.

    Une autre approche peut simplement concaténer ces valeurs, puis "les couvrir" avec quelque chose en xorant sur eux (et peut-être se transformer en lettres à nouveau).

    Je dis que c'est unique, car au moins une des entrées est censée être unique (l'adresse MAC). Bien sûr, vous avez besoin d'une certaine compréhension de la théorie des nombres pour ne pas souffler cette unicité, mais cela devrait être assez bon de toute façon.

    Mise à jour importante : Depuis ce poste, j'ai appris quelques choses sur la cryptographie, et je suis sur l'avis qui constitue une combinaison arbitraire (essentiellement votre propre hachage) est presque certainement une mauvaise idée. Les fonctions de hachage utilisés dans la pratique sont construites pour être bien élevées (comme dans une faible probabilité de collisions) et d'être difficiles à casser (la capacité de construire une valeur qui a la même valeur de hachage qu'une autre). Construire une telle fonction est un problème d'informatique très difficile et sauf si vous êtes qualifié, vous ne devriez pas essayer. L'approche correcte pour cela consiste à concaténer toutes les informations que vous pouvez collecter sur le matériel (c'est-à-dire que j'ai énuméré dans la poste) et utilisez une signature de hachage cryptographique ou numérique pour obtenir une sortie vérifiable et sécurisée. NE PAS mettre en œuvre les algorithmes cryptographiques vous-même; Il y a beaucoup de pièges de vulnérabilité qui prennent beaucoup de connaissances à éviter. Utilisez une bibliothèque bien connue et fiable pour la mise en œuvre des algorithmes.


2 commentaires

Good @ Tamás mais le volumeInformation n'est pas fiable. Si vous formatez le disque dur, il sera modifié et que l'ancienne licence générée ne fonctionnera pas. Un autre pense qu'il existe de nombreux outils disponibles pour changer le volumeId comme nous le souhaitons. Nom de l'ordinateur également configurable et il existe des outils pour émuler / remplacer l'adresse MAC. Dans ce cas, le client peut briser la licence facilement.


probubly perdre l'adresse MAC, puis hachage jush que, enregistrez le hachage et comparer contre elle.



0
votes

Vous pouvez utiliser la ligne de commande. XXX PRE>

ou WMI Interface P>

#include <wmi.hpp>
#include <wmiexception.hpp>
#include <wmiresult.hpp>

#include <../src/wmi.cpp>
#include <../src/wmiresult.cpp> // used

#pragma comment(lib, "wbemuuid.lib")

struct Win32_WmiCpu
{

    void setProperties(const WmiResult& result, std::size_t index)
    {
        //EXAMPLE EXTRACTING PROPERTY TO CLASS
        result.extract(index, "ProcessorId", (*this).m_cpuID);
    }

    static std::string getWmiClassName()
    {
        return "Win32_Processor";
    }

    string m_cpuID;
    //All the other properties you wish to read from WMI

}; //end struct Win32_ComputerSystem
   
struct Win32_WmiMotherBoard
{

    void setProperties(const WmiResult& result, std::size_t index)
    {
        //EXAMPLE EXTRACTING PROPERTY TO CLASS
        result.extract(index, "SerialNumber", (*this).m_mBId);
    }

    static std::string getWmiClassName()
    {
        return "Win32_BaseBoard";
    }

    string m_mBId;

}; //end struct Win32_ComputerSystem


try
{
    const Win32_WmiCpu cpu = Wmi::retrieveWmi<Win32_WmiCpu>();
    strncpy_s(ret.m_cpu, cpu.m_cpuID.c_str(), _TRUNCATE);
}
catch (const Wmi::WmiException& )
{
}
try
{
    const Win32_WmiMotherBoard mb = Wmi::retrieveWmi<Win32_WmiMotherBoard>();
    strncpy_s(ret.m_mb, mb.m_mBId.c_str(), _TRUNCATE);
}
catch (const Wmi::WmiException& )
{
}


0 commentaires