2015-12-21 72 views
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並掛接此中斷。請分享有關此黑客的任何建議。

+0

我的天堂」 t讀完了整個問題,但是構建內核以在'vdso'中導出'int 0x80'存根,而不是'sysenter'存根對glibc應該完全透明。你有沒有看過'strace(1)'用於跟蹤系統調用的機制?我不確定它是如何工作的,但我確實知道它是基於'ptrace(2)'系統調用,這是一個讓'gdb'控制另一個單步執行過程的系統調用。還有'ltrace(1)',它使用共享庫hacks將所有函數調用追蹤到共享庫中。 –

回答

0

我不會解釋你這段代碼(需要有比這更,但我不能,因爲Git倉庫,不仍然可用)

但在VMX根非檢測系統調用依賴在一些技巧,你可以在此找到paper,第6頁和7 基本上,檢測

  • 系統調用/ SYSRET:必須禁用CSE位在EFER使任何企圖利用系統調用/ SYSRET會導致無效的操作碼異常,您將攔截
  • SYSENTER/SYSEXIT:你必須保存在某個地方的SYSENTER_CS_MSR在管理程序中,然後用空值加載它使任何使用SYSENTER的/ SYSEXIT將導致一般保護性異常,你會趕上
相關問題