CnPack Forum


 
Subject: 关于DELPHI 栈中内存保护
jhsgcigi
新警察
Rank: 1



UID 54046
Digest Posts 0
Credits 19
Posts 6
点点分 19
Reading Access 10
Registered 2010-10-27
Status Offline
Post at 2010-11-16 10:19  Profile | Blog | P.M. 
关于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的内存保护机制. 说说其原理
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6776
Posts 3563
点点分 6776
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2010-11-16 21:46  Profile | Blog | P.M. 
现在手头没Delphi,说一下我的第一想法。常量字符串没有显式地改动其内容的情况下,应该是存储在exe中的代码段,代码段默认应该是只读的。大概是这个原因。
具体原因需要跟踪进去看看段属性了。
Top
 




All times are GMT++8, the time now is 2024-6-22 18:28

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.006921 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP