Exécutables se vérifiant lorsqu'ils sont lancés

Soyez le premier à donner votre avis sur cette source.

Vue 9 194 fois - Téléchargée 712 fois

Description

Un petit exercice de style : calculer le hash MD5 d'un fichier exécutable, et vérifier au lancement de ce dernier si sa signature actuelle correspond à celle qui a été mémorisée. Si les calculs ne correspondent pas, c'est que l'exe a été modifié (un simple bit fausse le calcul).

Comment ? Hé bien, un programme "sign" se charge de calculer le hash MD5 d'un autre exécutable, et injecte dans ce dernier une signature (l'empreinte MD5, voir ma source précédente pour plus de détails) dans une partie inutilisée de l'entête MZ (le tableau e_res2, pour ceux à qui cela dit quelque chose). Bien sûr, lors du calcul cette zone est mise à zéro afin de ne pas fausser les empreintes...

Ensuite lors de l'exécution, le programme signé hashe le fichier qui a serci à créer son processus et compare l'empreinte MD5 qu'il trouve à celle qui est mémorisée, et peut agir en conséquence (corrompu : afficher un warning et laisser le choix à l'utilisateur de continuer l'exécution ou pas, intègre : continuer l'exécution).

Bien sûr, cette petite astuce n'est que de peu d'efficacité contre un "cracker" confirmé, mais elle peut servir à assurer l'intégrité d'un exe téléchargé ;-)

Source / Exemple :


goto zip;

Conclusion :


Contenu du ZIP :

bon.exe = un binaire signé, dont le test automatique devrait réussir
mauvais.exe = le même binaire mais non signé, évidemment le test va échouer
sign.exe = le programme qui signe les autres, sign <nom des programmes>

check\* = les sources de bon.exe et mauvais.exe, seul le fichier main.c contient la routine de vérification

sign\* = les sources de sign.exe, idem seul main.c contient la routine de signature

Dans les deux dossiers, assert.* correspond aux assertions (des fonctions permettant de vérifier simplement les retours d'API et de savoir ce qui ne va pas en cas d'erreur) et console.* permet d'utiliser la console en Unicode (avec accents, donc). Quand à config.h, je vous laisse deviner ;-)

Codé avec GCC, mais devrait compiler sous n'importe quel compilateur C.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

NitRic
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Tu devrais peut-être revoir l'utilité de `assert()` ... C'est carrément de l'abus dans le cas présent :P
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
C'est vrai que j'abuse un peu, mais j'ai déjà trouvé des choses assez surprenantes grâce à cette petite macro... Et vu qu'il n'en reste aucune trace en mode release si on définit la macro NDEBUG, pourquoi se priver ;-)
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7 -
Je m'y connais pas du tout en emprunte MD5, mais il est forcément possible que 2 fichiers différents aient la même signature, si des changements se compensent... sans doute dans une probabilité très faible?
cs_LordBob
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
8 -
j'aimerais juste savoir ce que c'est un MD5, je vois ca très souvent, mais je ne sais jamais ce que c'est?
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Vecchio56 > Il paraît que la probabilité d'avoir la même empreinte pour une variation du fichier original est extrêmement faible, pour ainsi dire inexistante. Mais elle existe oui, et pour l'éviter il faudrait se tourner vers des algorithmes plus perfectionnés comme SHA. En tout cas elle est bien plus faible qu'avec un CRC, de ce que j'ai pu en lire.

LordBob > Un hash MD5 c'est un calcul perfectionné qui a lieu sur des données (ici, un fichier) et qui permet d'en extraire en quelque sorte une "empreinte digitale" sur 128 bits, cette empreinte étant hautement variable : si tu re-hashes le fichier en en modifiant seulement un bit, elle va être totalement changée... Plus d'informations (y compris la méthode de calcul) sur ce site http://abcdrfc.free.fr/rfc-vf/rfc1321.html

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.