Assembly 怎样才能';新界!对象引用对象';s cmpxchg失败?
我目前正在进行“实用逆向工程”,其中一项任务要求我反编译“ObFastDereferenceObject”内核例程。程序集的大部分内容相当容易理解,但我无法理解如何使用这个“cmpxchg”指令 我完全理解cmpxchg指令(cmp dest,rax;if equal mov dest,source;else mov rax,dest),但在这个函数中,我看不出cmpxchg如何失败Assembly 怎样才能';新界!对象引用对象';s cmpxchg失败?,assembly,64-bit,windows-kernel,Assembly,64 Bit,Windows Kernel,我目前正在进行“实用逆向工程”,其中一项任务要求我反编译“ObFastDereferenceObject”内核例程。程序集的大部分内容相当容易理解,但我无法理解如何使用这个“cmpxchg”指令 我完全理解cmpxchg指令(cmp dest,rax;if equal mov dest,source;else mov rax,dest),但在这个函数中,我看不出cmpxchg如何失败 nt!ObFastDereferenceObject: sub rsp, 28h mov r
nt!ObFastDereferenceObject:
sub rsp, 28h
mov r9, rdx
prefetchw [rcx]
mov rax, qword ptr [rcx]
mov r8, rax
xor r8, rdx
cmp r8, 0Fh
jae nt!ObFastDereferenceObject+0x29
nt!ObFastDereferenceObject+0x19:
lea r8, [rax+1]
lock cmpxchg qword ptr [rcx], r8
jne nt!ObFastDereferenceObject+0x33
nt!ObFastDereferenceObject+0x24:
add rsp, 28h
ret
nt!ObFastDereferenceObject+0x29:
mov rcx, r9
call nt!ObfDereferenceObject
jmp nt!ObFastDereferenceObject+0x24
nt!ObFastDereferenceObject+0x33:
mov rdx, rax
xor rdx, r9
cmp rdx, 0Fh
jb nt!ObFastDereferenceObject+0x19
nt!ObFastDereferenceObject+0x3f:
jmp nt!ObFastDereferenceObject+0x29
因为(在第4行)rax得到了rcx指向的_EX_FAST_REF结构的副本,
因为rax和rcx以及rcx指向的对象都没有改变,
就我所知,比较rax和[rcx]的cmpxchg应始终计算为相等。
(考虑到只有当此cmpxchg的计算结果为“不相等”时,函数才有一个正在执行的部分,这是极不可能的。)它是多线程代码。内存中的值可能会被另一个线程更改。它实际上是自我记录的,不必要的
prefetchw
大声喊叫“该值可能已过时,因为它已被提前读取”。