Design of !syscall & !sysret

Design of !syscall and !sysret command

The idea of these commands are derived from this blog post :

If you want a comprehensive explanation, please read the above link but a short explanation described here.

This command unsets the Syscall Enable Bit (SE Bit) in EFER MSR.

If we unset this bit, then execution of SYSCALL or SYSRET causes a #UD or undefined opcode exception.

We can intercept #UDs using the Exception Bitmap of VMCS. In the vm-exit, we can check whether the generated #UD was because of SYSCALL or SYSRET instructions, and if it was true, then we emulate the user-to-kernel or kernel-to-user act of these instructions. If it was not because of SYSCALL or SYSRET, we inject #UD back to the guest.

The check for these instructions is performed by checking the memory content of the GUEST_RIP field of VMCS.

PatchGuard detects this command, so it's essential to attach a Windbg kernel debugger so the PatchGuard won't start, and you can use this command without any problem.