我是汇编/ ollydbg /逆向工程的新手。我完全被这个错误迷住了。

我在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