Array of bytes .... [Résolu]

Signaler
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008
-
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
-
bonjour,,

Je sais que cest possible dinserer des fichiers dans le programme en passant par :

const
music : array[1..905] of Byte = (
    $45,$78,$74,$65,$6E,$64,$65,$64,$20,$4D,$6F,$64,$75,$6C,$65,$3A,
    $20,$73,$6F,$66,$74,$20,$6D,$61,$6E,$69,$61,$63,$2D,$6D,$69,$6E,
    $69,$6D,$61,$6C,$00,$1A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04,$01,$34,$00,$00,$00,
    $20,$00,$00,$00,$02,$00,$0D,$00,$01,$00,$01,$00,$0A,$00,$91,$00,
    $00,$01,$02,$03,$04,$05,$06,$07,$00,$01,$02,$03,$04,$05,$06,$07,
    $08,$09,$0A,$0B,$08,$09,$0C,$0B,$08,$09,$0A,$0B,$08,$09,$0C,$0B,
    $09,$00,$00,$00,$00,$04,$00,$01,$00,$83,$16,$01,$80,$80,$2E,$01,
    $00,$0E,$60,$80,$3A,$01,$00,$0E,$62,$81,$61,$83,$35,$01,$09,$00,
    $00,$00,$00,$04,$00,$01,$00,$83,$16,$01,$80,$80,$2E,$01,$00,$0E,
    $60,$80,$35,$01,$00,$0E,$62,$81,$61,$83,$38,$01,$09,$00,$00,$00,
    $00,$04,$00,$01,$00,$83,$16,$01,$80,$80,$2E,$01,$00,$0E,$60,$80,
    $38,$01,$00,$0E,$62,$80,$83,$33,$01,$09,$00,$00,$00,$00,$06,$00,
    $01,$00,$83,$16,$01,$80,$80,$2E,$01,$00,$0E,$60,$80,$33,$01,$00,
    $0E,$61,$81,$61,$83,$35,$01,$83,$0D,$01,$83,$36,$01,$80,$83,$36,
    $01,$09,$00,$00,$00,$00,$04,$00,$01,$00,$83,$0F,$01,$80,$80,$2E,
    $01,$00,$0E,$60,$80,$36,$01,$00,$0E,$62,$81,$61,$83,$33,$01,$09,
    $00,$00,$00,$00,$06,$00,$01,$00,$83,$0F,$01,$80,$80,$2E,$01,$00,
    $0E,$60,$80,$33,$01,$00,$0E,$61,$81,$61,$83,$2E,$01,$83,$12,$01,
    $83,$33,$01,$80,$83,$35,$01,$09,$00,$00,$00,$00,$06,$00,$01,$00,
    $83,$16,$01,$80,$80,$2E,$01,$00,$0E,$60,$80,$35,$01,$00,$0E,$61,
    $81,$61,$83,$2E,$01,$83,$0D,$01,$83,$31,$01,$80,$83,$2E,$01,$09,
    $00,$00,$00,$00,$08,$00,$01,$00,$83,$12,$01,$98,$0A,$01,$83,$19,
    $01,$88,$0A,$83,$1E,$01,$81,$61,$83,$12,$01,$80,$83,$14,$01,$80,
    $83,$1B,$01,$80,$83,$20,$01,$80,$83,$14,$01,$80,$09,$00,$00,$00,
    $00,$08,$00,$01,$00,$83,$12,$01,$81,$61,$83,$19,$01,$80,$83,$1E,
    $01,$80,$83,$12,$01,$80,$83,$19,$01,$83,$31,$01,$83,$1E,$01,$80,
    $83,$12,$01,$83,$31,$01,$83,$19,$01,$80,$09,$00,$00,$00,$00,$08,
    $00,$01,$00,$83,$14,$01,$83,$33,$01,$83,$1B,$01,$80,$83,$20,$01,
    $83,$31,$01,$83,$14,$01,$80,$83,$1B,$01,$83,$30,$01,$83,$20,$01,
    $80,$83,$14,$01,$83,$31,$01,$83,$1B,$01,$80,$09,$00,$00,$00,$00,
    $08,$00,$01,$00,$83,$16,$01,$83,$30,$01,$83,$1D,$01,$83,$31,$01,
    $83,$22,$01,$83,$35,$01,$83,$16,$01,$98,$0A,$01,$83,$1D,$01,$88,
    $0A,$83,$22,$01,$81,$61,$83,$16,$01,$80,$83,$1D,$01,$80,$09,$00,
    $00,$00,$00,$08,$00,$01,$00,$83,$16,$01,$80,$83,$1D,$01,$80,$83,
    $22,$01,$80,$83,$16,$01,$80,$83,$18,$01,$80,$83,$1D,$01,$80,$83,
    $11,$01,$80,$83,$18,$01,$80,$09,$00,$00,$00,$00,$08,$00,$01,$00,
    $83,$16,$01,$83,$30,$01,$83,$1D,$01,$83,$31,$01,$83,$19,$01,$83,
    $2E,$01,$83,$16,$01,$98,$0A,$01,$83,$1D,$01,$88,$0A,$83,$19,$01,
    $81,$61,$83,$16,$01,$80,$83,$1D,$01,$80,$F1,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$27,$01,$00,$12,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$08,
    $00,$2C,$00,$0E,$00,$08,$00,$18,$00,$16,$00,$20,$00,$08,$00,$2D,
    $00,$0D,$00,$32,$00,$04,$00,$3C,$00,$07,$00,$44,$00,$04,$00,$5A,
    $00,$00,$00,$64,$00,$00,$00,$6E,$00,$00,$00,$00,$00,$20,$00,$0A,
    $00,$28,$00,$1E,$00,$18,$00,$32,$00,$20,$00,$3C,$00,$20,$00,$46,
    $00,$20,$00,$50,$00,$20,$00,$5A,$00,$20,$00,$64,$00,$20,$00,$6E,
    $00,$20,$00,$78,$00,$20,$00,$82,$00,$20,$00,$09,$06,$01,$02,$04,
    $02,$03,$05,$01,$00,$00,$00,$00,$00,$80,$00,$0C,$00,$00,$00,$00,
    $00,$00,$00,$0C,$00,$00,$00,$40,$00,$01,$80,$F9,$00,$BF,$00,$C3,
    $00,$0A,$00,$57,$00,$6E,$00,$23,$00
);

