0x00.說在前面

  就我們所知,Windows操作系統(tǒng)內核的陷阱處理器會分發(fā)中斷、異常和系統(tǒng)服務調用,這里我們就其中的系統(tǒng)服務分發(fā)簡單解析一下。

 

0x01.粗看不同處理器進入系統(tǒng)調用

 ?。?).在PentiumII 之前的x86處理器上,Windows使用int2e指令產生一個陷阱,導致執(zhí)行線程轉到內核模式,進入系統(tǒng)服務分發(fā)器,eax保存系統(tǒng)服務號,edx指向參數(shù)列表。最后通過iret指令返回用戶模式;

       我們查看IDT的2e成員,得知該成員保存的地址是系統(tǒng)調用分發(fā)器的地址,緊接著u一下KiSystemService,會發(fā)現(xiàn)在保存完寄存器等狀態(tài)之后,他走到了KiFastCallEntry里面?。ㄔ赪in7 x86下測試)

      iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓

 ?。?).在x86Pentium II 處理器上,Windows使用了sysenter指令,內核的系統(tǒng)服務分發(fā)器例程的地址保存在與該指令相關聯(lián)的一個MSR中,eax,edx保存與int2e相同的內容。最后通過sysexit指令返回用戶模式;

     這里讀取MSR的0x176處,其中包含了系統(tǒng)服務分發(fā)器地址,發(fā)現(xiàn)實際上調用的就是KiFastCallEntry(入口)!(在Win7 x86下測試)

      iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓

 ?。?).在x64體系架構上,Windows使用syscall指令,將系統(tǒng)調用號保存在eax中,前四個參數(shù)放在寄存器(rcx/rdx/r8/r9)中,剩下的參數(shù)在棧中。

    64位平臺讀取MSR的0xC00000082處,里面保存的是64位的syscall,當我們u一下這個地址,發(fā)現(xiàn)這個就是x64系統(tǒng)調用分發(fā)的入口KiSystemCall64(在Win7 x64下測試)

 

網友評論