Faire son patch avec Delphi :

 

Dans le n° précedent de Memento, nous avons vu comment faire un patch en Turbo Pascal. Maintenant nous allons nous tournez sur un language qui lui est proche et bien plus évolué, de le Delphi.

Ce language à été crée par Borland (Imprise) dans le but de fournir aux developpeur un outil de programmation visuel orienté objet souple et puissant pour des applications Windows. Pari réussi avec la version 5 mais rassurez vous, la version 3 serat bien largement suffisante pour faire le patcheur qui suis.

 

Exploration :

Avant tout je vais vous montrer les bases vitales pour la manipulation de Delphi et la logique qui l'accompagne. Je vais vous montrer pas-à-pas comment créer votre premier pogramme, le classique "Hello the world!" histoire de vous montrez où il faudrat aller pour modifier les élements du patcheur :

- Quand on démarre Delphi, ca resemble à ca (sans le bouton ):

 

Pour mettre le Bouton, dans la barre d'outils "Standard", cliquez sur l'icône "OK" puis sur la feuille de travaille (forme) dessinez le bouton comme si vous en dessiniez un sous Paint. Ensuite dans la barre d'inspection d'objets, rester sur l'onglet "Properties", cliquez dans la zone Caption et mettez y le nom que vous voulez attribuer au bouton. Voila, le tour est jouer! Quand au caractère &, il va servir à ce que le bouton soit activer si l'on fait Alt+C sur le clavier.

Pour que ce bouton serve à quelques chose, on va lui implementer une instruction. Pour ça, double-cliquer dessus, vous allez atterrir sur une feuille de code qui comporte ceci :

procedure TForm1.Button1Click(Sender: TObject);
begin

end;

end.

C'est entre "begin" et "end;" qu'il faut mettre le ou les instructions. Commenté ca donne :

procedure TForm1.Button1Click(Sender: TObject);	// Indique que ce qui suis appartient au bouton Button1
begin						// début de l'instruction

// On met le code ici
end;						// fin de l'instruction

end.						// fin de l'ensemble de le ou des instructions

 

Voilà, maintenant nous allons ajouter l'instruction qui va nous permettre d'affichier une boite de dialogue :

 

procedure TForm1.Button1Click(Sender: TObject);	// Indique que ce qui suis appartient au bouton Button1
begin						// début de l'instruction

ShowMessage('Hello the Word');			// permet d'afficher une messagebox
end;						// fin de l'instruction

end.						// fin de l'ensemble de le ou des instructions

 

Une fois fait, appuyez sur F9 pour démarrer le programme, enfin cliquez sur le bouton et là une boite devrait apparâitre avec le message "Hello the Word" à l'interieur :)

 

Ce qu'il faut et retenir:

- Une propriété est une variable attachée à un objet (ici, c'est un bouton)

- Lorsqu' un événement se produit, il déclenche une procédure qui lui est associée. Ici, c'est la procédure TForm1.Button1Click qui est déclenché. C'est à dire la méthode Button1Click de l'objet Form1, pour être bref, le bouton que l'on a mis.

- Toute modification au niveau objet (la forme et ses composant) peut se regler en partie automatiquement grace à leur barre de propriétée.

 

Le Patch :

 

Ce passage fait, je vais maintenant vous montrer comment faire un patch en Delphi, pour ca je vais seulement mettre le code source et le commenter. Pour ce qui est de la forme, vous pouvez la prendre ici.

Voila le source, tout ce qui est en rouge peut être modifier sans problemes :

 

----------------------------------------[ Début ]----------------------------------------

 

unit code;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    fichier: TOpenDialog;
    Button1: TButton;
    Info: TButton;
    Quit: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure InfoClick(Sender: TObject);
    procedure QuitClick(Sender: TObject);
  private
    { Déclarations privées}
  public
    { Déclarations publiques}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);		//début du programme

