nt!ObFastDereferenceObject的cmpxchg如何失败?

时间:2019-01-31 19:47:13

标签: assembly 64-bit windows-kernel

我目前正在“实践逆向工程”中工作,其中一项任务要求我反编译“ ObFastDereferenceObject”内核例程。大部分程序集都相当容易理解,但是我无法绕过这个“ cmpxchg”指令的使用。

我确实了解cmpxchg指令(cmp dest,rax;如果等于mov dest,source;否则等于mov rax,dest),但是在此功能中,我看不到cmpxchg如何失败。

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评估为“不相等”时才执行该部分)

0 个答案:

没有答案