Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Buscar y reemplazar Bytes. (https://www.clubdelphi.com/foros/showthread.php?t=73268)

broly7 12-04-2011 09:22:27

Buscar y reemplazar Bytes.
 
HOla! Buscando con un editor hexadecimal en un archivo encuentro una cadena de bytes (00 05 FC...por ejemplo).
Entonces no sé cómo hacer en Delphi para que me encuentre esa cadena y reemplazarla por otra. Creo explicarme bien, Gracias.

Red_Leon 12-04-2011 11:48:36

Con esto podras encontrar la posición de la cadena:

Código Delphi [-]
Pos(Chr($00)+Chr($05)+Chr($FC)...,Cadena);

Ya puedes jugar con replace, copy ... como más te guste.

Ahora ten encuenta que debes de tener el fichero como un String.

Tal vez sería más recomendable coger el fichero como un Stream y ir mirando los bytes y reemplazar o crear otro fichero con los valores que desees.

Un Saludo!

Espero haberte ayudado.

escafandra 12-04-2011 14:29:21

Mira esto.

Saludos.

broly7 12-04-2011 14:48:17

Cita:

Empezado por escafandra (Mensaje 396668)
Mira esto.

Saludos.

No tengo ni idea de programar en C jajaja.
De todas formas he encontrado algo parecido que trabaj de forma parecida a la mía pero no consigo que encuentre una cadena de mas de 1 Byte.

Código Delphi [-]
 var
fs: TFileStream;
Buff: Array [0..10239] of Byte; // a 10Kb Array
b: Byte;
FP, MP: Integer; // FilePos and MemoryPos
i: Integer;
ReadBytes: Integer;
begin

fs := TFileStream.Create(Extractfilepath(application.exename)+'prueba.dat', fmOpenReadWrite);

FP := 0;
b := Ord($FF);
while fs.Position < fs.Size do
begin
ReadBytes := fs.Read(Buff, SizeOf(Buff));
// scan the buffer for #FF bytes
for i := 0 to ReadBytes - 1 do
begin
if (Buff[i] = ($AA)) then
begin
// Set the file pointer to the right place
fs.Seek(FP + i, soFromBeginning);
fs.Write(b, 1);
end;
end;
end;
FP := FP + SizeOf(Buff);
// set the file pointer to the start of the next block
fs.Seek(FP, soFromBeginning);
Fs.Free;
end;

Esto cambia todos los hexabytes AA por FF. Pero para una cadena como $AABBCCDD no sé cómo hacerlo =/

Red_Leon 12-04-2011 16:33:11

Deberias comprobar como minimo que

Código Delphi [-]

if (i + 4 and ((Buff[i] = ($AA)) and ((Buff[i+1] = ($BB)) and ((Buff[i] = ($CC)) then
begin
...
end;

Es lo que te decia anteriormente coger el archivo como un Stream.

escafandra 13-04-2011 00:47:02

Cita:

Empezado por broly7 (Mensaje 396670)
No tengo ni idea de programar en C jajaja.

Código:

procedure Replace(Buffer, Val, newVal: PBYTE; SizeBuffer, SizeVal: cardinal);
var
  n, i: cardinal;
begin
  for n:= 0 to SizeBuffer-1 do
  begin
      if PBYTE((cardinal(Buffer) + n))^ = Val^ then
      begin
        for i:= 1 to SizeVal-1 do
          if PBYTE(cardinal(Buffer)+n+i)^ <> PBYTE(cardinal(Val)+i)^ then  break;
        if i=sizeVal then
          CopyMemory(PBYTE(cardinal(Buffer)+n), newVal, SizeVal);
      end;
  end;
end;

Saludos.

broly7 13-04-2011 14:27:59

SOlucionado. Esta web es sencillamente increible, justo lo que buscaba y muy bien explicado:http://www.underground.mn/showthread.php?t=203322

Saludos.

escafandra 14-04-2011 08:16:01

Vista la necesidad, publico la traducción del código publicado aquí.
Código Delphi [-]
procedure Replace(Buffer, Val, newVal: PBYTE; SizeBuffer, SizeVal: cardinal);
var
  n, i: cardinal;
begin
   for n:= 0 to SizeBuffer-1 do
   begin
      if PBYTE((cardinal(Buffer) + n))^ = Val^ then
      begin
         for i:= 1 to SizeVal-1 do
           if PBYTE(cardinal(Buffer)+n+i)^ <> PBYTE(cardinal(Val)+i)^ then  break;
         if i=sizeVal then
           CopyMemory(PBYTE(cardinal(Buffer)+n), newVal, SizeVal);
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
begin
   MS:= TMemoryStream.Create;

   MS.LoadFromFile('project1.exe');
   Replace(MS.Memory, PBYTE(PCHAR('hola')), PBYTE(PCHAR('casa')), MS.Size, 4);
   MS.SaveToFile('prueba.exe');

   MS.destroy;

end;


Saludos.


La franja horaria es GMT +2. Ahora son las 21:15:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi