Board logo

Subject: 关于DELPHI 栈中内存保护 [Print This Page]

Author: jhsgcigi    Time: 2010-11-16 10:19     Subject: 关于DELPHI 栈中内存保护

今天突然有兴致, 写了一个例子
代码很简单, 如下:
procedure TForm1.btn1Click(Sender: TObject);
var
  S, S1, v: String;
begin
  S := '1234546788';
  S1 := S;
  V := '778899';
  Move(Pointer(V)^, Pointer(S1)^, 8);
//  PString(S)^ := '11111111111111111111111111111111111111111111';
//  FillMemory(PChar(S), 10, 0);
// CopyMemory(PChar(S), PChar(V), 10);
  mmo1.Lines.Add('S:'+IntToStr(Integer(@S))+'    S1:'+IntToStr(Integer(@S1)));
  Caption := S;
end;
运行到MOVE就报错了, 注释的同样报暴, 想法很简单,只是想把这个栈中指向的内存地址的值改掉,可是DELPHI 或是应该好像写了保护, 会暴写入错误.
但如果用 M: String ;GetMem(M, 10); 用M代码S1,就不会. 申请的内存当然是允许写入的.
如上面  S := '1234546788';
  S1 := S;
栈地址S,S1指向的其实是一个地址,就是'1234546788'实际地址. 这个地址一般在$0044为起始地址的. 我的想法是因为S1,S指向一个地址,那如果我改到S1指向实际地址中的内存,是不是S肯定一样改变, 好像根本改不动,  哪位大虾知道原理,如果是应用程序或DELPHI的内存保护机制. 说说其原理
Author: Passion    Time: 2010-11-16 21:46

现在手头没Delphi,说一下我的第一想法。常量字符串没有显式地改动其内容的情况下,应该是存储在exe中的代码段,代码段默认应该是只读的。大概是这个原因。
具体原因需要跟踪进去看看段属性了。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0