Const							// on déclare les constantes
    FileN         : String  = 'Progdemerde.exe';	// nom du fichier à patcher
    BytesToChange : Integer = 2;			// nombre d'octets à modifier
    FileS         : LongInt = 564132;			// taille du fichier
    A             : Array[1..2] of Record		// ici on modifie 2 octets
      A : Longint;					// limite de longueur de 2147483647 
      B : Byte;						// limite de 255 octets
      End =						// fin des déclarations

(
(A:$303E6;B:$90),  //adresses héxadécimales à modifier et leurs octects
(A:$303E6;B:$90)   //attention !! sur la derniere ligne=> pas de virgule !!);
);

Var			//déclaration de variables
  F     : File;		// F pour le fichier
  Ch    : Char;		// Ch pour les octet à patcher
  I     : LongInt;	// et I pour la longueur

Begin					// on commence
fichier.filename := '*.exe';		// on cherche un exe
fichier.filter := FileN;		// le fichier Progdemerde.exe 
if fichier.execute then			// si le fichier est trouve, alors...
begin					// on ouvre une comande
  AssignFile(F, fichier.filename);	// on cible le fichier
  Reset(F,1);				// ouvre le fichier existant
  If FileSize(F)<>FileS then		// si le fichier fait une taille < ou > à celle indiquée, alors...
     begin				// on ouvre une comande
     ShowMessage('File is incorrect size');	// on affiche le texte comme quoi ca ne fait pas la bonne taille
     halt(1);				// et on stoppe tout
     end				// fin de la fonction qui mesure la taille
     else				// si tout s'est bien passé, alors...
     begin				// on ouvre un commande
  end;					// on la termine pour passer à ce qui suis
  For I := 1 to BytesToChange do	// pour I, je  boucle autant de fois qu'il y à de modifs à faire
     begin				// on va indiquer comment faire
     Seek(F,A[I].A);			//>
     Ch:=Char(A[I].B);			//>
     Blockwrite(F,Ch,1);		// inscrit les octets
  end;					// fin de la procedure
  ShowMessage ('File successfully cracked!');	// on affiche un message de réussite
end;					//>
end;					// on ferme tout
//------------------------- Pour l'A propos ----------------------*

procedure TForm1.InfoClick(Sender: TObject);
begin
ShowMessage('Cracked by Static REvenge');
end;

//-------------------------- Pour Quitter ------------------------*

procedure TForm1.QuitClick(Sender: TObject);
begin
close
end;

end.

 

----------------------------------------[ Fin ]-----------------------------------------

 

Voila, c'est tout !

Pour déplacer les bouton du patch, il faut s'y prendre comme au début avec le bouton ok, le principe reste le même et si vous voulez redimenssionner la fenêtre principale, rien de plus simple, vous faites comme si c'etait une fenête d'application classique (vous mettez les curseur sur le bord à redimenssionner et tout en restant appuyer sur le bouton de gauche vous déplacez le curseur suivant les modification à faire :p)

Ensuite faite F9 pour voir si votre patch tourne bien, si oui vous pouvez le compiler en faisant Ctrl+F9.

Pour l'aspet graphique, je vous laisse vous débrouiller avec la forme, la barre d'outil et celle de propriétées. Vous verrez, ce n'est pas bien compliquer et pour ceux qui connaissent le C++ Builder ou Visual Basic, vous savez comment faire, c'est le même principe ;)

 

Petits conseils de derniere minute :

- Evitez de mettre des images au format BMP ou autre non compressé dans votre patch sinon il pourait devenir enorme...

- N'esitez pas à explorer chaque objet avec la barre de Propriétées, vous trouverze forcement des choses interressentes.

- Compacter vos patchs avec des programmes comme PE Compact, ASPack ou l'exellent UPX qui se trouve d'ailleur ici.

- Si vous avez les moyen ( environ 250 F, arg!!!! ) je vous conseil d'acheter le bouquin Delphi 5 au éditions S&Sm qui est vraiment très bien fait, et pour pour Delphi lui même je vour rappel que la version 3 est dejà pas mal même si elle est "vieille".