我目前正在“实践逆向工程”中工作,其中一项任务要求我反编译“ 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评估为“不相等”时才执行该部分)