日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(16)任务门

發布時間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (16)任务门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、任務門測試

IDT表中有三種門描述符,之前的課程中已經學習了中斷門,陷阱門,本節我們學習任務門。
下圖是任務門描述符結構:

除了TSS描述符選擇子以外, 其他位都是固定的。我們計劃在 8003f048 處設置TSS描述符,因此,任務門描述符的值可以確定:

0000e500`00480000

我們計劃將任務門描述符放在 8003f500,所以我們要在windbg執行的第一條命令是:

eq 8003f500 0000e500`00480000

下面,來設置TSS描述符,先看TSS描述符的結構:

其中,Base部分是TSS的地址,TSS這塊內存要在程序運行時才分配,所以暫時先留空。其他位都是確定的,如果有疑問,請看第15篇博客:
https://blog.csdn.net/Kwansy/article/details/108890586

所以,TSS描述符暫定如下,程序執行時會根據TSS的地址將要執行的指令打印出來,所以這里不用糾結:

??00e9??`????0068

下面,編寫測試程序,代碼是在第15篇博客的基礎上修改的:

// TSS.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Windows.h> #include <stdio.h>DWORD *TSS; DWORD dwOk;// 任務切換后的EIP void __declspec(naked) R0Func() {dwOk = 1;__asm{iretd} }int _tmain(int argc, _TCHAR* argv[]) { DWORD dwCr3; // windbg獲取char esp[0x1000]; // 任務切換后的棧,數組名就是ESP// 此數組的地址就是TSS描述符中的BaseTSS = (DWORD*)VirtualAlloc(NULL,104,MEM_COMMIT,PAGE_READWRITE);if (TSS == NULL){printf("VirtualAlloc 失敗,%d\n", GetLastError());getchar();return -1;}// GDT:TSS描述符printf("請在windbg執行: eq 8003f048 %02x00e9%02x`%04x0068\n", ((DWORD)TSS>>24) & 0x000000FF,((DWORD)TSS>>16) & 0x000000FF, (WORD)TSS);// IDT:任務門描述符printf("請在windbg執行: eq 8003f500 0000e500`00480000\n");printf("請在windbg中執行!process 0 0,復制TSS.exe進程DirBase的值,并輸入.\nCR3: "); // 在windbg中執行 !process 0 0 獲取,DirBase: 13600420 這個數要啟動程序后現查scanf("%x", &dwCr3); // 注意是%xTSS[0] = 0x00000000; // Previous Task Link CPU填充,表示上一個任務的選擇子TSS[1] = 0x00000000; // ESP0TSS[2] = 0x00000000; // SS0TSS[3] = 0x00000000; // ESP1TSS[4] = 0x00000000; // SS1TSS[5] = 0x00000000; // ESP2TSS[6] = 0x00000000; // SS2TSS[7] = dwCr3; // CR3 學到頁就知道是啥了TSS[8] = (DWORD)R0Func; // EIPTSS[9] = 0x00000000; // EFLAGSTSS[10] = 0x00000000; // EAXTSS[11] = 0x00000000; // ECXTSS[12] = 0x00000000; // EDXTSS[13] = 0x00000000; // EBXTSS[14] = (DWORD)esp+0x500; // ESP,解釋:esp是一個0x1000的字節數組,作為裸函數的棧,這里傳進去的應該是高地址,壓棧才不會越界TSS[15] = 0x00000000; // EBPTSS[16] = 0x00000000; // ESITSS[17] = 0x00000000; // EDITSS[18] = 0x00000023; // ESTSS[19] = 0x00000008; // CS 0x0000001BTSS[20] = 0x00000010; // SS 0x00000023TSS[21] = 0x00000023; // DSTSS[22] = 0x00000030; // FS 0x0000003BTSS[23] = 0x00000000; // GSTSS[24] = 0x00000000; // LDT Segment SelectorTSS[25] = 0x20ac0000; // I/O Map Base Addresschar buff[6] = {0,0,0,0,0x48,0}; __asm{//call fword ptr[buff]//jmp fword ptr[buff]int 0x20}printf("ok: %d\n",dwOk);return 0; }

思考一個問題:既然可以用JMP FAR / CALL FAR 訪問任務段,為什么還需要任務門?
https://blog.csdn.net/qq_37375427/article/details/85051515

二、任務門進1環

需要修改TSS中的CS,SS,FS,現在寫的是0環,要構建對應的1環段描述符。

TSS[19] = 0x00000008; // CS TSS[20] = 0x00000010; // SS TSS[22] = 0x00000030; // FS

我覺得有點麻煩,而且不明白有什么意義,所以不做了。

總結

以上是生活随笔為你收集整理的(16)任务门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。