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

ELCouz 135 Messages postés jeudi 22 mars 2007Date d'inscription 25 juillet 2008 Dernière intervention - 4 mai 2007 à 00:32 - Dernière réponse : florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention
- 13 mai 2007 à 16:46
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 !! :)
Afficher la suite 

Votre réponse

14 réponses

florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 mai 2007 à 13:24
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de florenth
ELCouz 135 Messages postés jeudi 22 mars 2007Date d'inscription 25 juillet 2008 Dernière intervention - 4 mai 2007 à 00:40
0
Utile
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 ;)
Commenter la réponse de ELCouz
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 mai 2007 à 10:39
0
Utile
Salut,
Utilises des ressources pardi ! Tu te compliques la vie avec ça !
Voir ici : http://www.delphifr.com/tutoriaux/CREATION-UTILISATION-RESSOURCES_120.aspx
Commenter la réponse de florenth
ELCouz 135 Messages postés jeudi 22 mars 2007Date d'inscription 25 juillet 2008 Dernière intervention - 4 mai 2007 à 12:11
0
Utile
Salut javais oublier de preciser ,,, sans passer par des ressource ,, ... les ressource eu peuvent etre lu/modifier/extraites par ResHacker les array non ;)

laurent !
Commenter la réponse de ELCouz
ELCouz 135 Messages postés jeudi 22 mars 2007Date d'inscription 25 juillet 2008 Dernière intervention - 4 mai 2007 à 12:14
0
Utile
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
Commenter la réponse de ELCouz
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 4 mai 2007 à 21:01
0
Utile
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)
Commenter la réponse de f0xi
ELCouz 135 Messages postés jeudi 22 mars 2007Date d'inscription 25 juillet 2008 Dernière intervention - 5 mai 2007 à 06:44
0
Utile
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 ]
Commenter la réponse de ELCouz
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 7 mai 2007 à 11:55
0
Utile
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)
Commenter la réponse de f0xi
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 7 mai 2007 à 12:42
0
Utile
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
Commenter la réponse de florenth
Cirec 4221 Messages postés vendredi 23 juillet 2004Date d'inscription 11 mai 2018 Dernière intervention - 7 mai 2007 à 13:38
0
Utile
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" />
Commenter la réponse de Cirec
ELCouz 135 Messages postés jeudi 22 mars 2007Date d'inscription 25 juillet 2008 Dernière intervention - 8 mai 2007 à 10:50
0
Utile
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
Commenter la réponse de ELCouz
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 8 mai 2007 à 12:50
0
Utile
Yeah ! Pas mal Cirec !
Allez... une petite source avec un code qui permet de s'en servir... ça te tente pas ??
Commenter la réponse de florenth
Cirec 4221 Messages postés vendredi 23 juillet 2004Date d'inscription 11 mai 2018 Dernière intervention - 13 mai 2007 à 12:44
0
Utile
Je vous en prepare une ...

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

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 13 mai 2007 à 16:46
0
Utile
Héhé, j'en étais sûr que tu ne pourrais pas succomber à la tentation !!!!
Commenter la réponse de florenth

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.