我遇到了一组使用lock xadd
我猜测来自 C++ 智能指针模板的指令。(自从我编码 C++ 以来已经很长时间了,所以我不确定是哪个)。
lea ecx,dword ptr ds:[edi+0x4] ; edi is a class object
or eax,0xFFFFFFFF
lock xadd dword ptr ds:[ecx],eax ; add -1 to edi[1]
jne sdk.1000C801
mov eax,dword ptr ds:[edi] ; edi's vtable
mov ecx,edi ; prepare thiscall
call dword ptr ds:[eax] ; call edi->vtable[0] ??
我可以看到 edi 的成员减少了,但是这个效果如何ZF
,什么时候jne
不会被占用?这部分代码永远不会执行,因为edi
它始终为 0,所以我无法单步执行。
对我来说,它看起来像一个智能指针,当值变为 0 时,会调用析构函数。更让我困惑的是,其中有两个并排。第一个edi[1]
对edi[2]
调用的第二个进行操作vtable[1]
。