6.windows线程切换_主动切换
生活随笔
收集整理的這篇文章主要介紹了
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
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看到這里是不是感覺似曾相識,沒錯跟我們模擬的那個是類似的只不過有很多的細節沒有模擬。
總結:
總結
以上是生活随笔為你收集整理的6.windows线程切换_主动切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5.模拟线程切换
- 下一篇: 7.Windows线程切换_时钟中断切换