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