voilà, tout est dans le titre : je cherche à générer (ou récupérer) le CRC de l'application C++ (composée de 2 dll et d'un exécutable) que j'ai créée avec Visual.
Si vous avez une piste...
merci !
Version imprimable
voilà, tout est dans le titre : je cherche à générer (ou récupérer) le CRC de l'application C++ (composée de 2 dll et d'un exécutable) que j'ai créée avec Visual.
Si vous avez une piste...
merci !
Bonjour,
je ne comprends pas ce que tu veux faire .
Générer le CRC pour le fichier sur disque ?
C'est l'OS qui gère cela.
Quel est le but du projet ?
ben... je voudrais récupérer le CRC correspondant à mon appli (en fait les 3 CRC). Ca se calcule à la compilation ça non ?Citation:
Envoyé par mat.M
parce que je dois livrer ce projet avec un CRC qui ne doit pas bouger. Il sert de preuve par laquelle le code n'a pas été modifié.
salut, j'ai une methode pour calculer un CRC32
original_crc contient à la fin le CRC .Code:
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 #define CRC_MASK 0xFFFFFFFFL #define CRC32_POLYNOMIAL 0xEDB88320L unsigned long Ccitt32Table[ 256 ]; /* This array holds the CRC */ /* table used to calculate the 32 */ /* bit CRC values. */ #define UpdateCharacterCRC32( crc , c) ((unsigned long)((crc >> 8) & 0x00FFFFFFL) ^ Ccitt32Table[ ( (int) crc ^ c ) & 0xff ]) void BuildCRCTable() { int i; int j; unsigned long value; for ( i = 0; i <= 255 ; i++ ) { value = i; for ( j = 8 ; j > 0; j-- ) { if ( value & 1 ) value = ( value >> 1 ) ^ CRC32_POLYNOMIAL; else value >>= 1; } Ccitt32Table[ i ] = value; } } // utilisation BuildCRCTable();// initialisation // calcul du crc pour la chaine de caracterze sz se teminant par \0 unsigned long original_crc=CRC_MASK; for(int i=0;sz[i];i++) { original_crc=UpdateCharacterCRC32(original_crc,sz[i]); } original_crc^=CRC_MASK;
il suffira d'appliquer a ton prog le meme traitement de l'ouvrir comme un fichier et de calculer le CRC comme dans l'exemple octet par octet.
la methode est issue des transferts de fichier par Zmodem .
8O
re,
je rajouterai à mon dernier post que j'utilise moi même cette methode pour m'assurer de l'integrite de mes progs en distribution ou pour d'autres systemes de verifications.
euh oui OK mais ça ça me prouve que personne n'a modifié mon code. Mais ça ne peut pas prouver à une société tierce que je n'ai pas modifié mon code...Citation:
Envoyé par farscape
il n'y a rien de générique calculé par visual ?
mais quand tu expédie une version de ton soft, elle est accompagnée du CRC correspondant.
La société tièrce se base sur :
1- l'exécutable que tu as fourni
2- le CRC correspondant fourni.
Dans TOUS les cas il s'agit d'un couple code exe/CRC.
Bien évidemment si la société n'a pas les moyens techniques de générer le CRC à partir d'un EXE oui alors problème.
Mais alors pourquoi ne pas include un calculateur de CRC dans le soft qui sert à :
1- contrôler que le soft est correct vis à vis du CRC
2- affichicher le BAD CRC si il est incorrect ?
3- afficher le CRC correct dans la boîte "à propos" par exemple ?
c'est vrai, mais la société tierce ne pourra pas prendre comme argent comptant le CRC qui sera affiché dans le "à propos".Citation:
Envoyé par benoitB
Je peux très bien modifier mon code et mettre un affichage bison dans le "à propos" pour qu'il colle à l'ancien CRC.
effectivement, il faudrait qu'il aient un calculateur de CRC à eux et qu'ils vérifient à chaque fois...
oui tout à fait d'accord avec twa.
Mais si tu me vends un soft avec le CRC "calculé" puis affiché dans "à propos", ben mwa je procède ainsi :
0- je contrôle le soft que tu me donnes (taille + toutes les infos accessibles sans le lancer)
1- j'installe ton soft, je lis son CRC "calculé" dans la boîte de dialogie "à propos"
2- je quitte, modifie ton soft (1 caractère), relance ton soft puis refait 1- & là ben normalement le CRC devrait avoir changé.... la suite en 3-
3- je te rapelle "allo Eugénie ? on a un problème !"
C'est possible ? (je suis pas expert en la matière)
Ou alors je recherche dans l'exe (ULTRAEDIT) la chaîne de caractère indiquée dans "à propos".
PS : bon je suis vicieux je sais...
il existe des logiciels qui calculent le crc d'un fichier.
Tu generes le crc de tes fichiers avec le programme
tu donnes le fichier qui contient le crc
et l'entreprise peut verifier le crc avec ce meme logiciel
donc, soit tu crées toi meme le logiciel qui calcule le crc (avec la méthode de farscape par exemple), soit tu récuperes un logiciel qui le fait deja (ca fait plus sérieux), j'en connais un shareware pas mal :
http://homepage.ntlworld.com/lee.midgley/SFVChecker.zip
mais il doit aussi y en avoir des gratuits
a+
ben merci à tous :=)
je vais utiliser un logiciel externe et voir comment on peut s'arranger...
effectivement :roll:Citation:
Envoyé par benoitB
salut,
c'est sur, moi j'ai donné un bout de code pour calculer un CRC et resoudre un pb de coding ,maintenant tout dépend des relations avec tes clients si ils veulent être sur que le soft ne soit pas modifier mettez vous d'accord sur une méthode externe (prog commercial ) et commune de vérification.
bon maintenant s'amuser à changer le prog comme dit dans le post précèdent le crc sera pas le même .reste à savoir si dans l'histoire le pb initial est fondé pourquoi ils veulent un crc tes clients s'assurer des virus ,la peur que tu modifies sans leur dire c'est le kgb ou la cia tes clients ?
en tout cas j'aimerai pas travaillé dans un climat ou la confiance client-fournisseur n'est pas réciproque mais basé sur la suspicion.
8O
Salut, c'est pas l'histoire du KGB ou autre mais j'ai travaillé dans des domaines que je qualifierai de ... sensibles :
- spatial
- miltaire
- aéronautique
pour lesquels les procédures de recette des logiciels (comme des matériels) sont très rigoureuses et ce n'est pas pour se protéger mais :
- assurer une PARFAITE traçabilité du logiciel
- assurer un fonctionnalité AMONT à 100% du cahier des charges
- assurer également une protection juridique
- tout les reste (virus, mofid malveilante)
- assurer un sécurité dans la transmission du soft sous n'importe quel vecteur (mail, PTT, hertzien, etc)
Pas de méfiance à priori mais, à mon avis, une rigueur AMONT. Moi cela ne me dérange pas, je considère cela NORMEL.
Salut,
J'ai un peu regardé le format PE et il existe une date/heure de génération du soft (généré par le linker bien sur)
Ca plus un crc externe ça devrait suffire non ?
Deux cas possibles :
1- tu t'adresses à une société qui a un svce infor NORMAL, ce service peut prendre en charge le contrôle & le suivi des versions (softf + CRC)
2- ce n'est pas le cas :
2-1- de la confiance (...)
2-2- Choisir un soft de contrôle externe (payant ça fait plus pro)
Ce qui n'empêche pas d'intégrer un calcul de CRC interne au soft.
Da façon classique, avec les agl actuels les données accessibles en interne par le soft me semblent suffisantent (built & co).
pour répondre à toutes les questions concernant la confiance :Citation:
Envoyé par farscape
nos produits sont homologués. On homologue une version qui correspond à un CRC et on n'a le droit de commercialiser que la version homologuée (donc un CRC qui ne doit pas bouger).
Les appli précédentes étaient développées sur des terminaux (avec OS spécial qui indique le CRC lors du chargement de l'appli sur ledit terminal). Mais là, mon appli est en Visual C++ et je dois tout de même la faire homologuer...
voilà pour la petite histoire...
Salut,
Effectivement dans ce cas il vaut mieux utiliser un prog commercial qui fait le boulot, je suis même étonné que la méthode ne soit pas déjà déterminée par ce genre de société...
:D
farscape, tu m'as donné une méthode de calcul mais ma question est : comment je fais pour calculer le CRC correspondant à l'ensemble de mon appli (les 2 dll plus l'éxécutable) ?
merci
salut,
bien tu enchaînes la lecture fichier après fichier pour obtenir un crc global
8O
okCitation:
Envoyé par farscape
et je lance bien la lecture des .dll et du .exe (pas les fichiers de code) ?
et... je ne vois pas dans ton code où tu indiques quel fichier lire...
salut,avec ca devrait etre bon (j'ai pas teste)
8OCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 char *aszFileName[]={"nom1.exe","nom2.exe"}; unsigned long original_crc=CRC_MASK; FILE* stream; int i=0; // utilisation BuildCRCTable();// initialisation for(int i=0;i<sizeof(aszFileName)/sizeof(char *);i++) { stream = fopen(aszFileName[i],"rb"); fseek( stream, 0L, SEEK_SET); while(!feof( stream )) { original_crc=UpdateCharacterCRC32(original_crc,fgetc( stream )); } fclose(stream); } original_crc^=CRC_MASK;
salut,
projet simple complet dispo sous :
http://farscape-dev.chez.tiscali.fr/download.htm
prendre CRC32.
8O
okCitation:
Envoyé par farscape
c'est gentil mais le zip est corrompu quand je le download.
J'ai intégré ton code. Ca marche bien sauf que je pensais qu'un CRC32 était de la forme A4B2 par exemple (8x4 = 32). Là, j'ai un CRC du genre 51BBE4B4... dois-je modifier le MASK ?
mince pour le zip c'est mon prog ftp qui a foiré ca sera reparé ce soir.
par contre la je comprends pas le sens de ta question .Citation:
Ca marche bien sauf que je pensais qu'un CRC32 était de la forme A4B2 par exemple (8x4 = 32). Là, j'ai un CRC du genre 51BBE4B4... dois-je modifier le MASK ?
le crc resultant peut etre afficher sous forme de chaine hexadecimale:
en utilisant %X ou à un format fixe %10X
dans tous les cas c'est le resultat du calcul du polynome .changer la valeur du mask me semble hasardeux sauf à en maitriser le calcul ce qui n'est pas mon cas!
8O
oui ben je l'affiche avec %.4X mais il est trop grand et s'affiche sur 8 caractères hexa : 51BBE4B4Citation:
Envoyé par farscape
euh... scuse, là c'est moi qui déconne...
en fait, j'avais besoin d'un CRC 16 bits :roll:
FF 8 bits char
FFFF 16 bits short integer (en mode 32bits)
FFFF-FFFF 32 bits.... long ou un int
maintenant si tu veux un crc 16 bits je peux trouver ça mais il faut savoir que la precision est moins bonne.
8O
oui je veux bien un algo sur 16 :)Citation:
Envoyé par farscape
(m'en fiche de la précision)
mon message est arrivé apres le tiens !
:D
je regarde pour le 16bits reponse dans pas longtemps.
:D
voila !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 unsigned short int Ccitt16Table[ 256 ]; void BuildTable16( ) { int i; int j; int k; int crc; for ( i = 0 ; i < 256 ; i++ ) { k = i << 8; crc = 0; for ( j = 0 ; j < 8 ; j++ ) { if ( ( crc ^ k ) & 0x8000 ) crc = ( crc << 1 ) ^ 0x1021; else crc <<= 1; k <<= 1; } Ccitt16Table[ i ] = crc; } } #define CalculateCharacterCRC16(crc,c) (unsigned short int) ( ( crc << 8 ) ^ Ccitt16Table[ (crc >> 8 ) ^ c ] )
:D
j'ai modifié :
#define CRC_MASK 0xFFFFFFFFL
par :
#define CRC_MASK 0xFFFFL
résultat : nickel !
et je dirais :
merci tu m'as sauvé la vie ! (comme toujours) ;)
valeur initial du Mask 0.
:DCode:
1
2
3 crc=0; crc=CalculateCharacterCRC16(crc,c)
ok merci ! :lol:
original_crc^=CRC_MASK;
se transforme aussi en original_crc^=0; ??? t'es sûr ?
apparement il y pas besoin de le faire à la fin.
8O
autre chose :
je compile, j'execute : crc = AC9A
je ré-execute : crc = AC9A
je recompile (sans changer le code d'un pouce), j'execute : crc = 0EFF.
normalement, si je recompile sans changer le code, j'ai le même CRC non ?
effectivement ,
moi je ferais le test suivant:
je compile j'execute je regarde le crc ,je mets le prg de cote
je recompile j'execute je regarde le crc si <> je reteste avec le prog mis de cote .
si le resultat est le même ça veut dire que le compilo ne produit toujours la même chose sinon bug
tient moi au courant .
:D
le plus simple est que je te file mon code :
Code:
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 unsigned short int Ccitt16Table[ 256 ]; void BuildTable16( ) { int i; int j; int k; int crc; for ( i = 0 ; i < 256 ; i++ ) { k = i << 8; crc = 0; for ( j = 0 ; j < 8 ; j++ ) { if ( ( crc ^ k ) & 0x8000 ) crc = ( crc << 1 ) ^ 0x1021; else crc <<= 1; k <<= 1; } Ccitt16Table[ i ] = crc; } } #define CalculateCharacterCRC16(crc,c) (unsigned short int) ( ( crc << 8 ) ^ Ccitt16Table[ (crc >> 8 ) ^ c ] ) // utilisation unsigned long CalculeCRC(){ char system_path[1000]; GetWindowsDirectory(system_path, 1000); char DllPlop[1000]; sprintf(DllPlop, "%s\\DllPlop.dll",system_path); char Classe[1000]; sprintf(Classe, "%s\\Classe.dll",system_path); char *aszFileName[]={DllPlop,Classe, "MON_APPLI.exe"}; unsigned long original_crc=0; FILE* stream; int k=0; BuildTable16();// initialisation for(k=0;k<sizeof(aszFileName)/sizeof(char *);k++) { stream = fopen(aszFileName[k],"rb"); fseek( stream, 0L, SEEK_SET); while(!feof( stream )) { original_crc=CalculateCharacterCRC16(original_crc,fgetc( stream )); } fclose(stream); } //original_crc^=CRC_MASK; return original_crc; }