对不起,我把你的行为想得过于复杂了var X: integer;procedure TForm1.Button1Click(Sender: TObject); var P : ^Integer; begin P := @X; P^ := 9999; Showmessage(inttostr(X)); end;
var X: integer;procedure TForm1.Button1Click(Sender: TObject); var P : ^Integer; begin P := @X; Showmessage(Format('%p', [P]));{P的内容,即X的地址} P^ := 9999; Showmessage(inttostr(X)); end;
@x = $123466; //是不是这样取地址来着?就假设 x的地址为$123456在$123466这个地址没有使用前,直接在这个地址内写入值
PS:好像没有什么是正常途径啊-.-
X: integer;procedure TForm1.Button1Click(Sender: TObject);
var
P : ^Integer;
begin
P := @X;
P^ := 9999;
Showmessage(inttostr(X));
end;
X: integer;procedure TForm1.Button1Click(Sender: TObject);
var
P : ^Integer;
begin
P := @X;
Showmessage(Format('%p', [P]));{P的内容,即X的地址}
P^ := 9999;
Showmessage(inttostr(X));
end;
现在X的地址是12F5D0,应该是由编译器指定的吧
现在我想让X的地址变成123456。 //12F5D0--我变-->123456
或者生成另外一个变量Y:integer,强制Y使用123456这个地址,再Y:=9999;
就是这个样的了~
var
pi : PInteger;
begin
pi := PInteger($123456);
pi^ := 5; //如果$123456是个非法地址, 程序就会崩溃.
end;当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.
a:dword;procedure TForm1.Button1Click(Sender: TObject);
var
hwnd,hPID,hProcess,lpNumberOfBytesRead,b:dword;
p:Pointer;
begin
a:=123;
b:=1;
p:=@a;
hwnd:= FindWindow(nil,'Form1');
GetWindowThreadProcessId(hwnd, @hPID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, hPID);
WriteProcessMemory(hProcess, Pointer(p), @b, 4, lpNumberOfBytesRead);
CloseHandle(hProcess);
showmessage(inttostr(a));
end;
那怎么让$123456这个原本不存在的非法地址变成合法的呢?楼上的是通过a的地址来修改a的值吧,这个时候a的地址是已经初始化的合法地址了
但是如果我想使用$123456这个没有被系统初始化过的地址,该怎么办呢?
var
pi : PInteger;
begin
pi := PInteger(Integer(@pi) + 400);
pi^ := 100;
ShowMessageFmt('%x - %x', [Integer(pi), pi^]);
end;这个程序, 在栈上乱改数据, 可能也能运行, 当然你要是把
PInteger(Integer(@pi) + 400);
改成
PInteger(Integer(@pi) + 40000);一定会死得很难看.
只是演示下修改某内存地址
你把
WriteProcessMemory(hProcess, Pointer(p), @b, 4, lpNumberOfBytesRead);
p换成$123456不就可以了?或者直接
asm
mov [$123456],1
end;
修改之前最好读一下那个地址,如果不为0最好就不要写了
汇编的还没测VirtualQuery我试的时候好像也没成功(反正是跟这个差不多名字的一个函数,不过代码丢了)也偶可能是我的方法不对