Partie en clair dans l'executable

Résolu
Signaler
Messages postés
166
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
13 octobre 2008
-
Messages postés
7
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
4 septembre 2007
-
Bonjour!

Voilà, je vient de remraquern quelques chose de surprenant.

En visualisant un executable (pour ma part avec NotePad++) généré par Delphi , j'ai remarqué qu'enormement de choses était completement en clair, notamment les constante de type String...

Y'a t'il une solution pour rendre l'executable plus "brouillé", quitte a augmenté sa taille? Peut etre une option de compilation? Un outils externe?

Merci de votre aide si jamais vous avez un avis ou une idée sur la question!

13 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
c'est normal que ce soit en clair. c'est pour limiter les pertes de performances et parce qu'on part du principe que personne ne vas editer notre executable.
les solutions de cryptage, compression, degrade fortement les performances d'un programme.
de plus, au moment ou la ressource vas etre utilisée, on est obligé de la mettre en clair quelque part, même momentanement.
donc, trés facile de la retrouver dans la memoire a ce moment la.

donc, n'importe quelle solution n'en est pas une. compression, cryptage, bidouillage ... rien n'echapera de toute façon aux lois fondamentale :
- rien ne se perd, tout se transforme.
- rien n'est perdus donc tout se retrouve.

la seule chose que tu peu faire c'est rendre la tache difficile aux noobs qui essayeront de retrouver l'info, mais t'arretera jamais un cracker qui prendra alors cela comme un defi qu'il doit reussir (et il reussira).
quand on vois que des protections extreme comme certains DRMs et autre StarForce se sont fait laminé plus ou moins facilement ... c'est même pas la peine de chercher la solution miracle.
tu peu pas test.

<hr size="2" width="100%" />Croc (click me)
Messages postés
166
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
13 octobre 2008

Salut!

Merci de ta reponse!

Mais je ne vois pas comment le hachage peut aidé a masqué les informations qui sont en clair dans l'executable?

par exemple une constante comme celle ci-dessous sera en clair dans l'executable:

   const str = 'AZERTY';
   {
     [...]
   }
   Edit1.text := str ;

Et il en va de même pour les unités déclarés dans les uses, le nom des composants, etc...etc.. qui sont en clair dans l'executable.

Peut etre quelqu'un a t'il une autre idée?
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
prq veux tu cacher tes variables ???

Comprend pas ...

Ciao
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Bah tu met toutes tes chaînes en clair dans un fichier, tu les crypte, puis tu distribue le fichier avec les chaînes cryptés avec ton executable.

Il se chargerat de les décrypter à l'execution.

Mais bon, comme tu file l'algo de décrytpage avec l'exe c'est une protection très légère.

Pour info si tu n'est pas au courant, certaines personne lisent les exes désassemblés presque aussi bien que tu lis ton source en Delphi.

http://fr.wikipedia.org/wiki/IDA_%28logiciel%29
Messages postés
166
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
13 octobre 2008

@ Nicolas :

"prq veux tu cacher tes variables ???"
 Je repond pourquoi pas? Je suis curieux, voilà tout...

@rt15 : J'avais pensé a une solution de ce genre là, mais il restera quand meme des infos en clair dans l'executable généré. Et je sais qu'il existe des décompilateurs, désassembleur performant, mais ça n'empeche pas que je trouve bizzare de trouvé autant d'infos en clair dans un executable.

Bon, apparement il n'y a pas de solution simple a ma requete! Je m'attendais a ce qu'il existe une option du compilateur, ou un truc du genre qui permettait de masqué un minimum de choses dans l'executable. Merci quand meme a ceux qui l'ont lu et tenté d'y repondre!

Je laisse ce topic comme non resolu, au cas où quelqu'un a une autre idée!
Messages postés
166
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
13 octobre 2008

Ok, au moins je suis fixé! :)

