我在Delphi中创建了一个简单的程序,只是为了在ollydbg中进行探索。这是程序的代码:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var somevalue : string;
begin
somevalue := 'this is a value';
showmessage(somevalue);
end;
所以我将其附加在olly中并搜索字符串“ this is a value”,并到达了这一点: br />
MOV EDX, 0045212C
地址
0x45212C
包含我的字符串,因此我决定将另一个值放在空地址中(我选择00400400)。问题是当我将代码更改为
MOV EDX, 400400
我遇到以下错误:
写入[004003F8]时发生访问冲突
其中包含以下组装线:
LOCK INC DWORD PTR DS:[EDX-8]
此错误是什么意思,我该如何解决?
#1 楼
此错误表示处理器尝试访问0x004003F8
的地址,但失败。访问类型为write。发生这种情况的原因是该地址的页面受保护且无法写入,或者因为该地址未分配。
我不愿指出,
0x004003F8
在您选择的地址(0x00400400
)之前是八个字节。我猜发生访问冲突是因为未分配该地址。在实际文本之前开始的结构。这实际上很常见,并且适用于所有托管/面向对象的编程语言。这确实是Delphi
string
对象的原因,如此处所述,包括内存表示细节。 LOCK INC DWORD PTR DS:[EDX-8]
以下是指令的各个部分:
LOCK
是指令前缀,用于修改其后的指令,假定它正在执行读取/修改/写入操作。它保证后面的指令是原子的,并防止竞争条件与其他指令修改相同的内存地址。 INC
将提供的操作数标记为双字值(即4个字节)。DWORD
告知地址在数据段中。在32位和64位体系结构中,这变得非常多余,因此您通常可以忽略它。
评论
并注意[edx-8]访问描述中称为引用计数的字段。由于使用锁来使指令成为多线程安全指令,因此每当创建对字符串的新引用时,字符串引用计数都会增加,这很有意义。要回答有关如何解决它的问题:将字符串复制到4000040C,然后将原始字符串前面的12个字节复制到40000400。不要忘记将字符串长度调整为40000008。
–贡特拉姆·布洛姆(Guntram Blohm)
16-09-26在5:15