(60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
生活随笔
收集整理的這篇文章主要介紹了
(60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、回顧
上一篇博客,我帶著以下的問題逆向分析了 KiSwapContext 和 SwapContext 這兩個函數:
通過分析這倆函數,我們已經對Windows線程切換的過程有了一定了解,其中,7,8問題還沒有解決,這篇博客就是來解決這些問題的。
二、分析 KiSwapThread
我們還是帶著問題來分析這個函數。
7. IdleThread是什么?什么時候執行?找到這個函數.
空閑線程,當 KiSwapThread 找不到新的就緒線程,就會切換到這個 IdleThread,觀察下面的代碼:
.text:00429CB5 call @KiFindReadyThread@8 ; KiFindReadyThread(x,x) .text:00429CBA test eax, eax ; 如果調用 KiFindReadyThread 找到就緒線程,就跳轉 .text:00429CBA ; .text:00429CBA ; 如果找不到就緒線程,那么就找空閑線程 .text:00429CBC jnz short loc_429CCE .text:00429CBE mov eax, [esi+_KPRCB.IdleThread] ; 從 _KPRCB 里取空閑線程的 _ETHREAD .text:00429CC1 xor edx, edx .text:00429CC3 inc edx .text:00429CC4 mov ecx, ebx .text:00429CC6 shl edx, cl .text:00429CC8 or _KiIdleSummary, edx ; _KiIdleSummary 第n位置1,就表明優先級n的調度鏈表里有值當 KiFindReadyThread 函數找不到就緒線程,就從 KPCR 里取空閑線程,取完之后要修改 _KiIdleSummary 全局變量。
IdleThread 執行的函數叫 KiIdleLoop:
沒看到它調用切換線程的代碼,猜測是靠時鐘中斷切換線程的。
8. 如何找到下一個就緒線程?
下面的代碼判斷 _KPRCB.NextThread 里是否有值,如果有就直接切換到這個線程;
mov edi, edi push esi push edi db 3Eh mov eax, ds:0FFDFF020h mov esi, eax ; esi, eax 指向 _KPRCB mov eax, [esi+_KPRCB.NextThread] test eax, eax mov edi, [esi+_KPRCB.CurrentThread] ; edi = _KPRCB.CurrentThread jz short loc_429CAC ; 如果 _KPCR 里存了 NextThread (非0); 就直接切換線程;; 如果沒有,就調用 KiFindReadyThread 找一個就緒線程如果 _KPRCB.NextThread 是空值,就調用 KiFindReadyThread 找一個就緒線程;
loc_429CAC: push ebx movsx ebx, [esi+_KPRCB.Number] xor edx, edx mov ecx, ebx call @KiFindReadyThread@8 ; KiFindReadyThread(x,x) test eax, eax ; 如果調用 KiFindReadyThread 找到就緒線程,就跳轉;; 如果找不到就緒線程,那么就找空閑線程 jnz short loc_429CCE如果調用 KiFindReadyThread 返回的仍是空值,就執行下面的代碼找空閑線程:
mov eax, [esi+_KPRCB.IdleThread] ; 從 _KPRCB 里取空閑線程的 _ETHREAD xor edx, edx inc edx mov ecx, ebx shl edx, cl or _KiIdleSummary, edx總結
以上是生活随笔為你收集整理的(60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (59)逆向分析 KiSwapConte
- 下一篇: (61)分析 KiFindReadyTh