ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008
-
4 mai 2007 à 00:32
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 2008
-
13 mai 2007 à 16:46
bonjour,,
Je sais que cest possible dinserer des fichiers dans le programme en passant par :
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 !! :)
A voir également:
Delphi array of byte
Delphi array of byte to string - Meilleures réponses
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20082 4 mai 2007 à 13:24
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*)
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008 4 mai 2007 à 00:40
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';
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 ;)
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008 4 mai 2007 à 12:11
Salut javais oublier de preciser ,,, sans passer par des ressource ,, ... les ressource eu peuvent etre lu/modifier/extraites par ResHacker les array non ;)
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008 4 mai 2007 à 12:14
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 4 mai 2007 à 21:01
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;
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008 5 mai 2007 à 06:44
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 ]
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20082 7 mai 2007 à 12:42
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 ...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 7 mai 2007 à 13:38
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;
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008 8 mai 2007 à 10:50
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 ;)