0x00.說在前面

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

 

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

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

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

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

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

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

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

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

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

 

網(wǎng)友評論