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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程

發(fā)布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、回顧

上一篇博客,我?guī)е韵碌膯栴}逆向分析了 KiSwapContext 和 SwapContext 這兩個函數(shù):

  • SwapContext 有幾個參數(shù),分別是什么?
  • SwapContext 在哪里實(shí)現(xiàn)了線程切換
  • 線程切換的時候,會切換CR3嗎?切換CR3的條件是什么?
  • 中斷門提權(quán)時,CPU會從TSS得到ESP0和SS0,TSS中存儲的一定是當(dāng)前線程的ESP0和SS0嗎?如何做到的?
  • FS:[0]在3環(huán)指向TEB,但是線程有很多,FS:[0]指向的是哪個線程的TEB,如何做到的?
  • 0環(huán)的 ExceptionList 在哪里備份的?
  • IdleThread是什么?什么時候執(zhí)行?找到這個函數(shù).
  • 如何找到下一個就緒線程?
  • 模擬線程切換與Windows線程切換有哪些區(qū)別?
  • 通過分析這倆函數(shù),我們已經(jīng)對Windows線程切換的過程有了一定了解,其中,7,8問題還沒有解決,這篇博客就是來解決這些問題的。

    二、分析 KiSwapThread

    我們還是帶著問題來分析這個函數(shù)。


    7. IdleThread是什么?什么時候執(zhí)行?找到這個函數(shù).

    空閑線程,當(dāng) KiSwapThread 找不到新的就緒線程,就會切換到這個 IdleThread,觀察下面的代碼:

    .text:00429CB5 call @KiFindReadyThread@8 ; KiFindReadyThread(x,x) .text:00429CBA test eax, eax ; 如果調(diào)用 KiFindReadyThread 找到就緒線程,就跳轉(zhuǎn) .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,就表明優(yōu)先級n的調(diào)度鏈表里有值

    當(dāng) KiFindReadyThread 函數(shù)找不到就緒線程,就從 KPCR 里取空閑線程,取完之后要修改 _KiIdleSummary 全局變量。

    IdleThread 執(zhí)行的函數(shù)叫 KiIdleLoop:

    沒看到它調(diào)用切換線程的代碼,猜測是靠時鐘中斷切換線程的。


    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); 就直接切換線程;; 如果沒有,就調(diào)用 KiFindReadyThread 找一個就緒線程

    如果 _KPRCB.NextThread 是空值,就調(diào)用 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 ; 如果調(diào)用 KiFindReadyThread 找到就緒線程,就跳轉(zhuǎn);; 如果找不到就緒線程,那么就找空閑線程 jnz short loc_429CCE

    如果調(diào)用 KiFindReadyThread 返回的仍是空值,就執(zhí)行下面的代碼找空閑線程:

    mov eax, [esi+_KPRCB.IdleThread] ; 從 _KPRCB 里取空閑線程的 _ETHREAD xor edx, edx inc edx mov ecx, ebx shl edx, cl or _KiIdleSummary, edx

    總結(jié)

    以上是生活随笔為你收集整理的(60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。