sa marche tres bien quand on a une fonction qui lit dans larray ... mais es-ce possible denregistrer un array vers un fichier ,,, ah oui aussi es-ce que c possible de «pointer» vers un array ?
car avec une dll (bass) on me demande un pointer (jutilise PChar quand je veut pointer vers un fichier) mais ya tu moyen de convertir un array pour que sa marche avec un pointer ??

merci

désolé si cest un peu compliqué

laurent !! :)

13 réponses

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008

Oui enfin ... ton array peut être retrouvé en désassemblant on programme ...
Ou même sans ! Il suffit de connaitre les premiers octets ... et de faire une recherche !
Et comme les fichiers mp3 commencent toujours par la même séquence ... tu vois, la protection est très faible.

Si tu veux absolument protéger un fichier, il faut le crypter et demander la clé de cryptage (=mot de passe) à l'utilisateur au démarrage du programme. Sinon, tu n'auras jamais rien de très fiable.

Sinon, pour répondre à ta question, pour pointer vers le tableau, il suffit d'écrire @music ou encore Addr(music).
Poue enreigstrer ton array dans un fichier, tu peux utiliser un TFileStream et faire Stream.WriteBuffer(music, SizeOf(music));

Pour utiliser ta musique avec Bass, tu peux utiliser BASS_StreamCreateFile() en mettant le premier param à True et le deuxcième à l'addresse de ton fichier.
Exemple:
BASS_CreateStreamFile(True, @music, 0, SizeOf(music), *flags que tu veux*)

++
Flo
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

si vous vouler tester moi jutilise ce source que jai modifier pour convertir mes fichiers...

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  fi : File;
  fo : TextFile;
  ifn, ofn, name : String;
  p, i, size : Integer;
  b : Byte;

begin
  ifn := ParamStr(1);
  ofn := ParamStr(2);
  if not FileExists(ifn) then
  begin
    WriteLn('Use: bin2pas <outputfile>');
    ReadLn;
  end;
  if ofn = '' then
    ofn := ifn + '.pas';
 
  AssignFile(fi, ifn);
  Reset(fi, 1);
  size := FileSize(fi);
  AssignFile(fo, ofn);
  Rewrite(fo);
 
  name := ExtractFileName(ofn);
  p := Pos('.', name);
  if p > 0 then
    name := copy(name, 1, p - 1);
  WriteLn(name);
  WriteLn(fo, 'unit '+name+';');
  WriteLn(fo, 'interface');
  WriteLn(fo, 'const');
  WriteLn(fo, '  '+name+'Count = '+IntToStr(size)+';');
  WriteLn(fo, '  '+name+'Data : array[0..'+name+'Count - 1] of Byte = (');
 
  p := 0;
  for i := 0 to size - 1 do
  begin
    inc(p);
    BlockRead(fi, b, 1);
    Write(fo, '$'+IntToHex(b, 2));
    if i < size - 1 then Write(fo, ', ');
    if p >= 16 then
    begin
      p := 0;
      WriteLn(fo, '');
    end;
  end;
  CloseFile(fi);
  WriteLn(fo, ');');
  WriteLn(fo, 'implementation');
  WriteLn(fo, 'end.');
  CloseFile(fo);
end.

faite compiler ne le lancher par car des foit sa plante ,, il faut glisser votre fichier a convertir dessus l'exe a la place de lexecute ;)
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

Salut javais oublier de preciser ,,, sans passer par des ressource ,, ... les ressource eu peuvent etre lu/modifier/extraites par ResHacker les array non ;)

laurent !
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

cest pas juste pour dla musique ,,, jai donner sa comme exemple ... tien jvais te mettre dans le contexte que si javais des fichiers a proteger mais que jdoit inclure avec le exe ,, sans passer pas PE Bundle ou une ressource ;)

laurent
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
j'adore le truc de ELCouz, tu peu faire plus puissant et rapide :

procedure BinToPas(const FileName: string);
var N         : integer;
    ByteRead  : byte;
    BufStr    : string;
    BufAob    : array[0..3] of byte;
    PassCount,
    EndSize   : integer;
    FluxIn,
    FluxOut   : TStream;
const
  BTC : array[0..$F] of byte = ($30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$41,$42,$43,$44,$45,$46);
  EOB : array[boolean] of byte = ($2C,$29);
begin
  if not FileExists(FileName) then
    Exit;

  FluxIn  := TFileStream.Create(FileName, fmOpenRead);
  try
    if FluxIn.Size < (1024*1024) then
    begin
      FluxOut := TFileStream.Create(FileName+'.pas', fmCreate);
      try
        BufStr := 'Const'+#13#10+
                  '  { '+FileName+' }'+#13#10+
                  '  BinaryData : array[0..'+inttostr(FluxIn.Size-1)+'] of byte = ('+#13#10#09#09;
        FluxOut.WriteBuffer(BufStr[1],Length(BufStr));

        PassCount := 0;
        EndSize   := FluxIn.Size-1;

        for N := 0 to EndSize do
        begin
          FluxIn.ReadBuffer(ByteRead,1);
          BufAob[0] := $24; // $
          BufAob[1] := BTC[ByteRead shr 4];
          BufAob[2] := BTC[ByteRead and $F];
          BufAob[3] := EOB[N = EndSize]; // , ou )
          FluxOut.WriteBuffer(BufAob,4);

          PassCount := PassCount + 1;
          if (PassCount = 16) and (N < EndSize) then
          begin
            PassCount := 0;
            BufStr := #13#10#09#09;
            FluxOut.WriteBuffer(BufStr[1], Length(BufStr));
          end;
        end;

        BufStr := ';'+#13#10;
        FluxOut.WriteBuffer(BufStr[1],3);
      finally
        FluxOut.Free;
      end;
    end;
  finally
    FluxIn.Free;
  end;
