|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Arthur CousseauInscription : octobre 2011 Messages : 23 ![]() |
Bonjour,
Voilà pour le contexte : je voudrais faire un jeu de hacking. Le joueur rentrerait des commandes pour trouver une adresse IP, essayer de passer le firewall, etc, etc... je n'y connais rien en hacking mais j'ai toujours eu envie de m'y essayer, malheureusement ce n'est pas simple Du coup, je me suis dit que j'allais faire un jeu pour ceux qui sont comme moi intéressés par le hacking, bien sûr ce serait pour de faux mais assez réaliste tout de même ![]() Donc voilà, je veux imiter le comportement d'une console UNIX. Je définirai mes propres commandes, écrirai le mode d'emploi de chaque commande moi-même, etc... Voilà pour la théorie Malheureusement en pratique ce beau rêve est gâché par un problème ma foi relativement simple : et pourtant, je ne vois pas l'erreur ! Il s'agit de récupérer la commande que va entrer l'utilisateur et d'en repérer les composantes : [cmd] [-opt] [arg] Cette syntaxe ne doit pas vous être inconnue Donc en gros, l'utilisateur saisit une chaîne de caractères, et moi j'identifie les morceaux et je stocke le nom de la commande dans une variable, l'option dans une autre, et l'argument dans une troisième variable. Et évidemment, si la saisie de l'utilisateur n'est pas de cette forme, eh bien ça plante ![]() Voilà le code que j'ai déjà écrit. Code :
Exemple : testez mon code avec ls -a Documents. ( bien sûr je ne reprendrai pas les mêmes commandes que celles existantes c'est juste un exemple ) Le programme vous renverra, ligne après ligne : - La commande - L'option - L'argument Donc il devrait renvoyer : ls -a Documents Et pourtant il me renvoie : l [rien] [rien] Consternant !!!
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : avril 2002 Messages : 2 273 ![]() |
Et non ce n'est pas consternant !
Le problème vient d'une "mauvaise" gestion des chaînes de caractères. Premièrement, il faut savoir que le premier octet d'une chaîne en Pascal contient la longueur de la chaîne, ce premier octet on peut y accéder par l'intermédiaire de l'index 0 (souvenez vous les chaînes de caractères ne sont pas autres choses que des tableaux). Donc, la valeur stockée dans ch[0] doit retourner le nombre de caractères dans la chaîne ch... Autre chose, l'affectation d'une valeur à une variable String modifie également ce nombre. Le fait d'initialiser cmd à ' ' va donc écrire 1 dans cmd[0] puis l'équivalent du caractère ASCII espace (c'est-à-dire le code 32 en décimal). Cependant, si on travaille comme avec un tableau, case par case (comme tu le fais), aucun mécanisme ne met à jour ce compteur en positon [0]. Sachant ces deux points, tu as affecté à cmd, opt et arg les valeurs ' ', donc la taille de la chaîne que ces variables contiennent sera de 1 caractère (mais attention comme ce sont des variables de type string standard sans spécification de taille, 256 octets sont alloués...). Cela veut dire que si tu fais des ajouts dans la chaîne (sans dépasser 255 caractères !) le compteur en position [0] n'est jamais modifié, donc l'ordinateur croira que ta chaîne fait toujours 1 caractère de long. D'où le fait que ton affichage ne fasse qu'une seule lettre (pour le deuxième et troisième il n'affiche rien du tout ou il affiche un espace te faisant croire qu'il n'affiche rien ?...) Heureusement y'a une parade. Au lieu de travailler case par case, tu peux utiliser la concaténation de chaîne (opérateur +) qui met à jour le fameux compteur... La ligne devient Pareil pour les autres !
__________________
M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal |
|
|
10
|
|
|
#3 | ||
|
Invité régulier
![]() Arthur CousseauInscription : octobre 2011 Messages : 23 ![]() |
Merci beaucoup pour ces explications je me suis repenché sur mon code, corrigé et optimisé deux-trois trucs par là et voilà le résultat 100% fonctionnel pour ceux que ça intéresse !!!!
Code :
|
||
|
|
00
|
|
|
#4 | ||||||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 393 ![]() |
un petit conseil, tu devrais écrire une fonction qui lit une chaîne et retourne un argument...
Code :
Code :
Code :
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||||||
|
10
|
Copyright © 2000-2013 - www.developpez.com