ReadProcessMemory/WriteProcessMerory 如何正确运作?(100分)

D

ddev

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的例程为何不能正常运行?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
buffer: array[0..255] of byte;
BaseAddr: Longword;
buf_size: Longword;
read_size: Longword;
I: Longint;
ln: string;
begin
BaseAddr := $400000;
buf_size := 255;
for I := 0 to 255 do buffer := $00;

ReadProcessMemory(hInstance, @BaseAddr, @Buffer, buf_size, read_size);

ln := '';
Memo1.Lines.Clear ;
for I := 0 to 255 do
begin
if (I > 0) and (I mod 15 = 0) then
begin
Memo1.Lines.Add(ln);
ln := '';
end;
if ln = '' then
ln := IntToHex(buffer, 2) else
ln := ln + ' ' + IntToHex(buffer, 2);
end;
end;

end.
 

ReadProcessMemory(hInstance, @BaseAddr, @Buffer, buf_size, read_size);

hInstance应该是进程句柄,不是实例。
 
如何获取自身的 hProcess?
 
GetCurrentProcess
 
or OpenProcess
 
你可以先得到此进程中当前一个窗口的句柄,(用FindWindow()),.然后用GetWindowProcessid()
得到此进程的ID号,然后用OpenPrcoess()得到此进程的句柄!
 
可能我没有说清楚。我的意思是:

比如一个例程:MyApp.exe
在 MyApp 运行时,想要改变自身 EXE 物理文件的内容,
因此就想到这两个调试函数(也可能不对,我看金山游
侠3 中能够读取的内存就是物理文件本身的内容,我的
目的也是如此,这样就可以在运行时刻改变文件本身了)。

NowCan 的 GetCurrProcess 能等到一个 hProcess,但
读出的数据却与物理文件不一样。不知道为什么?
 
那个函数读出的是虚拟地址内容,和物理内容有区别的,不过可以找到对应关系。
你需要了解Win32PE文件的格式。相关信息都可以在文件头里找到。
但是我认为即使你正确的读出了内存,也还是不能在运行时改变exe文件自身。
 
你可以在运行时改变运行时的代码。我写了有一个spedia bar一个破解程序,用到了这种技术
不过是用VC写的。要的话留EMAIL
 
给我发一份吧
mailto: yhjvcnet@china.com.cn
 
我写过一个破解cashfash bar 的程序,你要的东西全有,用delphi编的。
 
Can you send to me?
xzf3201@163.com. thanks.
 
多人接受答案了。
 
顶部