天天看點

調用門簡單概括

​
//通過調用門調用的 函數
void _declspec(naked) GateFun()
{
    g_num = 100;
    _asm mov [ g_esp ] , esp;
    _asm mov ax , ss;
    _asm mov word ptr [g_ss],ax
    _asm retf;
}
​
int main()
{
    //構造描述符,段選擇子為8.
     unsigned long long descript =
        createCallGateDescript(8/*8是核心中的代碼段選擇子*/ , ( unsigned int )GateFun , 0 );
​
    // 前4位元組是EIP,後2位元組是CS(0x004b)
    // 執行流程:
    // 1. 從buff這塊記憶體中取出段選擇子:0x4b
    //
    //       解釋                       SEL  T RPL
    //     十進制                         9  0 3
    // 2. 将段選擇子分解,100 1011 ==> 1001 0 11, 得到GDT表中的下标:9
    // 3. 取出GDT表中第9項描述符, 是一個調用門描述符.
    // 4. 将調用門描述符中的段選擇子加載到CS段寄存器
    // 5. 判斷RPL權限是否足夠,足夠的話繼續下一步
    char buff[ ] = { 0,0,0,0,0x4b,00 };
    _asm call fword ptr ds:[buff];
    // 6. 擷取到描述符,解析描述符段選擇子(8),權限足夠的話執行函數。
}