Dodanie zasobu do innej aplikacji i odczytanie go

0

Witam.

Potrzebuje dodac do drugiego programu pewien zasób a potem go odczytac z jego poziomu.

Dziala to na zasadzie takiej: Uzytkownik wprowadza dane potem klika i tekst zostaje zapisany w programie. Po wlaczeniu tego programu wyswietli sie tekst ktory wpisano.

Zapisanie tekstu:

function WriteDataToExe(sValue: string): boolean;
var
  hExeFile          : THandle;
  sBuffer           : WideString;
  pResourceID       : PChar;
  iDataSize         : word;
begin
  pResourceID := 'SCRIPT';
  sBuffer := Chr(Length(sValue)) + sValue;
  iDataSize := Length(sBuffer) * 2 + 1;
  hExeFile := BeginUpdateResource(PChar(ExtractFilePath(Application.ExeName) +
    'Main.exe'), False);
  if hExeFile <> 0 then
  begin
    try
      Result := UpdateResource(hExeFile,RT_RCDATA, 'SCRIPT', LANG_NEUTRAL,
        PWideChar(sBuffer), iDataSize);
      if not Result then
        MessageDlg('cant write', mtError, [mbOK], 0);
    finally
    end;
  end
  else
    Result := false;
  EndUpdateResource(hExeFile, false);
end;

Procedura jest OK, wszystko sie zapisuje do Main.exe (sprawdzalem ResHackerem).

Odczytać próbuje tak (Main.dpr):

 var
  rs: TResourceStream;
  ms: TMemoryStream;
begin
  rs := TResourceStream.Create(HInstance, 'SCRIPT', RT_RCDATA);
  rs.SaveToFile('stream.dat'); //zasób jest odczytany na 100%
  try
      ms := TMemoryStream.Create;
    try
     rs.Seek(0,0);
      ObjectBinaryToText(rs, ms); //proba konwersji binarnej na tekst konczy sie wyjatkiem EReadError
      ms.Seek(0,0);
{
... teorytycznie zasob w postaci tekstu powinien siedziec w ms 
}
    finally
      ms.Free;
    end;
  finally
    rs.Free;
  end;

Zapis znalazlem na torry.net a odczyt wyjalem z jakiegos tutoriala do odczytywania DFM z exe podczas dzialania programu.

Wesolych swiat :)`

0

zapisanie do exe:

procedure SaveToExe(FName, Str: string);
var
  F : File of Byte;
  I : Integer;
begin
  AssignFile(F, FName);
  Reset(F);
  try
   Seek(F, FileSize(F) - SizeOf(I));
   BlockRead(F, I, SizeOf(I));
   if (I < SizeOf(I)) or (I > FileSize(F)) then I := 0;
   Seek(F, FileSize(F) - I);
   Truncate(F);
   BlockWrite(F, Str[1], Length(Str));
   I := Length(Str) + SizeOf(I);
   BlockWrite(F, I, SizeOf(I));
  finally
   CloseFile(F);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveToExe('plik.exe',Edit1.Text+'|'+Edit2.Text);
end;

plik exe z danymi:

function Split(input:string;s:integer):string;
var
  l : integer;
  d : integer;
  finish :string;
begin
  l :=0;
  d :=0;
  while (d <= s) and (length(input) >= l) do
  begin
   l := l + 1 ;
    if d = s then
     finish := FINISH + copy(input,l,1);
    if copy(input,l,1) = '|' then
     d := d + 1;
  end;
while Pos('|', finish) > 0 do
  delete(finish, Pos('|', finish), 1);
  split := finish;
end;
function LoadFromExe(FName: string): string;
var
  F : file of Byte;
  i : Integer;
begin
  Result := '';
  AssignFile(F, FName);
  FileMode := fmOpenRead;
  Reset(F);
  try
   Seek(F, FileSize(F) - SizeOf(i));
   BlockRead(F, i, SizeOf(i));
   if (i < SizeOf(i)) or (i > FileSize(f)) then Exit;
   Seek(F, FileSize(F) - i);
   SetLength(Result, i - SizeOf(i));
   BlockRead(F, Result[1], Length(Result));
   XXX := Result;
   Split(XXX,0);
   Split(XXX,1);
   finally
   CloseFile(F);
  end;
end;

a to wyjmuje dane z pliku:

CopyFile(Pchar(paramstr(0)),Pchar('c:\plik.exe'),True);
LoadFromExe('c:\plik.exe');
Edit1.text:=Split(XXX,0);
Edit2.text:=Split(XXX,1);
DeleteFile('c:\plik.exe');

o to ci chodzilo? :>

0

Przerabialem doklejanie i ten sposob odpada. Ten tekst koniecznie musi byc zapisany w zasobach. Wtedy moge spakowac ten program jakims packerem.

0

to tez mozesz pakowac ;] skompiluj to i spakuj np. UPX-em, ja to spakowalem i moglem zmieniac dane, pakowac itd itd. i ciagle dzialalo :)

0

Tylko jakbym chcial spakowac jakims porzadnym pakerem np. Armadillo a potem jeszcze zabezpieczyc dajmy na to morphine to juz raczej nie przejdzie.

0

a idz... najlepszy paker to UPX :P a tak w ogole to sproboj, moze zadziala ;]

0

Sam UPX to chyba najgorszy packer. Wystarczy -d do parametru i program sie rozpakowuje...

Co do tematu, nikt nie robil takich bajerow j/w ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1