Ver Mensaje Individual
  #55  
Antiguo 08-01-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
elmago00,

Cita:
Empezado por nlsgarcia
...En lo que lo tenga listo lo publico, me falta un detalle...


Revisa este código:
Código Delphi [-]
// Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
function ChangeFileHex(OldHex, NewHex, FileName : String) : Boolean;
var
   F1, F2 : TFileStream;
   Buffer : Array of Byte;
   AuxHex : String;
   i,p, PosFile : Integer;
   BPF, NBR : Integer;  // BPF = Bytes Per Row, NBR = Number of Bytes Read

begin

   try

      F1 := TFileStream.Create(FileName, fmOpenRead);
      F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);

      BPF := Length(OldHex) div 2;

      SetLength(Buffer, BPF);

      PosFile := 0;

      while F1.Position < F1.Size do
      begin

         Application.ProcessMessages;

         NBR := F1.Read(Buffer[0], BPF);

         AuxHex := EmptyStr;

         for i := Low(Buffer) to High(Buffer) do
            AuxHex := AuxHex + IntToHex(Buffer[i],2);

         if OldHex = AuxHex then
         begin
            for i := Low(Buffer) to High(Buffer) do
               Buffer[i] := 0;
            p := 1;
            i := 0;
            while p <= Length(NewHex) do
            begin
               Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
               Inc(p,2);
               Inc(i,1);
            end;
            F2.Write(Buffer[0], NBR);
            Inc(PosFile,BPF);
         end
         else
         begin
            F2.Write(Buffer[0], 1);
            Inc(PosFile);
            F1.Seek(PosFile,soFromBeginning);
         end;

      end;

      F1.Free;
      F2.Free;
      Result := True;

   except

      F1.Free;
      F2.Free;
      Result := False;

   end;

end;
El código anterior en Delphi 7 sobre Windows 7 Professional x32, permite cambiar N ocurrencias de una cadena hexadecimal por una nueva sin importar el tamaño de la misma, esta es una modificación de la función publicada en el Msg #43.

Nota:

1- La velocidad de procesamiento es un bit menor dado que se lee el archivo por medio de una ventana deslizante determinada por la cadena de búsqueda, lo cual garantiza que se encuentren y modifiquen todas las ocurrencias de la misma.

2- La cadena de búsqueda y su sustituto (OldHex y NewHex), deben ser del mismo tamaño.

3- La función fue probada con archivos de texto y binarios (.exe y .dll), funcionado correctamente según lo esperado en todos los casos.

El archivo dump.dll original y su versión modificada dump.new en función de lo publicado en el Msg #51, esta disponible en : Test Dump

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 08-01-2015 a las 13:26:14.
Responder Con Cita