5/5 (12 avis)
Snippet vu 23 527 fois - Téléchargée 127 fois
La modification de variable interne dans un programme déja compilé ... Possible ? Impossible ? En delphi c'est Impossible ? He bien non , avec le procédé que nous énoncerons plus loin vous pourrez stocker , des chaines , des fichiers , et bien d'autre chose .... I Pourquoi ? Enregistrement de logiciel Préférence , au lieu des fichiers INI Informations de sécurités Ajout de fichier voir de Plug-in et autre ... Creer des logiciels d'installation du type InstallShield ... He oui c'est possible ;-) Bonne chance ... II Introduction Chaque systeme d'exploitation utilise une architecture différente pour ses executables , ici nous citerons uniquement PE(Win32) ce qui reste bien sur valable pour Linux(ELF) Les infos de chargement sont les données qui permettent de charger les infos du disque et de tout charger en mémoire .... III Ou met on alors les informations ? On met simplement les données à la fin dans une partie nommée partie de personalisation ... ---------------------------------------- Headers ---------------------------------------- Section /Segment N°1 --------------------------------------- Section/Segment N°2 --------------------------------------- | | ---------------------------------------- Section/Segment N ---------------------------------------- ---------------------------------------- !!! Partie personalisable !!! ---------------------------------------- IV Que peut on ajouter dans cette partie ... Tout , ce qui est binaire ou qui ressemble à du texte ;-) Enfin tout . Voici les variables et constante que nous déclarerons pour écrire dans un fichier dit exe ... const //Notre Signature de L'EXE, cette trace nous servira à savoir ou l'on doit chercher... ExeBufSig = 'EB1.0'; type //Le record nous aidera à insérer mais aussi retrouver notre trace ... TExeBufFooter = record OriginalSize : Integer; Sig : Array[0..4] of char; end; VI Comment ajouter des données . Vous devez traiter ce fichier , comme un fichier normal binaire , rien de plus dur , rien de plus simple , Attention le fichier ne doit pas être utilisé pour la modification ... procedure SetExeData (ExeName : String; ExeBuf : TExeBuf); var F : File; BufSz,OrigSz : Integer; Footer : TExeBufFooter; begin AssignFile (F,ExeName); Reset (F,1); try //On place dans la variable OrigSZ la taille du fichier d'origine OrigSz := FileSize(F); //On va grace à seek à la fin du fichier Seek (F,OrigSz); //On écris nos données juste après la fin du fichier ... BufSz := Length(ExeBuf); BlockWrite (F,Pointer(ExeBuf)^,BufSz); //On écris ensuite notre Footer FillChar (Footer,SizeOf(Footer),0); Footer.OriginalSize := OrigSz; Footer.Sig := ExeBufSig; BlockWrite (F,Footer,Sizeof(Footer)); finally CloseFile (F); end; end; VII Comment Lire des donnés Encore une fois pas trop compliqué , mais il fallait y penser ... procedure GetExeData (ExeName : String; var ExeBuf : TExeBuf); var F : File; CurrSz, BufSize : Integer; OldFileMode : Integer; Footer : TExeBufFooter; begin AssignFile (F,ExeName); //On sauve l'ancien FileMode OldFileMode := FileMode; //On utilise LectureSeul FileMode := 0; try Reset (F,1); try //On prend la taille courante du fichier CurrSz := FileSize (F); //On cherche la place de BIG footer LOL et on le lit Seek (F,CurrSz-SizeOf (Footer)); BlockRead (F,Footer,Sizeof(Footer)); //SI il n'ya pas de Signature BEN c'est qu'il n'y apas de donnée ... if Footer.Sig <> ExeBufSig then raise EExeBuf.Create ('Pas de donné dans l''exe'); /On calcul le Tampon que l'on à écrit ci dessus BufSize :=CurrSz-Footer.OriginalSize-SizeOf(Footer); SetLength (ExeBuf,BufSize); //On cherche et on LIT ! MDR Seek (F,Footer.OriginalSize); BlockRead(F,Pointer(ExeBuf)^, BufSize); finally CloseFile (F); end; finally //On fait un retour vers le FileMode qu'on à sauver en haut ... FileMode := OldFileMode; end; end; VII Traiter ce que l'on a récupéré Oui il faut traiter les données afin de pouvoir les utiliser , rien de compliqué , c'est MOVE qui nous mache le travaille , sinon faites très attention les données que vous inscrivez ne sont pas cryptés .. Elle sont visibles même avec Notepad .... Conclusion cryptéz les avec un Algo maison ... procedure StringToExeBuf (const S : String; var ExeBuf : TExeBuf); begin SetLength(ExeBuf,Length(S)); Move (Pointer(S)^,Pointer(ExeBuf)^,Length(S)); end; function ExeBufToString (const ExeBuf : TExeBuf) : String; begin SetLength (Result,Length(ExeBuf)); Move (Pointer(ExeBuf)^,Pointer(Result)^,Length(ExeBuf)); end; VIII Bon on l'utilise ??? Oui , Oui deux secondes voici comment utiliser tout cela ... Lire : procedure TForm2.Button1Click(Sender: TObject); var ExeBuf : TExeBuf; begin GetExeData(ParamStr(0),ExeBuf); // On va chercher memo1.Text:=(ExeBufToString(ExeBuf)); // On traite end; end. Ecrire : procedure TForm1.Button1Click(Sender: TObject); const FileName = 'LEFICHIER.exe'; var ExeBuf : TExeBuf; begin StringToExeBuf(memo1.Text,ExeBuf); // On traite les données SetExeData(FileName,ExeBuf); // On les range dans le fichiers ;-) end;
6 juin 2005 à 18:14
26 sept. 2004 à 16:47
1 mars 2004 à 16:15
j'ai essayé créer une exe d'après cette source mais je peux pas, je trouve des erreurs dans la ligne suivante
BlockRead(F,Pointer(ExeBuf)^, BufSize);
est ce que vous pouvez m'aider
merci d'avance
23 déc. 2003 à 19:04
25 oct. 2003 à 22:18
Writing custom data to executable files in Windows and Linux
http://bdn.borland.com/article/0,1410,27979,00.html
la reponse pour le TExeBuf est :
type
//fixed-size buffer for the custom data
TExeBuf = Array [0..555] of char;
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.