Merci!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
(Je crois que j'ai dit une grosse c** avec mon hachage. Comme c'est irréversible, pas moyen de remonter les chaînes en clair)
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
Salut,

Une suggestion.
Pour les variables, tu peux les crypter juste avant compilation, car :
- tu n'as plus besoin qu'elles soient explicites,
- tu pourras revenir sur la version avant cryptage pour faire évoluer ton prog.
Et évidemment, pas besoin de décrypter à l'exécution.

MaVarEnKlairKonVaKomprendMonAlgo => bidulschtrmpf

Mais bonjour la parano, non ?

Salut,

Un autre moyen de rendre la tache un peu plus hardu, consiste à ne pas définir les variables au bon endroit.

1)Tu rajoute via un stream tes variables de types string à la fin de ton fichier.

2)Dans la procedure OnCreate de ta form, tu lis via un stream ton fichier en lui meme. Tu récupére le string que tu as rajouté et tu le définis comme une variable.

Biensur tu peux associer cette méthode à ceux que f0xi t'as cité.

Le principe est d'injecter quelques octets (correspondant à ton string)  à ton fichier.

Maintenant comme f0xi te l'a dit : rien n'est inviolable
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
Hum...


Un MP de Francky23012301 (vaguement inquiet) me pousse à expliciter mes dires précédents.

