elmago00,
Cita:
Empezado por nlsgarcia
...En lo que lo tenga listo lo publico, me falta un detalle...
|
Revisa este código:
Código Delphi
[-]
function ChangeFileHex(OldHex, NewHex, FileName : String) : Boolean;
var
F1, F2 : TFileStream;
Buffer : Array of Byte;
AuxHex : String;
i,p, PosFile : Integer;
BPF, NBR : Integer;
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.