其实不同编译器产生的代码不同,想靠这个溢出覆盖后面的部分,麻烦得很。
刚刚试了一下,实际上那段代码在Delphi里根本就不指向b[1] (假设能运行)
Delphi的顺序和C正好相反,定义 var b,a:array[0..1] of integer;
结果内存里实际存放为:
... a[0] a[1] b[0] b[1] ... (这样a[-1]就是之前的一个变量了)
用这段代码可以证明:
//读取内存的函数
procedure Mem(Address
ointer;Var Buf;bLength:Cardinal);
Var cBuf:array of byte absolute Buf;
//强制Buf为Byte数组
asm
mov edx,cBuf //取 Buf 地址
mov ebx,Address //写目标地址到ebx
mov ecx,bLength
@re:
mov al,[ebx]
mov [edx],al
inc ebx
inc edx
dec ecx
jnz @re //没完的话,继续
end;
procedure TForm1.Button1Click(Sender: TObject);
var Bufs:array[0..15] of Byte;
b,a:array[0..1] of integer;
begin
b[0]:=$10;
b[1]:=$40;
a[0]:=$A0;
a[1]:=$80;
mem(@a,Bufs,15);
Showmessage(Format('a[0] = %0.2x%0.2x%0.2x%0.2x'
+#13#10+'a[1] = %0.2x%0.2x%0.2x%0.2x'
+#13#10+'b[0] = %0.2x%0.2x%0.2x%0.2x'
+#13#10+'b[1] = %0.2x%0.2x%0.2x%0.2x',
[Bufs[3],Bufs[2],Bufs[1],Bufs[0],
Bufs[7],Bufs[6],Bufs[5],Bufs[4],
Bufs[11],Bufs[10],Bufs[9],Bufs[8],
Bufs[15],Bufs[14],Bufs[13],Bufs[12]]));
a[0]:=a[1]+b[0]+b[1];
//这里要干点什么,不然Delphi发现你后面没用到a,b,用mem()前就释放空间了。
end;