3
我正試圖完成將ELF二進制文件轉換爲虛擬機以提供類似於http://dune.scs.stanford.edu/的進程自己的執行環境的項目。許多論文都說「我們檢測到系統調用....」,但沒有提供檢測的細節,除了本文的代碼檢測到vmx非根環0中的系統調用(因爲進程將在此環中運行)。但由於缺乏文件和提示,我無法掌握他的方法。 相關的代碼是如下
/*
* macro to switch to G0 fs.base
*
* NOTE: clobbers %rax, %rdx, and %rcx
*/
.macro SET_G0_FS_BASE
movq $0, %gs:IN_USERMODE
movq %gs:KFS_BASE, %rax
movq %gs:UFS_BASE, %rdx
cmp %rax, %rdx
je 1f
#if USE_RDWRGSFS
wrfsbase %rax
#else
movq %rax, %rdx
shrq $32, %rdx
movl $MSR_FS_BASE, %ecx
wrmsr
#endif /* USE_RDWRGSFS */
1:
.endm
__dune_syscall:
/* handle system calls from G0 */
testq $1, %gs:IN_USERMODE
jnz 1f
pushq %r11
popfq
vmcall
jmp *%rcx
1:
/* first switch to the kernel stack */
movq %rsp, %gs:TMP
movq %gs:TRAP_STACK, %rsp
/* now push the trap frame onto the stack */
subq $TF_END, %rsp
movq %rcx, RIP(%rsp)
movq %r11, RFLAGS(%rsp)
movq %r10, RCX(%rsp) /* fixup to standard 64-bit calling ABI */
SAVE_REGS 0, 1
movq %gs:TMP, %rax
movq %rax, RSP(%rsp)
/* then restore the CPL0 FS base address */
SET_G0_FS_BASE
/* then finally re-enable interrupts and jump to the handler */
sti
movq %rsp, %rdi /* argument 0 */
lea dune_syscall_handler, %rax
call *%rax
/* next restore the CPL3 FS base address */
SET_G3_FS_BASE
/* then pop the trap frame off the stack */
RESTORE_REGS 0, 1
movq RCX(%rsp), %r10
movq RFLAGS(%rsp), %r11
movq RIP(%rsp), %rcx
/* switch to the user stack and return to ring 3 */
movq RSP(%rsp), %rsp
sysretq
.globl __dune_syscall_end
__dune_syscall_end:
nop
我的問題如下
1)如何上面這段代碼的工作?任何解釋,指針或引用將有幫助
2)在這種情況下檢測系統調用的任何其他方法都可能嗎?我認爲與vdso
調整將是其他解決方案。我能想到的是,在vmx non root中強制系統調用使用int 80h
並掛接此中斷。請分享有關此黑客的任何建議。
我的天堂」 t讀完了整個問題,但是構建內核以在'vdso'中導出'int 0x80'存根,而不是'sysenter'存根對glibc應該完全透明。你有沒有看過'strace(1)'用於跟蹤系統調用的機制?我不確定它是如何工作的,但我確實知道它是基於'ptrace(2)'系統調用,這是一個讓'gdb'控制另一個單步執行過程的系統調用。還有'ltrace(1)',它使用共享庫hacks將所有函數調用追蹤到共享庫中。 –