end;

<hr size="2" width="100%" />Croc (click me)
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

Merci florenth pour ton explication ... tu es une vrai mine d'or lol !!
Pour le les array oui cest facile de trouver en sachant les premiers octects mais vu que j'upx tout le temps mes exe et dll ,, cest tjrs plus corsé a trouver ,,, a se moment la i faudrais déupxer puis apres commencer a chercher dans l'exe ,, je pourais tjrs separer mon ficher en 3 array aussi et les rassembler ;) ... tika la personne ki voudrais investir tout sont temps a faire sa dans mon programme jlui dit bravo ! ;) nempeche que cest plus difficile a acceder quavec une ressource ... auparavant quand je debutais dans la programmation mes «programmes»,,, je mamusais avec MSN et reshacker ... cest si facile de modifier de quoi avec sa :P

[...]
f0xi ,, wow! jvais tavouer que jaime mieu ta version , jvais la garder ... tres pratique ;) ...may the Delphi force be with you lolll
[auteurdetail.aspx?ID=316333 ]
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
sinon pour repondre a tes premieres questions :

une fois que tu as ton tableau :

pour l'enregistrer en memoire :

procedure ArrayToStream(Stream : TStream;
                        const MyArray : pointer;
                        const MyArrayLen : integer;
                        const BackToBegin : boolean = true);
var CurrentPos : int64;
begin
  if not assigned(Stream) then
     exit;
  CurrentPos := Stream.Position;
  Stream.WriteBuffer(MyArray^, MyArrayLen);
  if BackToBegin then
     Stream.Position := CurrentPos;
end;

et la tu peu faire ce que tu veux :

enregistrement du tableau dans un fichier :

var

  Stream  : TFileStream;
  ZStream : TZCompressionStream; // ZLibEx
const
  Header  : string = '<flx><![CDATA[';
  Footer  : string = ']]></flx>';

begin

  Stream := TFileStream.Create('monfichier.xml', fmCreate);

  try
    Stream.WriteBuffer(Header[1], Length(Header));
  
    ZStream := TZCompressionStream.Create(Stream);
    try

      ArrayToStream(Stream, @Music, Length(Music), false);
    finally
      ZStream.Free;
    end;

    Stream.WriteBuffer(Footer[1], Length(Footer));
  finally

    Stream.Free;

  end;

end;

<hr size="2" width="100%" />Croc (click me)
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008

Je me permet d'intervenir pour signaler qu'il n'est pas du tout nécéssaire de mettre des paramètres "const" pour les params de moins de 32 bits car Delphi utilise nativement la convention Register.

En mettant "const", tu forces Delphi à transmettre un pointeur vers la variable au lieu de la var elle même et du coup, c'est moins performant ...

Voila, c'est tout,
Flo
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
Salut,

En voici une qui est encore 200 à 300 fois plus rapide que la dernière de F0xi (Je sais que tu aimes la vitesse)

Procedure BinToPas(Const FileIn : String; Const Output : TStrings = Nil);
Var FluxIn, FluxOut       : TMemoryStream;
    P, Data   : PByte;
    N         : Integer;
    BufStr    : string[4];
    PassCount : Integer;
    Name, StrHeader  : String;
