如何编程,使这个程序在运行期间可以对自己进行读操作??(100分)

  • 主题发起人 主题发起人 lzlishl
  • 开始时间 开始时间
L

lzlishl

Unregistered / Unconfirmed
GUEST, unregistred user!
如何编程,使这个程序在运行期间可以对自己进行读操作?
比如,word.exe 运行后,如何使用
AssignFile(f,'Word.exe');
reset(f);
指令。
 
读操作还是很简单的。

只要用ReadProcessMemory().就可以了。
 
薄荷:给个例子好吗?
 
procedure TForm1.Button3Click(Sender: TObject);
var
buf: pbyte;
ReadNum: Cardinal;
ProcessHandle: Cardinal;
ProcessID: Cardinal;
BA: PInteger;
begin
Memo1.Lines.Clear;
New(buf);
New(ba);
//New(ReadNum);
try
BA := Pinteger($45b99c); //你要读的地址。不是从0开始,你知道把。不是
//ultraEdit里的偏移地址。是w32asm里反汇编得到的。
GetWindowThreadProcessId(Self.handle,ProcessID);
if ProcessID = 0 then
Exit;
ProcessHandle := OpenProcess(PROCESS_VM_READ,false,ProcessID);
if ProcessHandle = 0 then
Exit;
ReadProcessMemory(ProcessHandle,BA,buf,1,ReadNum);
Memo1.Lines.Add(IntToHex(buf^,2));
finally
FreeMem(buf);
//FreeMem(BA);
end;
end;
在2000下测试通过了。98肯定也没问题。
 
TO:薄荷

有两个问题:
1.起始地址如何动态得到。
2.如何知道文件已经读晚。
我的真实目的是想让一个可执行程序在运行期间,可以让自己复制一份存放到另一个文件目录里。

 
程序在运行的时候,文件被锁定,不允许进行写操作,但是,
读数据是没有问题的呀, 你需要以只读的方式打开文件就可以了

可以这样写
AssignFile(f,'Word.exe');
FileMode := fmOpenRead;
reset(f);

或者使用TFileStream以只读的方式打开文件亦可
 
直接copy不就完了?

或者用TFileStream读文件,然后读到MemoryStream里,然后savetoFile

起始地址一般是$400000.读完可以用filesize来判断
 
原来用TFileStream方法不行,因为文件是以独占形式打开的。
不知道用内存映象文件的方法能不能打开。

得到起始地址可以用GetModalHandle来得到。
 
用 LiChaoHui 的方法解决了问题,也谢谢 薄荷。
 
用Tfilestream是可以的,

 
后退
顶部