Certains outils dédiés à la décompilation d'executables compilés sous
Delphi (tels DelphiDecompiler (dédé pour les intimes), Exe2dpr ou
autres Revendepro, de mémoire tout ça car j'ai pas pu remettre la main
dessus pour l'instant...) affichent en clair non seulement les strings,
mais aussi les noms donnés aux méthodes et aux variables. C'est
surprenant, mais c'est ainsi (sont balaises, les mecs).

Voilà. Dans ces conditions, on peut éventuellement deviner le
cheminement de la pensée du programmeur, et essayer de reconstituer son
code...

J'espère avoir rassuré Francky23012301 et tous ceux qui ont pu se faire du soucis pour ma santé mentale, lol.


A +

lol Japee.

C'est pas de ta santé mentale dont je m'inquiétais mais de la mienne . Non j'avais pas trop compris ce que tu voulais dire mais j'ai compris : Pas besoin de mettre un algorythme de cryptage et decryptage dans ton source. On peut les crypter via une application externe puis les mettre et les utiliser telquel dans le source. Cependant ca ne change rien au fait que les strings cryptés (ou non) seront toujours présent dans l'application. Seul avantage ca n'aura plus aucun sens pour le lecteur . Quel futé ce Japee
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,

Alors oui ... certaines informations peuvent être extraites de l'executable.
Exe2Dpr reconstruit même le Dpr et les fiches (rien de bien compliqué en soit) ... mais c'est très limité ...
pas de quoi déclancher une parano.

En effet, le résultat final de la décompilation n'est qu'un "collage" d'informations qui sont facillement accèssibles dans un Exe
(en particulier via les ressources) mais au final il n'y a rien de vraiment exploitable.

Exemple:
<hr size= "2" width="100%" /> Fichier d'origine
En bleu sont les parties qui seront carrément oubliées lors de la "reconstruction"
unit UMain;

interface

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

type
  TfrmMain = class(TForm)
    btn_Shoot: TButton;
    Image1: TImage;
    btn_ChangeIcone: TButton;
    procedure btn_ShootClick(Sender: TObject);
    procedure btn_ChangeIconeClick(Sender: TObject);
  // Les méthodes placées ici seront retrouvées (que leurs noms)
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    FMaVariable : String;
    FCompteur   : Integer;
    Procedure Test;
  end;

// à déclarer dans la partie Interface
Function PickIconDlgW(OwnerWnd: HWND; lpstrFile: PWideChar; var nMaxFile: LongInt; var lpdwIconIndex: LongInt): LongBool; stdcall; external
'SHELL32.DLL' index 62;

var
  frmMain: TfrmMain;
  MaVariable : String = 'DelphiFr';
  Compteur   : Integer;

implementation
Uses ShellApi;  // pour  ExtractIconW
{$R *.DFM}

Procedure Make_Shoot(aForm : TForm; aBmp : TBitmap);
Var aDc : HDC;
Begin  If (aForm Nil) or (aBmp Nil) Then Exit;
  With aBmp do
  Begin
    Height := aForm.Height;
    Width  := aForm.Width;
    aDC    := GetWindowDC(aForm.Handle);
    BitBlt(Canvas.Handle, 0, 0, Width, Height, aDC,
      0, 0, srcCopy);
    ReleaseDC(aForm.Handle, aDC);
  End;
End;

// Utilisation
procedure TfrmMain.btn_ShootClick(Sender: TObject);
Var Bmp : TBitmap;
begin
  Bmp := TBitmap.Create;
  Make_Shoot(Self, Bmp);
  // ... ici votre code pour enregistrer où afficher l'image ...
  Image1.Picture.Assign(Bmp);
  Bmp.Free;
end;

Procedure TfrmMain.btn_ChangeIconeClick(Sender: TObject);
Var
  FileName :  array[0..MAX_PATH - 1] of WideChar;
  Size, Index: LongInt;
  hLargeIcon, hSmallIcon : HIcon;
Begin
  Size := MAX_PATH;
  StringToWideChar('%SystemRoot%\system32\Shell32.dll', FileName, MAX_PATH);
  // ouvre le Dialogue Changer d'Icône
  If PickIconDlgW(Self.Handle, FileName, Size, Index) Then
    If (Index <> -1) Then
    If ExtractIconExW( FileName, Index, hLargeIcon, hSmallIcon, 1) > 0 Then
    Begin
      // on change l'icône de la fiche principale
      Icon.Handle := hSmallIcon;
      // et on dessine le LargeIcone sur la fiche
      DrawIcon(Canvas.Handle, 10, 10, hLargeIcon);
      // Et on libère la mémoire
      DestroyIcon(hLargeIcon);
      DestroyIcon(hSmallIcon);
    End;
  Test;
End;

Procedure TfrmMain.Test;
Begin
 
  Compteur := 1;
  FCompteur := 2;
  FMaVariable := MaVariable + IntToStr(Compteur+FCompteur);
  Caption := FMaVariable;
End;

end.

<hr size="2" width="100%" /> Fichier reconstruit avec Exe2Dpr:
unit UMain;

interface

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

type
  TfrmMain = class(TForm)
    btn_Shoot: TButton;
    Image1: TImage;
    btn_ChangeIcone: TButton;
    procedure btn_ShootClick(Sender: TObject);
    procedure btn_ChangeIconeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

procedure TfrmMain.btn_ShootClick(Sender: TObject);
begin
// Address $453848
end;

procedure TfrmMain.btn_ChangeIconeClick(Sender: TObject);
begin
// Address $453880
end;

end.
<hr size="2" width="100%" />
Voilà je crois que c'est claire ... il manque l'essenciel
Et il en va de même pour le fichier Dpr si vous y avez mis une gestion (peu importe de quoi) elle ne sera pas prise en compte
et même tout simplement un :
Application.Title := 'Le Titre';
N'est pas retrouvé.

 
 
@+
Cirec

<hr size="2" />
Messages postés
7
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
4 septembre 2007

Il existe un utilitaire gratuit disponible sur sourceforge.net qui s'appelle upx. Ce logiciel permet de compresser l'exécutable (pour économiser de l'espace et de la bande passante sur le serveur web en vue de la distribution) . visitez-le à l'adresse http://upx.sourceforge.net. Cela empeche de voir ce qu'il y a dans l'exécutable pour ceux qui ne connaissent pas le logiciel. Sinon, il existe un composante DcpCrypt à l'adresse suivante : http://www.cityinthesky.co.uk/cryptography.html

Germain Malenfant, Developper