Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写
Windows進程與線程學習筆記(九)—— 線程優先級/進程掛靠/跨進程讀寫
- 要點回顧
- 線程優先級
- 調度鏈表
- 分析 KiFindReadyThread
- 分析 KiSwapThread
- 總結
- 進程掛靠
- 進程與線程的關系
- 進程與線程的關聯
- 分析 SwapContext
- 分析 NtReadVirtualMemory
- 總結
- 跨進程讀寫
- 跨進程讀
- 跨進程寫
- 總結
要點回顧
三種情況會導致線程切換:
KiSwapThread -> KiSwapContext -> SwapContext
KiDispatchInterrupt -> KiQuantumEnd -> SwapContext
KiDispatchInterrupt -> SwapContext
思考:在KiSwapThread與KiQuantumEnd函數中都是通過KiFindReadyThread來找下一個要切換的線程,KiFindReadyThread是根據什么條件來選擇下一個要執行的線程呢?
線程優先級
調度鏈表
描述:
分析 KiFindReadyThread
查找方式:
按照優先級別進行查找:31…30…29…28…
也就是說,在本次查找中,如果級別31的鏈表里面有線程,那么就不會查找級別為30的鏈表
注意:
若當前級別鏈表的鏈表頭和鏈表尾的值相同,但不等于它們的地址,說明存在一個等待調度的線程
分析 KiSwapThread
總結
進程掛靠
進程與線程的關系
例:CPU解析線程代碼 mov eax,dword ptr ds:[0x12345678]
Cr3寄存器中
進程與線程的關聯
mov cr3, A.DirectoryTableBase
mov eax,dword ptr ds:[0x12345678] //A進程的0x12345678內存
mov cr3, B.DirectoryTableBase
mov eax,dword ptr ds:[0x12345678] //B進程的0x12345678內存
mov cr3, C.DirectoryTableBase
mov eax,dword ptr ds:[0x12345678] //C進程的0x12345678內存
思考:在一份線程結構體中,存在著兩個指向當前線程所屬進程的指針,那么究竟是哪個提供了Cr3?
答案:線程切換的時候,會比較兩個線程的EPROCESS是否為同一個,若不是同一個,則會將 _ETHREAD.Tcb.ApcState.Process 指向的 EPROCESS的DirectoryTableBase 取出,賦值給Cr3
分析 SwapContext
分析 NtReadVirtualMemory
MmCopyVirtualMemory:
MiDoPoolCopy:
KeStackAttachProcess:
KiAttachProcess:
KiSwapProcess:
思考:可不可以只修改Cr3而不修改養父母?
答案:不可以,假設剛剛修改完Cr3,還沒讀取內存時,發生了線程切換,當再次切換回來時,會根據養父母的值為Cr3賦值,Cr3又變回了原來的值,此時將變成自己讀自己。如果我們自己來寫這個代碼,在切換Cr3后關閉中斷,并且不調用會導致線程切換的API,就可以不用修改養父母的值
總結
跨進程讀寫
描述:跨進程的本質是“進程掛靠”,正常情況下,A進程的線程只能訪問A進程的地址空間,如果A進程的線程想訪問B進程的地址空間,就要修改當前的Cr3的值為B進程的頁目錄表基值(KPROCESS.DirectoryTableBase)。即:mov cr3, B.DirectoryTableBase
分析代碼:
mov cr3,B.DirectoryTableBase //切換Cr3的值為B進程 mov eax,dword ptr ds:[0x12345678] //將進程B 0x12345678的值存入eax中 mov dword ptr ds:[0x00401234],eax //將數據存儲到0x00401234中 mov cr3,A.DirectoryTableBase //切換回Cr3的值問題:以上代碼是否存在問題?
答案:存在問題。當讀取B進程內存之后,由于Cr3并未改變,寫入的地址仍為B進程的地址。當Cr3切換回A進程后,A進程中并不存在讀出來的值
思考:如何解決以上問題?
跨進程讀
NtReadVirtualMemory執行流程:
跨進程寫
NtWriteVirtualMemory執行流程:
總結
每個進程的高2G內存空間的線性地址對應的物理頁幾乎是相同的,可以通過對高2G內存空間的利用,實現跨進程內存讀寫的操作
總結
以上是生活随笔為你收集整理的Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows进程与线程学习笔记(八)—
- 下一篇: Windows驱动开发学习笔记(一)——