原创 13.跨進程讀寫內存

跨進程的本質是"進程掛靠”正常情況下, A進程的線程只能訪問A進程的地址空間,如果A進程的線程想訪問B進程的地址空間,就要修改當前的Cr3的值爲B進程的頁目錄表基值(KPROCESS.DirectoryTableBase)。 即: m

原创 1.臨界區

併發是指多個線程在同時執行: 單核–(是分時執行,不是真正的同時) 多核–(在某一個時刻,會同時有多個線程再執行) 同步則是保證在併發執行的環境中各個線程可以有序的執行 分析兩條線程執行下面代碼。 DWORD dwVal =0;

原创 12.進程掛靠

進程與線程的關係: 一個逃程可以包含多個線程 一個進程至少要有一個線程 進程爲線程提供資源,也就是提供Cr3的值, Cr3中存儲的是頁目錄表基址, Cr3確定了,線程能訪問的內存也就確定了。 進程與線程的關係 線程代碼: mov ea

原创 10.Windows線程切換_FS段寄存器

FS:[0]寄存器在3環時指向TEB.進入0環後FS:[0]指向KPCR 系統中同時存在很多個線程,這就意味着FS:[0]在3環時指向的TEB要有多個(每個線程一份)。 但在實際的使用中我們發現,當我們在3環查看不同線程的FS寄存器時

原创 2.自旋鎖

1、不同版本的內核文件 單核: 2-9-9-12分頁 ntkrnlpa.exe 10-10-12分頁 ntoskrnl.exe 多核: 2-9-9-12分頁 ntkrnlpa.exe 10-10-12分頁 ntoskrnl.exe

原创 4.WaitForSingleObject函數分析

無論可等待對象是何種類型,線程都是通過: WaitForSingleObject WaitForMultipleObjects 進入等待狀態的,這兩個函數是理解線程等待與喚醒進制的核心 WaitForSingleObject參數說明

原创 4.內核APC執行過程

APC函數的執行與插入並不是同一個線程: 在A線程中向B線程插入一個APC,插入的動作是在A線程中完成的,但什麼時候執行則由B線程決定!,所以叫“異步過程調用" 內核APC函數與用戶APC函數的執行時間和執行方式也有區別,我們本節課主

原创 9.Windows線程切換_TSS

SwapContext這個函數是Windows線程切換的核心,無論是主動切換還,是系統時鐘導致的線程切換,最終都會調用這個函數。 在這個函數中除了切換堆棧以外,還做了很多其他的事情,瞭解這些細節對我們學習操作系統至關重要。 下面我們看

原创 3.線程等待與喚醒

我們在之前的講解了如何自己實現臨界區以及什麼是Windows自旋鎖,這兩種同步方案在線程無法進入臨界區時都會讓當前線程進入等待狀態,一種是通過Sleep函數實現的,一種是通過讓當前的CPU"空轉”實現的,但這兩種等待方式都有侷限性:

原创 3.APC的掛入過程

無論是正常狀態還是掛靠狀態,都有兩個APC隊列,一個內核隊列,一個用戶隊列。 每當要掛入一個APC函數時,不管是內核APC還是用戶APC,內核都要準備一個KAPC的數據結構,並且將這個KAPC結構掛到相應的APC隊列中。 kd> dt

原创 2.備用APC隊列

如果想讓線程做什麼事情,就給它的APC隊列裏面掛一個APC。 kd> dt _kthread nt!_KTHREAD ... +0x034 ApcState : _KAPC_STATE//APC ... +0x138

原创 1.APC機制

線程是不能被“殺掉”、“掛起”、“恢復”的,線程在執行的時候自己佔據着CPU,別人怎麼可能控制它呢? 舉個極端的例子:如果不調用API,屏蔽中斷,並保證代碼不出現異常,線程將永久佔用CPU,何談控制呢?所以說線程如果想“死",一定是自

原创 11.Windows線程切換_線程優先級

(1)、當前線程主動調用API: API函數->KiSwapThread->KiSwapContext->SwapContexti (2)、當前線程時間片到期: KiDispatchInterrupt->KiQuantumEnd->S

原创 5.用戶APC執行過程

當產生系統調用、中斷或者異常,線程在返回用戶空間前都會調用, _KiServiceExit函數,在_KiServiceExit會判斷是否有要執行的用戶APC,如果有則調用KiDeliverApc函數(第一個參數爲1)進行處理。 執行用

原创 6.windows線程切換_主動切換

ida 分析KiSwapThread sub esp, 10h mov [esp+10h+var_4], ebx ;保存當前線程寄存器現場 mov [esp+10h+var_8], esi mov [