Inclure une application multimedia dans C++

chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005 - 3 juil. 2004 à 11:16
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 18 août 2004 à 02:34
Bonjour,
je travaille sur un projet où je dois protéger les cd par une license.
En fait, je dois récupérer les caractéristiques de la machine( num du DD, carte mere...) du client et fournir un numéro de série pour que le cd ne fonctionne que sur cette machine.
l'application de protection et le programme à executer doivent etre dans le meme executable.
Pouvez-vous me donner une idée comment inclure une application externe (surtout multimédia: flash, php...) dans mon programme ecrit en C++.
Merci

34 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 juil. 2004 à 03:23
Salut,
Moi aussi je m'étais intéressé à ce genre de protection il y'a quelque temps. J'ai quelques idées qui pourraient te servir. Il faudra m'indiquer sur quel OS tu travailles (Windows, Linux etc..) et avec quel environnement de developpement (Visual C++, DEVC++ etc...). J'aimerais bien aussi avoir quelques autres précisions car je ne vois pas bien le lien entre l'inclusion d'une "application externe multimedia" et la protection de ton programme.
A bientôt !
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
9 juil. 2004 à 23:39
salut,
je travaille avec visual c++ sur windows, mon idée est de recuperer les caracteristiques de la machine: les numeros de serie de la carte mere et du processeur (si vous avez une idee comment le faire avec c++ merci) puis d'utiliser une fonction de hachage pour generer une cle d'activation qui depend de la machine .
l'autre probleme est que mon application doit appeler l'executable , je peux le faire avec system mais il y aura 2 executables et l'utilisateur peut lancer l'execution sans passer par ma protection donc il faut qu'il y aura un seul executable.
merci de me donner tes idees
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 juil. 2004 à 07:25
Salut,
Ca tombe bien car moi aussi je travaille sur Visual C++. Voici quelques idées :
1) Il n'existe pas de numero de serie de la carte mere parmi les données consultables du Bios. J'ai cherché pendant des mois en vain.
2) Le numero de serie du microprocesseur, Pentium III et +, est désactivable au moyen du setup du Bios ou meme par logiciel. Il est donc inutile d'utiliser ce numero pour la protection de ton logiciel.
3)Une protection, basée sur une configuration donnée, n'empeche pas l'execution de l'application sur des machines ayant des configurations identiques.
4) Les deux seuls moyens permettant l'identification d'un ordinateur de maniere unique sont :
a- La recuperation de l'adresse MAC de la carte réseau. Cette adresse est unique au monde pour chaque carte réseau car elle comporte le code du fabriquant, celui du modele et un numero de serie unique.
b-La recuperation du numero de serie materiel du disque dur. Je dis bien materiel car le numero de serie logiciel change apres chaque formatage. Le numero materiel est figé dans une puce du disque dur.
5) Pour inclure une autre application dans ton fichier executable, il suffit de l'ajouter au projet comme ressource. Les deux applications seront dans le meme fichier exe. Pendant l'execution, l'application principale copie la ressource sur le disque dur et l'execute avec WinExec ou ShellExecute etc... Quand le controle revient à l'application appelante , ce fichier doit etre effacé. Ca parait un peu lourd mais il n'y a pas d'autre moyen.
6) Si tu possède les codes sources des deux applications, tu peux les mettre dans le meme projet. Ainsi, toutes les fonctions seront disponibles comme s'il s'agit d'un seul code source. Le fichier exe final contiendra donc les deux applications.

