System-Linux

Aller au contenu | Aller au menu | Aller à la recherche

Compiler script shell bash et sh

Petite présentation de Shc : Shell script compiler (compileur de script shell).

Shc est un programme qui permet de compiler ses scripts shell pour en faire des binaires. Intérêt : protéger son code source. Ensuite, vous avez aussi la possibilité de créer une date d’expiration. Cette fonction sera intéressante si vous désirez une distribution de votre logiciel avec une licence qui expire au bout de X jours ou mois.

Vous voyez tout ceci reste dans l'esprit open source :) ....

Installer Shc :

yum install shc 
aptitude install shc 

Compilation d'un script shell :

Pour test shc sur un script bash quelconque :

#!/bin/bash
echo "QUI NE SAUTE PAS N'EST PAS LYONNAIS ! ouhaiii !" 

Compiler comme ceci :

shc -f script-test.sh 

Ceci crée un fichier binaire nommé script.sh.x :

file script-test.sh.x
script-test.sh.x: ELF 64-bit LSB executable, x86-64 

Un vim vous donne :

^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^B^@^C^@^A^@^@^@p<89>^D^H4^@
@^@à^@^@^@^E^@^@^@^D^@^@^@^C^@^@^@^T^A^@^@^T<81>^D^H^T<8
1>^D^H^S^@^@^@^S^@^@^@^D^@^@^@^A^@^@^@^A^@^@^@^@^@^@^@
<80>^D^H^@<80>^D^H,^V^@^@,^V^@^@^E^@^@^@^@^P^@^@^A^@^@^@,^
D^H,¦^D^H^D^D^@^@X^E^

Donc ça fonctionne :)

Si on veut utiliser une date d'expiration (dd/mm/yyyy) avec un message à afficher quand celle-ci est atteinte :

shc -f script-test.sh -e 16/01/2009 -m "Merci de m'envoyer des euros si vous voulez continuer à utiliser ce logiciel" 

Test du binaire :

./script-test.sh.x
./script-test.sh.x: has expired!
Merci de m'envoyer des euros si vous voulez continuer à utiliser ce logiciel

Test de performance d'exécution :

Voici un petit test de rapidité d'exécution sur un script shell et ensuite sur son binaire après compilation avec shc.

time ./gangan.sh 
binaire top secret qui ne doit pas tomber entre de mauvaises mains
bla bla bla

real	0m0.009s
user	0m0.000s
sys	0m0.008s

time ./gangan
binaire top secret qui ne doit pas tomber entre de mauvaises mains
bla bla bla

real	0m0.053s
user	0m0.012s
sys	0m0.012s

On peut constater une petite perte de performance pas méchante avec un ptit script mais avec un script un peu plus complexe...

Voila vous savez tout :)

Par GanGan | le samedi, janvier 17 2009 07:58

Commentaires

1. PB

samedi, janvier 17 2009 | 13:13

Pour la date d'expiration : que se passe-t-il si on change la date sur le PC ?
Peut-on utiliser l'exécutable indéfiniment par cette astuce ?

Merci.

2. gangan

samedi, janvier 17 2009 | 15:01

je n'ai pas essayé, essaye et dis nous :)

3. RaX|

samedi, janvier 17 2009 | 15:47

Il es très simple de cracker la protection par date il fait un appel a la fonction time (), pour le débugger ya un anti ptrace, c'est assez simple aussi. Je vous proposerai bientôt un petit tuto pour cracké cette chose. Je trouve que se n'est pas trop l'esprit Linux ça :s.

4. gangan

samedi, janvier 17 2009 | 16:01

J'attend ton ptit tuto avec joie et allégresse :p

5. Kévin Hinault

jeudi, janvier 29 2009 | 16:03

D'accord avec RaX| ... une date de péremption, ce n'est pas dans l'esprit linux, je ne connais qu'un exemple de ce type pour des raisons commerciales : Helix.
Par contre compiler du code peut très bien être dans l'esprit de l'Open Source. Après tout, les 3/4 des applications sous linux sont compilés mais il est imposé de fournir les sources pour que l'on puisse les modifier et recompiler soi-même ;)

L'autre intérêt que je concède (et encore je n'ai pas vérifié) à cette méthode serait de performer l'exécution du script. As tu fait des comparaisons ?

Le code est il vraiment vraiment compilé ? ou alors comme pour des scripts Perl "compilé", il ne fait que se dépiler en mémoire ?

6. Kévin Hinault

jeudi, janvier 29 2009 | 16:06

Pour éclaircir ce que je viens d'écrire : je parle d'une comparaison entre un même algorithme complexe en C/Perl/etc et en Script Shell.

7. RaX|

vendredi, janvier 30 2009 | 15:03

Bonjour, Kévin,

Nan le code n'est pas compilé a proprement parlé il est toujours interprété avec un shell. On a donc pas ici de gain de performance au contraire car le temps d'exécution du binaire est a ajouter (même si cela est a compter en milliseconde). Ce dernier fait ensuite appel a la fonction "execvp ()".

Compiler un script sh/bash en véritable binaire me semble peu envisageable.

Je pense qu'il ne faut pas oublier que le scripting doit rester du scripting, même si sous Linux/UNIX il est extrêmement puissant. Ce n'est pas destiné a écrire de véritable application.

Si les besoins sont critique en terme de performance, rien de mieux que les langages compilés et non interprétés. Même si il est vrai que l'écriture est un peu plus long c'est au mon sens bien plus intéressent, mais bon .. C'est pas le C/C++ qui vont me faire trouver une petite femme moi (faut que j'arrête :'()

++

8. Mady

dimanche, octobre 25 2009 | 11:39

Comment compiler un script écrit en shell de bourne?
Merci d'avance!!!!!!!!

9. GanGan

mercredi, décembre 23 2009 | 11:50

tu as essayé shc sur ton script en bourne ?