修补程序时遇到访问冲突

逆向工程 部件 ollydbg x86 修补
2021-06-17 08:55:50

我是汇编/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”并达到了这一点:

MOV EDX, 0045212C

地址0x45212C包含我的字符串,因此我决定在空地址中放置另一个值(我选择 00400400)。

问题是当我将代码更改为

MOV EDX, 400400

我收到以下错误:

写入 [004003F8] 时出现访问冲突

其中包含以下装配线:

LOCK INC DWORD PTR DS:[EDX-8]

这个错误是什么意思,我该如何解决?

1个回答

此错误意味着处理器尝试访问地址0x004003F8并失败。访问类型是写。发生这种情况的原因可能是该地址的页面受保护且无法写入,或者该地址未分配。

值得注意的是,地址0x004003F8是您选择的地址 ( 0x00400400)之前的 8 个字节我猜发生访问冲突是因为该地址未分配。

根据您提供的信息,最好的猜测是,尽管文本字符串从该特定地址开始,但它只是在实际文本之前开始的更大内存结构的一部分。

这实际上很常见,并且适用于所有托管/面向对象的编程语言。并且确实是 Delphistring对象的原因,如此处所述包括内存表示细节。

您遇到访问违规的那条线路也具有一些有趣的能力,对于未受过教育的逆向人员来说可能不清楚。

LOCK INC DWORD PTR DS:[EDX-8]

下面是指令的部分一一描述:

  1. LOCK是修改其后指令的指令前缀,假定该指令正在执行读/修改/写操作。它保证后面的指令是原子的,并防止与修改相同内存地址的其他指令发生竞争。

  2. INC具有单个操作数(寄存器或内存地址)并将其加一。

  3. DWORD将提供的操作数标记为双字值(即 4 个字节)。

  4. DS:告诉地址在数据段中。这在 32 位和 64 位体系结构中变得非常多余,因此您通常可以忽略它。

  5. [EDX-8]是实际操作数,表示“当前EDX.