Voilà je ne veux pas etre trop long. Tu me precise les idées qui t'interessent et je te fournirais d'autres détails.
A tres bientot!
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
12 juil. 2004 à 11:06
merci bcp,
j'ai encore quelques eclaircissements à demander:
1)la carte reseau n'est pas toujours presente donc comment je recupere le serie materiel du disque dur et non pas le numero de serie logiciel.
2) j'ai pas comris comment ajouter l'autre application comme ressource (je ne suis pas expert en c++), et si je le fais comment je garantit que le controle reviendra à l'application appellante pour effacer le fichier, il se peut que l'utilisateur interrompe l'execution donc l'executable deviendra disponible sans aucune protection.
3) un dernier point: apres la recuperation des numeros j'ai besoin d'une fonction de hachage, mais dans la specification du projet cette fonction doit etre changeable et non pas statique, connais tu une bibliotheque en c++ qui me facilitera la tache
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
15 juil. 2004 à 21:42
Salut,
1) Les fonctions de récupération du numéro de série matériel du disque dur, que j'avais dans mes anciens projets, ne fonctionnaient que sur MS-DOS, Windows 3.xx, Windows 95, 98 et ME. Pour faire la même chose sur toutes les versions de Windows ( y compris NT, 2000 et XP), je fais appel à un contrôle Activex qui fournit toutes les caractéristiques du PC. La manipula de cet Activex est facile sur Visual c++ MFC. Puisque j'aime pas beaucoup MFC, je cherche un moyen de le manipuler en Visual C++ pur API. Je vais poster une question à ce sujet sur ce forum.
2)Pour ajouter un ou plusieurs fichiers exécutables (ou autres) comme ressources dans un projet Visual c++ version 6 :
- Créer un projet vide (Win32 Application par exemple)
- Menu "Project" -> "Add to project" -> "New" -> "Resource Script", donnez lui n'importe quel nom puis "Ok".
-Dans la fenêtre d'édition de ressources qui apparait, clic droit, choisis ton fichier exe. Une petite boite s'affiche, tape "RT_RCDATA" dans le champ "Resource type" puis "Ok".
-Ta ressource apparait maintenant dans la fenêtre. Tu peux changer son identificateur en faisant un clic droit dessus puis "Properties".
- Pour manipuler ta ressource dans le programme, tu fais appel aux fonctions FindResource(), LoadResource() et LockResource(). Elles sont largement documentées sur le site de Microsoft MSDN.
- N'oublie pas d'ajouter "#include "resource.h" au source principal.
- Tu peux ajouter une ressource à n'importe quel moment de la programmation en activant le fenêtre des ressources (clic sur l'onglet resources en bas à gauche).
3) Comme tu l'as remarqué, si l'exécution du programme est supendue à un moment donné, l'utilisateur peut accéder au fichier copié de la ressource vers le disque dur. Je pense que la meilleure solution pour contourner tout cela est de mettre tous les fichiers sources dans le même projet. Ainsi, ton application intégrera tous les modules nécessaires à son exécution.
4) Je n'ai jamais utilisé de fonctions de hachage dans mes projets car je me contente de crypter les données que veux par rotation de bits suivant un algorithme précis. Des exemples de fonctions de hachage sont faciles à trouver sur le net.

Voila
Quand j'aurai fini l'exemple de source pour récupérer le No du disque dur , je le posterai comme code source sur ce site.
A bientôt.
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
16 juil. 2004 à 18:11
salut,
merci bcp racpp, les informations que tu m'as donné sont vraiment tres utiles pour moi surtout que je suis limité par une date, donc stp informe moi dès que tu termines l'exemple de la recuperation du numero du disque dur.
j'ai trouvé quelques sites qui parlent vaguement d'un numero de serie du bios, t'as pas une idée sur ca.
merci et a bientot
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
17 juil. 2004 à 03:37
Salut,
Ca me fait plaisir d'apprendre que mes infomations étaient très utiles.
1) Je profite de ce message pour te signaler que j'avais oublié un mot très intéressant dans la 3ème étape d'ajout d'une ressource. Il s'agit de "import" du menu contextuel . Voici l'étape corrigée:
-Dans la fenêtre d'édition de ressources qui apparait, clic droit, puis "Import" , choisis ton fichier exe. Une petite boite s'affiche, tape "RT_RCDATA" dans le champ "Resource type" puis "Ok".
2) Le numéro de série du bios est identique pour toutes les machines de même configuration et ayant la même version du bios. Certaines marques de bios possèdent un série unique mais ce n'est pas un standard. Le code de récupération de ce série ne fonctionne qu'avec ces bios.
3) En ce qui concerne l'exemple de code de récupération du série du disque dur, je te promets que dès qu'il sera pret, je te le signalerai ici.
je ne peux pas te dire quand, car en programmation il y'a toujours des imprévus.
A+
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
19 juil. 2004 à 20:07
salut,

je suis en train de voir la documentation de FindResource....
je voudrais te demander si tu sais comment recuperer le numero de serie du CD.
Une autre chose, j'ai essayé ce code mais j'ai des problemes (peux tu me donner des idées):

// Fetches the MAC address and prints it
static void GetMACaddress(void)
{
unsigned char MACData[6];

UUID uuid;
UuidCreateSequential( &uuid ); // Ask OS to create UUID

for (int i=2; i<8; i++) // Bytes 2 through 7 inclusive
// are MAC address
MACData[i - 2] = uuid.Data4[i];

PrintMACaddress(MACData); // Print MAC address
}