const
  BTC : array[0..$F] of Char = (#48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#65,#66,#67,#68,#69,#70);
  EOB : array[boolean] of Char = (#44,#41);  
  Header  = 'Unit %s;'#13#10'Interface'#13#10'Type'#13#10+            '  T%sData Array[0..%d] of Byte;'#13#10'Const'#13#10'  %sData : T%sData (';
  Footer  = ';'#13#10'Implementation'#13#13#10'End.';
  LnBreak = #13#10#09#09;
Begin
  If Not FileExists(FileIn) Then Exit;
  Name := ChangeFileExt(FileIn, '');
  PassCount := 0;
  Data := Nil;
  FillChar(BufStr, 4, #0);
  FluxIn := TMemoryStream.Create;
  FluxOut := TMemoryStream.Create;
  With FluxIn do Try
    LoadFromFile(FileIn);
    If (Size > 0) and (Size < 1024*1024) Then Try
      GetMem(Data, Size);
      ReadBuffer(Data^, Size);
      P := Data;
      StrHeader := Format(Header, [Name, Name, Size - 1, Name, Name]);
      FluxOut.WriteBuffer(StrHeader[1], Length(StrHeader));
      FluxOut.WriteBuffer(LnBreak[1], 4);

      For N := 0 to Size -1 do Begin
        BufStr[1] := #36; // $
        BufStr[2] := BTC[P^ shr 4];
        BufStr[3] := BTC[P^ and $F];
        BufStr[4] := EOB[N = Size -1]; // , ou )
        FluxOut.WriteBuffer(BufStr[1], 4);

        Inc(PassCount);
        If PassCount = 16 Then Begin
          PassCount := 0;
          FluxOut.WriteBuffer(LnBreak[1], 4);
        End;
        Inc(P);
      End;
    Finally
      FreeMem(Data);

      FluxOut.WriteBuffer(Footer[1], Length(Footer));
      FluxOut.SaveToFile(Name+'.pas');
     // ********** Juste pour un teste d'affichage
      If Assigned(Output) Then With Output do Begin
        Clear;
        FluxOut.Seek(0, soFromBeginning);
        LoadFromStream(FluxOut);
      End;
     // *********
      FluxOut.Free;

    End;
  Finally
    Free;
  End;
End;

Pour le charger dans un Stream :
{Procedure unique pour charger un tableau dans un Stream}
Procedure Array2Stream(Const Buffer : Array Of Byte; Const Stream : TMemoryStream = Nil);
Begin
  If Assigned(Stream) Then With Stream Do Begin
    WriteBuffer(Buffer, SizeOf(Buffer));
    Seek(0, soFromBeginning);
  End;
End;

Et l'utilisation :

{Pour une image JPEG 'Numeriques.jpg' --> 'Numeriques.pas'}
procedure TForm1.Button1Click(Sender: TObject);
Var Stream : TMemoryStream;
    Img : TJPEGImage;
begin
  IMG := TJPEGImage.Create;
  Stream := TMemoryStream.Create;
  Array2Stream(NumeriquesData, Stream);
  Try
    IMG.LoadFromStream(Stream);
    Image1.Picture.Assign(IMG);
  Finally
    IMG.Free;
    Stream.Free;
  End;
end;

{Pour un son Wav 'Sound.Wav' --> 'Sound.pas'
  c'est encore plus simple ... pas besoin de passer par un Stream}

procedure TForm1.Button2Click(Sender: TObject);
begin
    PlaySound(@SoundData, 0, SND_ASYNC Or SND_MEMORY);
end;
 
@+
Cirec

<hr size="2" />
Messages postés
135
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
25 juillet 2008

Yay! merci mille fois pour votre implication :)
si seulement javais votre niveau d'experience en delphi... jaiderais aussi :P
C'est bon pour un sticky post sa ... meme si sa nexista pas ici ;)

Merci

Laurent
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008

Yeah ! Pas mal Cirec !
Allez... une petite source avec un code qui permet de s'en servir... ça te tente pas ??
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
Je vous en prepare une ...

avec en plus la possibilité de compresser les données
(Compression/Décompression en transparence)

 
@+
Cirec

<hr size="2" />
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008

Héhé, j'en étais sûr que tu ne pourrais pas succomber à la tentation !!!!