如何查询及替换一个二进制文件中的字串(100分)

  • 主题发起人 主题发起人 opig
  • 开始时间 开始时间
O

opig

Unregistered / Unconfirmed
GUEST, unregistred user!
像某些补丁程序一样,我只想查找、定位和修改一个或多个十六进制字串,
如将一个二进制文件中的"0A 0B 0C 0D"改成"1A 1B 1C 1D"或者更多一些
字符"1A 1B 1C 1D 1E",请问如何实现。
 
白日梦网站“迷你编辑器”源码可参考
 
var b:array[0..count] of Byte
h: Integer;

再给b赋值, b[0]:=....
b[1]:=....;

h:=FileOpen(Filename,2);
FileSeek(h, offset);
FileWrite(h, b, count);
FileClose(h);
 
自编个二进制到16进制的转换,就可实现!
 
把你所要修改的文件用二进制的方式打开,不就行了吗?再说补丁程序只是用增强的
版本文件替换了原文件,并不是你所说的
 
致阿朱:
补丁程序有的是破解档,直接修改EXE或DLL中的一些字串的,就象我提的问题一样,
现在要的就是用程序实现查找及替换,UltraEdit的查找就很简单,直接输入HEX值,
也可输入ASCII值,
当然,如果能实现象对比新旧版本面生成的补丁文件,那就更棒了。
 
白日梦网站 http://person.zj.cninfo.net/~haohome/
 
我说一个很笨的方法,先得到整个的对应的16进制的字符串,
然后使用字符串的查找函数,你看行吗?
 
直接用Ultraedit试试
 
该函数会把指定文件中字串stxt替换为toTxt
procedure restr(fn: Ansistring
stxt, toTxt: string);
var
StrL, x, pos, fpos, num, readnum: integer;
buf: array[0..500] of char;
SFile: file;
L, H: char;
begin
StrL := Length(stxt);
AssignFile(sfile, fn);
reset(sfile, 1);
repeat
buf := #0;
Num := 0;
fpos := filepos(sfile);
blockread(sfile, buf, Sizeof(Buf), readnum);
repeat
Pos := num;
for x := 1 to StrL do begin
L := sTxt[x]
H := Buf[num];
if L = H then begin
inc(num);
if x = StrL then begin
seek(sfile, fpos + pos);
blockWrite(sfile, toTxt[1], Length(totxt));
end;
end
else begin
if x = 1 then inc(num);
break;
end;
end;
until num >= high(buf);
until readnum <= 0;
closefile(sfile);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Findstr('文件名', '003e2b6c3d', '53e2e6c3fs');
end;
 
我看用o*o的方法可以搞定呀
另外用FileStream也可以搞定
 
过节好!前阵子没来,没有看到回复。
Fudei的方法只要再加一个16进制转换的就可以搞定,而白日梦网站“迷你编辑器”源码也很酷,居然用paintbox制作类Ultraedit的样式,真是很有创意。
提出这个问题的来由是有个朋友要做解霸2000的时间补丁,我在自己机子解得开,用winpatch做好补丁却又不能应用在他的机上,仔细分析原来解霸在文件上做了手脚,把安装日期也插进去了,反正问题总是解决了,只是delphi的exe还是太大。第一次在大富翁提问题,觉得很值。谢谢诸位。
 
多人接受答案了。
 
后退
顶部