Enfin merci encore et a bientot
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 juil. 2004 à 05:13
Salut,
1) Pour récupérer le numéro de série du CD , on se sert de la fonction GetVolumeInformation(). Avant d'appeler cette fonction, il faudra trouver les lettres de tous les lecteurs de la machine avec GetLogicalDriveStrings() puis vérifier s'il s'agit d'un CD-ROM avec la fonction GetDriveType(). Voici un lien :
http://www.codeproject.com/win32/cdcheck.asp

2) Ce code me parait normal. N'oublie pas d'ajouter #include <Rpc.h> dans l'en-tête du code. Ce petit programme ne peut rien afficher car la fonction PrintMACaddress() n'est pas implémenté. Tu peux la supprimer et afficher MACDATA[] à ta façon. UuidCreateSequential() ne fonctionne que sur Windows XP et 2000 (ou 2003). Il faudra préférer une solution qui marche sur toutes les versions de windows.

voilà , bonne programmation !
A bientôt.
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
20 juil. 2004 à 09:49
salut,
voila j'ai essayé ce code, il me genere une erreur lors du build (à la compilation 0 errors, 0 warnings) :

#include <rpc.h>
#include <stdio.h
// Fetches the MAC address and prints it
static void GetMACaddress(void)
{
unsigned char MACData[6];

UUID uuid;
UuidCreate( &uuid ); // Ask OS to create UUID

for (int i=2; i<8; i++) // Bytes 2 through 7 inclusive
// are MAC address
MACData[i - 2] = uuid.Data4[i];

printf("%s",MACData[1]); // Print MAC address
}

void main()
{
GetMACaddress();
}
/////////////////////////////////////////

l'erreur est:
g.obj : error LNK2001: unresolved external symbol __imp__UuidCreate@4

si tu as une autre idée comment recuperer l'adresse MAC ça sera la bienvenue.
merci.
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
20 juil. 2004 à 14:50
salut,
j'ai ajouté le fichier comme ressource mais d'une autre maniere:
Menu "Insert" -> "Resource" -> "Import" .....puis c'est la meme demarche

mais maintenant j'ai un probleme dans l'utilisation de findresource...:
j'ai pas su qu'est ce que je passe en parametre comme premier
argument: HMODULE hModule?? j'ai vu que je peux l'avoir avec la fonction
GetModuleHandle(LPCTSTR lpModuleName) mais qu'est ce qu'est ce que je passe en parametre aussi.
merci
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
23 juil. 2004 à 02:33
Salut,
Je suis encore au stade de mise au point du source qui récupère le numéro de série du disque dur. Je l'ai testé sur Windows 98 et 2000, ça marche parfaitement bien. Je pense que ça devrait marcher pour XP. Je le proposerait comme source sur le site très bientôt.
A propos de ton code , il faudra ajouter la ligne suivante juste après les "includes" :
 #pragma comment (lib,"Rpcrt4.lib")

Je viens de le tester, l'uuid est bien généré mais il ne contient pas mon adresse MAC, à toi de le tester aussi. La ligne du "printf" génère une erreur car peu-être MACDATA[] me prait incomplet. A vérifier. A noter que le résultat donné par UuidCreat() peut être faussé par la présence de plusieurs adresses MAC sur le même PC. Moi j'en ai deux: celle de ma carte réseau et celle de mon modem ADSL. Le meilleur moyen pour récupérer l'adresse MAC est l'emploi de la fonction GetAdaptersInfo(). Elle fournit tout ce qu'il faut dans une structure spéciale qu'il faudra analyser pour prendre ce qu'on veut. C'est un peu compliqué mais ça fonctionne bien et sur toutes les versions de Windows. Pour pouvoir l'utiliser il faudra télécharger quelques fichiers "h" fournis par Microsoft dans sa platforme SDK.
On utilise la fonction FindResource() de la façon suivante :
HRSRC handle;
handle=FindResource (NULL, "Nom de la resource", "Type de la resource");

Ce handle sera utilisé dans la fonction LoadResource() etc...
Voilà
A bientôt
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
24 juil. 2004 à 15:50
Salut,
Je viens de tester mon code sur XP. Hélas, il ne marche pas. Pour le corriger il me faudra un peu plus de temps car je n'ai pas XP chez moi. Je préfère Windows 2000 pour raisons de stabilité. Heureusement, je viens de découvrir un exellent code source d'un utilitaire qui donne toutes les infos du disque dur, y compris le model et le série matériel. En plus, on précise que ça fonctionne sur tous les Windows. Ce code me parait très complet. Tu y trouveras tout ce que tu veux, j'espère. Voici le site :
http://www.winsim.com/diskid32/diskid32.html

