IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Protection de logiciel par clé


Sujet :

Contribuez

  1. #1
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut Protection de logiciel par clé
    bonjour,

    voici en gros le principe :
    Dans votre logiciel, il y a un bouton demande d'activation. Ce bouton génère un fichier ou une chaîne cryptée que votre client doit vous transmettre ( courrier électronique ). Dans ce fichier il y a des informations concernant le BIOS, la carte mère, la carte réseau, le disque dur ( pas des informations confidentielles, seulement des numéros de série ou info HARD). En recueillant ces informations vous jugez quelles sont ou quelle est l'information la plus fiable. Vous générez une clé d'activation cryptée en fonction de ces informations. Vous la transmettez à votre client. La partie activation de votre logiciel (lancé à chaque démarrage) vient alors décoder cette clé et vient vérifier que les infos Hard correspondent au matériel sur lequel est lancé le logiciel.

    Pour vous aidez dans cette tâche, je vous propose la partie récolte d'informations. Voici une procédure qui utilise WMI avec assemblage DotNet, récupérant des infos pour générer ou contrôler un numéro de licence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    // Résumé : Récupérer des informations système pour générer ou contrôler un numéro de licence
    // Cette procédure utilise la collection pWMI et à incorporer dans celle-ci
    // Syntaxe :
    //RécupèreInfosLicence ()
    //
    // Paramètres :
    // Aucun
    // Valeur de retour :
    // Aucune
    //
    //
    // Pensé par Jurassic.Pork Juin 2010
    //
    PROCEDURE RécupèreInfosLicence()
        InfoLicence est une structure
        NumSérieDisque est une chaîne
        NumVolDisque est une chaîne
        NumMacAdresse est une chaîne
        NumSérieCarteMère est une chaîne
        NumSérieBios est une chaîne
        FIN
     
        sUneInformation est une chaîne
     
        MonInfoLicence est une InfoLicence
     
        // Récupération du numéro de série du 1er disque
        sUneInformation = RécupèreContenu("Win32_PhysicalMedia",gsServeur + "root\CIMV2", "Tag LIKE '%PHYSICALDRIVE0'")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumSérieDisque = TrouveInformation(sUneInformation,"SerialNumber")
        SINON
        MonInfoLicence.NumSérieDisque = "INVALIDE"
        FIN
     
        // Récupération du numéro de volume du disque C:
        sUneInformation = RécupèreContenu("Win32_LogicalDisk",gsServeur + "root\CIMV2", "DeviceID='C:'")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumVolDisque = TrouveInformation(sUneInformation,"VolumeSerialNumber")
        SINON
        MonInfoLicence.NumSérieDisque = "INVALIDE"
        FIN
     
        // Récupération de l'adresse MAC du premier adaptateur réseau valide
        sUneInformation = RécupèreContenu("Win32_NetworkAdapter",gsServeur + "root\CIMV2", "PhysicalAdapter=True")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumMacAdresse = TrouveInformation(sUneInformation,"MACAddress")
        SINON
        MonInfoLicence.NumMacAdresse = "INVALIDE"
        FIN
     
        // Récupération du numéro de série de carte mère
        sUneInformation = RécupèreContenu("Win32_BaseBoard",gsServeur + "root\CIMV2")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumSérieCarteMère = TrouveInformation(sUneInformation,"SerialNumber")
        SINON
        MonInfoLicence.NumSérieCarteMère = "INVALIDE"
        FIN
     
        // Récupération du numéro de série du BIOS
        sUneInformation = RécupèreContenu("Win32_BIOS",gsServeur + "root\CIMV2")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumSérieBios = TrouveInformation(sUneInformation,"SerialNumber")
        SINON
        MonInfoLicence.NumSérieBios = "INVALIDE"
        FIN
     
        // A vous de jouer pour générer ou vérifier la clé de licence avec les infos les plus justes.
    Pour utiliser cela dans votre projet il vous faut :
    1 - Utiliser l'assemblage .NET "System.Management" :
    Menu Atelier/.NET/Utiliser Un Assemblage .NET dans ce projet
    Dans la fenêtre qui s'ouvre cliquer sur "Lister les assemblages référencés"
    Quand la recherche est terminée cocher "Mscorlib" et "System.Management"
    2 - Récupérer la collection de procédure pWMI.wdg qui se trouve dans l'exemple complet WD WMI DOTNET et l'inclure dans votre projet
    3 - Rajouter la procédure RécupèreInfosLicence dans votre collection pWMI.wdg

    Contrainte : comme vous utilisez un assemblage .Net, il faut que le Framework dotnet soit installé sur la station qui utilisera cette procédure.

    Ami calmant, J.P ;-)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 140
    Points : 131
    Points
    131
    Par défaut
    intéressant:
    est ce que cela fonctionne
    quelque soit le système ?
    quelque soit le framework .net installé?

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    bonjour hehehe,

    tu as bien fait de poser la question car je me suis aperçu que la propriété que j'utilise pour récupérer l'adresse MAC de la première carte réseau (PhysicalAdapter=True) ne marche pas pour XP , Windows 2000. Il faut utiliser plutôt la propriété NetConnectionStatus=2 ( la première carte réseau connectée à un réseau).
    Sinon sous Windows 7 dotnet 3.5 je récupère tous les infos.
    Par contre sur mon NetBook MSI U100 sous XP dotnet 2.0 je ne récupère pas les infos BIOS, pour l'adresse MAC il faut que j'utilise NetConnectionStatus=2.

    Ami Calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Salut à toi jurassic,

    Ce sujet m'intéresse fortement, faisant actuellement des recherches pour récupérer des informations sur le processeur, je suis tombé ici.

    Tout d'abord, avant d'aller plus loin dans mes questions, j'ai regardé l'exemple "WD WMI DOTNET", et malheureusement j'ai le droit à une belle erreur sur l'appel de getEnumerator() de la procédure globale RécupèreInfos() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Déclaration de la requete
    clMaRequete 	est un ObjectQuery(sRequête)
    // Exécution de la requête
    clMaRecherche 	est un ManagementObjectSearcher(clMonScope,clMaRequete)
     
    // Récupération de l'énumérateur sur les valeurs
    pclIEnumValeur = clMaRecherche:Get():GetEnumerator()
    Le message d'erreur peut explicite est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <=Šì0y
    Erreur système : Access violation (GPF)
    EIP = 00030009
    OS : Windows XP ou .NET Service Pack 3(5.1.2600)
     
    - Infos de debug :
    Registres :
     
      EIP = 00030009    EBP = 017B7600
      EAX = 0013E57C    EBX = 00000002
      ECX = 017B8918    EDX = 0013E5B8
      ESI = 0013E5AC    EDI = 00D7DD30
     
    Pile des appels :
     
    [???]	00030009
     
     
    - Infos attachées :
    EIT_PILEWL :
    Procédure globale RécupèreContenu (pWMI.RécupèreContenu), ligne 64
    Procédure globale RécupèreInfoProc (pWMI.RécupèreInfoProc), ligne 18
    Procédure locale InfosProcesseur (FEN_Simple.PROCEDURE.InfosProcesseur), ligne 13
    Clic sur BTN_Analyser (FEN_Simple.BTN_Analyser), ligne 24
    Clic sur BTN_SIMPLE (FEN_Principale.BTN_SIMPLE), ligne 4
    EIT_COMPOSANT :
     
    EIT_DATEHEURE : 28/06/2010 10:37:02
     
    - Identifiant dans le .err : 1020
    Pour info, j'ai le Framework .Net 3.5 SP1.

    Y-a-t'il un piège à contourner pour utiliser cet exemple ?

    Merci à toi

    Edit : GetEnumerator() semble ne rien renvoyer ce qui provoque cette erreur.
    Edit2 : GetEnumerator() ne fonctionne pas sous Windev12.

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    bonjour Lo2,

    mon code marche sous WD15 Windows 7

    sous quel O.S es-tu ? avec quelle version de windev ?


    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Salut,

    J'ai eu ma réponse en ouvrant un sujet :
    http://www.developpez.net/forums/d94...wd-wmi-dotnet/

    Il s'avère que cela est dû à la version de Windev utilisé, version 12 en l'occurrence, qui ne gère pas les enumérations des assemblages DOTNET.
    Le problème est corrigé en version 14/15.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Salut à tous!

    Merci JP pour cette contribution!

    Je viens donc d'essayer sur le poste de DEV et j'obtiens cette erreur :

    Que s'est-il passé ?
    L'invocation de la méthode <Get()> du type <ManagementObjectCollection> a échoué

    Code erreur : 200002
    Niveau : erreur fatale (EL_FATAL)

    Dump de l'erreur du module 'wd170net2.dll' (17.0.20.0).
    Identifiant des informations détaillées (.err) : 200002
    Informations supplémentaires :
    EIT_PILEWL :
    Procédure globale RécupèreContenu (pWMI.RécupèreContenu), ligne 62
    Procédure globale RécupèreInfosLicence (Procedures globales de GESCO.RécupèreInfosLicence), ligne 41
    Clic sur BTN_Recupere_Licence (FEN_PP.BTN_Recupere_Licence), ligne 1
    EIT_DATEHEURE : 08/11/2012 10:18:50
    Est ce dû au framework detnot?
    Comment savoir si ce framework est installé?
    Est-il nécessaire de l'installer sur le poste de DEV avec WD ?

    Que de questions! désolé je suis vraiment bleu dans WMI

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    Voici une nouvelle version de la procédure RécupèreInfosLicence utilisable à partir de windows VISTA ( à cause de ItemIndex apparu à partir de cette version)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    PROCEDURE RécupèreInfosLicence()
    // Jurassic Pork  Novembre 2014
    // Extraction d'informations pour gestion Licence
    InfoLicence est une structure
    	NumSérieDisque est une chaîne
    	NumVolDisque est une chaîne
    	NumMacAdresse est une chaîne
    	NumSérieCarteMère est une chaîne
    	NomCarteMère est une chaîne
    	NumSérieBios est une chaîne
    FIN
     
    objLocator est un objet Automation "WbemScripting.SWbemLocator"
    objService est un objet Automation dynamique
    Resultats est un objet Automation dynamique
    MonInfoLicence est une InfoLicence
     
    QUAND EXCEPTION DANS
    	objService = objLocator>>ConnectServer(".", "root\cimv2")
    	objService>>Security_>>ImpersonationLevel = 3 
     
    // Récupération du numéro de série du 1er disque
    	Resultats = objService>>ExecQuery("SELECT SerialNumber,Tag FROM Win32_PhysicalMedia WHERE Tag LIKE '%PHYSICALDRIVE0'")
    	POUR x = 0 _A_ Resultats>>Count -1
    		MonInfoLicence.NumSérieDisque = Resultats>>ItemIndex(x)>>Properties_>>Item("SerialNumber")>>Value 
    		Trace("NumSérieDisque : ",MonInfoLicence.NumSérieDisque)
        FIN
    // Récupération du numéro de volume du disque C:
    	Resultats = objService>>ExecQuery("SELECT DeviceID,VolumeSerialNumber FROM Win32_LogicalDisk WHERE DeviceID='C:'")
     
    		POUR x = 0 _A_ Resultats>>Count -1
    			MonInfoLicence.NumVolDisque = Resultats>>ItemIndex(x)>>Properties_>>Item("VolumeSerialNumber")>>Value 
    			Trace("NumVolDisque : ",MonInfoLicence.NumVolDisque)
           FIN
     
    // Récupération de l'adresse MAC du premier adaptateur réseau valide
    	Resultats = objService>>ExecQuery("SELECT MACAddress,PhysicalAdapter FROM Win32_NetworkAdapter WHERE PhysicalAdapter=True")
    			POUR x = 0 _A_ Resultats>>Count -1
    				MonInfoLicence.NumMacAdresse = Resultats>>ItemIndex(x)>>Properties_>>Item("MACAddress")>>Value 
    				Trace("NumMacAdresse : ",MonInfoLicence.NumMacAdresse)
    			FIN	
     
    // Récupération du numéro de série de carte mère
    		Resultats = objService>>ExecQuery("SELECT SerialNumber,Product FROM Win32_BaseBoard")
    				POUR x = 0 _A_ Resultats>>Count -1
    					MonInfoLicence.NumSérieCarteMère = Resultats>>ItemIndex(x)>>Properties_>>Item("SerialNumber")>>Value 
    					MonInfoLicence.NomCarteMère = Resultats>>ItemIndex(x)>>Properties_>>Item("Product")>>Value 
    					Trace("NumSérieCarteMère : ",MonInfoLicence.NumSérieCarteMère)
    					Trace("NomCarteMère : ",MonInfoLicence.NomCarteMère)
    				FIN	
    // Récupération du numéro de série du BIOS
    		Resultats = objService>>ExecQuery("SELECT SerialNumber FROM Win32_BIOS")
    					POUR x = 0 _A_ Resultats>>Count -1
    						MonInfoLicence.NumSérieBios = Resultats>>ItemIndex(x)>>Properties_>>Item("SerialNumber")>>Value 
    						Trace("NumSérieBios : ",MonInfoLicence.NumSérieBios)
                       FIN
     
    FAIRE
    	Erreur("Erreur execution WMI",ExceptionInfo(errInfo))
    	ExceptionActive()
    	RENVOYER "Erreur WMI"
    FIN
     
    // A vous de jouer pour générer ou vérifier la clé de licence avec les infos les plus justes.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut
    Bonjour jurassic

    Est-ce que ces informations ordinateurs ne se changent plus après un formatage d'un PC ?

  10. #10
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    InfoLicence est une structure
    	NumSérieDisque est une chaîne
    	NumVolDisque est une chaîne
    	NumMacAdresse est une chaîne
    	NumSérieCarteMère est une chaîne
    	NomCarteMère est une chaîne
    	NumSérieBios est une chaîne
    FIN
    Ces infos sont liées au matériel, pas au système d'exploitation
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

Discussions similaires

  1. Protection logiciel par license
    Par theunknownman001 dans le forum Installation, Déploiement et Sécurité
    Réponses: 0
    Dernier message: 02/04/2012, 11h51
  2. Protection des logiciels par serial et validation
    Par megamario dans le forum Installation, Déploiement et Sécurité
    Réponses: 14
    Dernier message: 23/02/2011, 07h34
  3. Ouvrir/afficher un fichier avec son logiciel par défaut
    Par Alain P. dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/06/2009, 18h47
  4. [WD11] : Protection des logiciels par dongle
    Par PimSaVie dans le forum WinDev
    Réponses: 4
    Dernier message: 04/08/2008, 15h45
  5. Protection d'un logiciel par enregistrement sur serveur
    Par sbadecoder dans le forum Web & réseau
    Réponses: 3
    Dernier message: 12/10/2007, 23h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo