如何读取和修改一个EXE文件中二个连续地址的数据!? ( 积分: 300 )

  • 主题发起人 主题发起人 高手贵姓
  • 开始时间 开始时间

高手贵姓

Unregistered / Unconfirmed
GUEST, unregistred user!
例如打开一个名为1.exe文件,读取其中00089AC8 00089AC9 这二个连续地址的数据,假设是09 03,那么0309(16进制)转换为后结果是777(10进制),这个结果要能显示出来。对于显示的结果可以修改比如改为5125(10进制),那么修改后写入00089AC8 00089AC9这二地址为05 14(16进制),并能保存修改。我想知道如何用程序实现!?
 
要读取几个字节取决于你怎么用它,最简单的办法就是
var
a: array[0..1] of byte;
begin.
fs.position := $00089AC8;
fs.readbuffer(a, 2);
end;
你也可以定义a: word;(占两字节)
当你要取更多字节时,比如四字节可以定义为DWORD,或是结构等等,都是可以的
当然,用array of byte是万能的~~
 
var
ff: TMemoryStream;
value: pword;
begin
ff:= TMmeoryStream.Create;
ff.LoadFromFile('1.exe');
value:= ff.memory;
inc(value, $89ac8);
value^ -<这个就是你要的东西
ff.Free;
end;
 
好東西啊。
 
给分:chgit('1.exe');
procedure chgit(fn: string);
var
Dest, Source: file;
TNCD: array[0..1] of byte;
Buffer: array[0..563911] of byte;
Read: integer;
tfn: string;
begin
tfn := changefileext(fn, '.tmp');
AssignFile(Dest, tfn);
AssignFile(Source, fn);
try
Rewrite(Dest, 1);
Reset(Source, 1);
//FillChar(HashDigest, 4, $FF);
//FillChar(TNCD, 8, $0512);
TNCD[0] := $05;
TNCD[1] := $14;

BlockRead(Source, Buffer, $89AC8, Read); //$448
BlockWrite(Dest, Buffer, Read);
BlockRead(Source, Buffer, 2, Read);
showmessage(Format('%x %x',[Buffer[0],Buffer[1]]));
blockwrite(dest, TNCD[0], sizeof(TNCD));
repeat
BlockRead(Source, Buffer, Sizeof(Buffer), Read);
BlockWrite(Dest, Buffer, Read);
until Read <> Sizeof(Buffer);
CloseFile(Source);
CloseFile(Dest);
DeleteFile(pchar(fn));
RenameFile(tfn, fn);
except
MessageDlg('无法打开输出文件!', mtInformation, [mbOK], 0);
Exit;
end;
end;
 
楼上的大哥,很谢谢你提供的解决方法,能不能帮我写成二个通用的函数啊!?就以地址为参数好了。一个是读取地址显示该地址数据,一个是修改该地址数据的。
 
object Form1: TForm1
Left = 345
Top = 230
BorderStyle = bsToolWindow
Caption = #36890#36798#20449#20844#24335
ClientHeight = 91
ClientWidth = 204
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 8
Width = 32
Height = 13
Caption = 'Label1'
end
object Button5: TButton
Left = 24
Top = 56
Width = 75
Height = 25
Caption = 'Button5'
TabOrder = 0
OnClick = Button5Click
end
object Edit1: TEdit
Left = 64
Top = 8
Width = 121
Height = 21
TabOrder = 1
Text = '$89AC8'
end
object Button6: TButton
Left = 112
Top = 56
Width = 75
Height = 25
Caption = 'Button6'
TabOrder = 2
OnClick = Button6Click
end
object edt1: TEdit
Left = 64
Top = 32
Width = 41
Height = 21
TabOrder = 3
Text = '05'
end
object edt2: TEdit
Left = 144
Top = 32
Width = 41
Height = 21
TabOrder = 4
Text = 'E0'
end
object OpenDialog1: TOpenDialog
DefaultExt = '*.tnc'
Filter = #20844#24335#25991#20214'(*.tnc)|*.tnc|'#25152#26377#25991#20214'(*.*)|*.*'
Options = [ofHideReadOnly, ofAllowMultiSelect, ofEnableSizing]
Left = 24
Top = 16
end
end
 
帮你顶一个,顺便发个交流群:
无论你是超极菜鸟,亦或是绝顶高手,在这里偶们静下心来平等地交流学习:
delphi交流群:4654765(delphi天堂)欢迎您的加入!让我们共同进步!!
加入者必须改名片为:{地点}+姓名 注:不改者勿扰!
 
这个就是16进制问题啊,TMmeoryStream,或者TFilestream都可以
 
我不需要修改运行中的exe文件的内存地址,只是静态修改而已!TFilestream不会用。。。
 
几句能写完的非要一大段。
 
多人接受答案了。
 
后退
顶部