Ce programme affiche les infos de tous les disques durs IDE installés sur l'ordinateur. Tu pourras modifier le code source pour le transformer en fonction qui renvoit les infos sous forme de tableau (DWORD diskdata [256]). Ensuite tu prends les données que tu veux pour les utiliser dans ton code. Tu trouveras dans le site tout ce qu'il faudra téléchager. Tout est gratuit !
Voilà
A très bientôt.
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
28 juil. 2004 à 09:29
salut,
j'ai encore des problemes avec l'utilisation de la ressource: la
compilation se fait mais à l'execution rien ne se passe.
je vais te dire ce que j'ai fait exactement:
j'ai fait un projet MFC App Wizard (exe), j'ai choisi Dialog Based
et as a statically linked library.
j'ai fait ensuite: Menu "Insert" -> "Resource" -> "Import", j'ai
importé le fichier .exe que je veux (nommé cp.exe), j'ai ecris
RT_RCDATA dans resource type.
maintenant dans le code du bouton continuer de la boite de dialogue,
j'ai ecris ce code:

HMODULE hModule=NULL;
LPCTSTR lpName="IDR_RT_RCDATA1";//c'est l'ID de la ressource
LPCTSTR lpType="RT_RCDATA";
HRSRC x=FindResource(hModule,lpName,lpType);
LoadResource(hModule,x);

au moment de l'execution, j'appuie sur le bouton continuer
mais l'executable ne se lance pas.(bien sur j'ai pas oublié
d'ajouter #include "Resource.h")
tu n'as pas une idée?
merci
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
28 juil. 2004 à 16:58
Salut,
Moi je ne travaille jamais sur MFC (Microsoft Frustration Classes). Je préfère travailler directement en API. Mais je pense que la manipulation des ressources est pareille dans les deux cas. Dans ton code, il faudra faire quelques modifications:
HRSRC x=FindResource(NULL, // Pas besoin de variable
MAKEINTRESOURCE(IDR_RT_RCDATA1), // Ajouter Macro 
"RT_RCDATA"); // Pas besoin de variable
HGLOBAL h=LoadResource(NULL,x);

Le premier paramètre des deux fonctions doit être NULL car la ressource est incluse dans le même fichier exécutable. La macro MAKEINTRESOURCE() traduit le nom de la ressource en identificateur numérique. Le troisième paramètre est le type de ressource entre guillemets. C'est ce que je fais depuis très longtemps et ça marche toujours. Je suis sûr que ça marchera pour toi aussi.
Voilà à bientôt
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
29 juil. 2004 à 11:36
salut,
je vais essayer de le faire.
maintenant j'ai reussi à recuperer l'adresse MAC, le numero du disque dur et le numero du CD.
merci bcp pour l'aide que tu m'a fournis.
il me reste de lancer la ressource (j'essayerai de le faire aujourrd'hui).
à bientot
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 juil. 2004 à 16:04
Salut,
Je suis très content pour toi. Ca fait toujours plaisir de savoir qu'on a été utile. Très bonne suite de programmation !
A bientôt.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 juil. 2004 à 16:54
J'ai oublié de te rappeler qu'il faudra ajouter la fonction LockResource() pour obtenir un pointeur sur la ressource, ce qui permet de l'enregistrer sur le disque dur avec CreateFile() et WriteFile() pour ensuite lancer le fichier avec WinExec() ou ShellExecute(). On ne peut pas exécuter la ressource directement en mémoire car elle commence par l'en-tête d'un fichier EXE. Voici un exemple :
HRSRC x x=FindResource(NULL,MAKEINTRESOURCE(IDR_RT_RCDATA1),"RT_RCDATA"); 
HGLOBAL h=LoadResource(NULL,x);
LPVOID  memptr=LockResource(h);
DWORD taille=SizeofResource(NULL,x);
HANDLE hfichier;
hfichier=CreateFile("C:\\cp.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD ecrits;
WriteFile(hfichier,memptr,taille,&ecrits,NULL);
CloseHandle(hfichier);
WinExec("C:\\cp.exe", SW_SHOW);

J'espère n'avoir rien oublié.
Voilà.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 juil. 2004 à 17:00
Désolé il y'a un "x" de trop dans la première ligne de code.
0
chedly_ensi Messages postés 21 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 24 mars 2005
30 juil. 2004 à 13:25
salut,
j'ai pas essayé encore avec ton dernier exemple mais hier j'ai trouvé que x est NULL (HRSRC x=FindResource(NULL........)
apres l'appel de FindResource.
je vais essayer ton exemple et je reviendrai dans quelques heures.
à toute à l'heure
0
Rejoignez-nous