var
  X: Integer;
begin
  X := 2008; //写入了
end;PS:您是怎么得到那个内存地址的?我猜测不是正常途径。一般来说好危险。

解决方案 »

  1.   

    假设
    @x = $123466;   //是不是这样取地址来着?就假设 x的地址为$123456在$123466这个地址没有使用前,直接在这个地址内写入值
    PS:好像没有什么是正常途径啊-.-
      

  2.   

    对不起,我把你的行为想得过于复杂了var
      X: integer;procedure TForm1.Button1Click(Sender: TObject);
    var
      P : ^Integer;
    begin
      P := @X;
      P^ := 9999;
      Showmessage(inttostr(X));
    end;
      

  3.   

    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;
      

  4.   


    现在X的地址是12F5D0,应该是由编译器指定的吧
    现在我想让X的地址变成123456。      //12F5D0--我变-->123456
    或者生成另外一个变量Y:integer,强制Y使用123456这个地址,再Y:=9999;
    就是这个样的了~
      

  5.   


    var
      pi : PInteger;
    begin
      pi := PInteger($123456);
      pi^ := 5; //如果$123456是个非法地址, 程序就会崩溃. 
    end;当然$123456确实是个非法地址, 所以这段程序会崩溃. 你先要找到一个合法的地址, 才能这么做.
      

  6.   

    var
    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;
      

  7.   


    那怎么让$123456这个原本不存在的非法地址变成合法的呢?楼上的是通过a的地址来修改a的值吧,这个时候a的地址是已经初始化的合法地址了
    但是如果我想使用$123456这个没有被系统初始化过的地址,该怎么办呢?
      

  8.   


    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);一定会死得很难看.
      

  9.   


    只是演示下修改某内存地址
    你把
    WriteProcessMemory(hProcess, Pointer(p), @b, 4, lpNumberOfBytesRead); 
    p换成$123456不就可以了?或者直接
    asm
      mov [$123456],1
    end;
    修改之前最好读一下那个地址,如果不为0最好就不要写了
      

  10.   

    直接Write的试过了,写不进去
    汇编的还没测VirtualQuery我试的时候好像也没成功(反正是跟这个差不多名字的一个函数,不过代码丢了)也偶可能是我的方法不对
      

  11.   

    WriteProcessMemory 用这个貌似可以,呵呵,暂时没领悟LZ的意思。。