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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

6.windows线程切换_主动切换

發布時間:2025/3/20 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.windows线程切换_主动切换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ida 分析KiSwapThread

sub esp, 10h mov [esp+10h+var_4], ebx ;保存當前線程寄存器現場 mov [esp+10h+var_8], esi mov [esp+10h+var_C], edi mov [esp+10h+var_10], ebp mov ebx, ds:0FFDFF01Ch mov esi, ecx ;ESI中存儲的是要切換線程的_KTHREAD(ecx是別的地方傳過來的) mov edi, [ebx+KPCR.PrcbData.CurrentThread];取出運行當前代碼的線程的_KTHREAD mov [ebx+KPCR.PrcbData.CurrentThread], esi mov cl, [edi+58h] call SwapContext ;真正的線程切換函數 mov ebp, [esp+10h+var_10];恢復新線程各種寄存器 mov edi, [esp+10h+var_C] mov esi, [esp+10h+var_8] mov ebx, [esp+10h+var_4] add esp, 10h retn

查看有多少處調用,選中函數->view->Open subviews->cross refer…

只要調用這里面的api都會導致線程切換,windows的api絕大多數都會調用這里面的api

ecx來源 @KiSwapThread@0 proc near mov edi, edipush esipush edidb 3Ehmov eax, ds:0FFDFF020hmov esi, eaxmov eax, [esi+8]test eax, eaxmov edi, [esi+4]jnz loc_4109AFpush ebxmovsx ebx, byte ptr [esi+10h]xor edx, edxmov ecx, ebx call @KiFindReadyThread@8 ;該函數返回一個_KTHREAD eax來源 test eax, eax jz loc_40EA85pop ebxmov ecx, eax ;eac來源,eax來源上面的call call @KiSwapContext@4 ; 寄存器傳參 參數是KiFindReadyThread找到的結構體 test al, al mov cl, [edi+58h] ; NewIrql mov edi, [edi+54h] mov esi, ds:__imp_@KfLowerIrql@4 ; KfLowerIrql(x) jnz loc_415ADBcall esi ; mov eax, edi pop edi pop esi retn

call SwapContext ;真正的線程切換函數

SwapContext proc near ; CODE XREF: KiUnlockDispatcherDatabase(x)+72p; KiSwapContext(x)+29p ...or cl, clmov byte ptr es:[esi+2Dh], 2 ; 1就緒 2運行 5等待pushf ; 保持EFLAGS寄存器loc_40492C: ; CODE XREF: KiIdleLoop()+5Ajmov ecx, [ebx] ; 保存本線程切換時的內核SEH鏈表cmp dword ptr [ebx+994h], 0 ; 是否有DPC有就藍屏push ecxjnz loc_404A70cmp ds:_PPerfGlobalGroupMask, 0 ; log用的windows自己調試用的別的地方沒用jnz loc_404A47loc_404949: ; CODE XREF: SwapContext+12Bj; SwapContext+13Cj ...mov ebp, cr0 ; CR0中的保存控制位mov edx, ebpmov cl, [esi+2Ch]mov [ebx+50h], clclimov [edi+28h], esp ; 當前的ESP存儲到原線程結構中mov eax, [esi+18h] ; 目標線程棧頂mov ecx, [esi+1Ch]sub eax, 210hmov [ebx+8], ecxmov [ebx+4], eaxxor ecx, ecxmov cl, [esi+31h]and edx, 0FFFFFFF1hor ecx, edxor ecx, [eax+20Ch]cmp ebp, ecxjnz loc_404A3Flea ecx, [ecx]loc_404983: ; CODE XREF: SwapContext+11Ejtest dword ptr [eax-1Ch], 20000hjnz short loc_40498F ; 取出TSS(tss就是從3環向0環切的時候去TSS中取ESP0和SS0別的沒用)sub eax, 10hloc_40498F: ; CODE XREF: SwapContext+66jmov ecx, [ebx+40h] ; 取出TSS(tss就是從3環向0環切的時候去TSS中取ESP0和SS0別的沒用)mov [ecx+4], eax ; 將修正后的棧頂存儲到tss中mov esp, [esi+28h] ; 將目標線程的ESP存儲到ESP中mov eax, [esi+20h] ; 當前線程有很多狀態一份在ETHREAD里面還有一個備份在FS中; 這樣做的好處就是可以在3環通過FS獲取當前線程信息mov [ebx+18h], eax ; 臨時存儲目標的TEBstimov eax, [edi+44h] ; 40h =_ETHREAD.Tcb.ApcState.Processcmp eax, [esi+44h] ; 40h=_ETHREAD.Tcb.ApcState.Processmov byte ptr [edi+50h], 0jz short loc_4049D7mov edi, [esi+44h]test word ptr [edi+20h], 0FFFFhjnz short loc_404A11xor eax, eaxloc_4049B8: ; CODE XREF: SwapContext+116jlldt axxor eax, eaxmov gs, eaxassume gs:GAPmov eax, [edi+18h]mov ebp, [ebx+40h]mov ecx, [edi+30h]mov [ebp+1Ch], eaxmov cr3, eaxmov [ebp+66h], cxjmp short loc_4049D7 ; ---------------------------------------------------------------------------db 8Dh, 49h, 0 ; ---------------------------------------------------------------------------loc_4049D7: ; CODE XREF: SwapContext+85j; SwapContext+AEjmov eax, [ebx+18h]mov ecx, [ebx+3Ch]mov [ecx+3Ah], axshr eax, 10hmov [ecx+3Ch], almov [ecx+3Fh], ahinc dword ptr [esi+4Ch]inc dword ptr [ebx+61Ch]pop ecxmov [ebx], ecxcmp byte ptr [esi+49h], 0jnz short loc_404A00popfxor eax, eaxretn

看到這里是不是感覺似曾相識,沒錯跟我們模擬的那個是類似的只不過有很多的細節沒有模擬。

總結:

  • Windows中絕大部分API都調用了SwapContext函數也就是說,當線程只要調用了API,就是導致線程切換。
  • 線程切換時會比較是否屬于同一個進程,如果不是,切換Cr3Cr3換了,進程也就切換了。
  • 總結

    以上是生活随笔為你收集整理的6.windows线程切换_主动切换的全部內容,希望文章能夠幫你解決所遇到的問題。

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