Windows APC学习笔记(一)—— APC的本质备用APC队列
Windows APC學習筆記(一)—— APC的本質&備用APC隊列
- 基礎知識
- APC的本質
- APC隊列
- APC結構
- 分析 KiServiceExit
- 總結
- 備用APC隊列
- 掛靠環境下ApcState的意義
- ApcStatePointer
- ApcStateIndex
- 組合尋址
- ApcQueueable
基礎知識
思考:那如果想改變一個線程的行為該怎么辦
答案:可以給他提供一個函數,讓它自己去調用:APC(Asyncroneus Procedure Call,異步過程調用)
APC的本質
APC隊列
在Windbg中查看:
ApcListHead:
Process:指向線程所屬或者掛靠進程
KernelApcInProgress:內核Apc是否正在執行
KernelApcPending:是否存在等待狀態的內核APC,存在則置1
UserApcPending:是否存在等待狀態的用戶APC,存在則置1
APC結構
在WinDbg中查看:
NormalRoutine:找到提供的APC函數,并不完全等于APC函數的地址,后續將重點學習
分析 KiServiceExit
總結
如果我們想要改變一個線程,可以先提供一個APC,然后通過 _KAPC.NormalRoutine 指向我們提供的APC在哪里,再將APC存到 _KTHREAD.ApcState.ApcListHead 的第一個成員中
思考:當前線程什么時候將會執行提供的APC
答案:
備用APC隊列
描述:
掛靠環境下ApcState的意義
在掛靠的環境下,也是可以先線程APC隊列插入APC的
A進程的T線程掛靠B進程 A是T的所屬進程 B是T的掛靠進程 ApcState B進程相關的APC函數 SavedApcState A進程相關的APC函數在正常情況下,當前進程就是所屬進程A,如果是掛靠情況下,當前進程就是掛靠進程B
ApcStatePointer
描述:為了操作方便,_KTHREAD 結構體中定義了一個指針數組 ApcStatePointer ,長度為2,位于 _KTHREAD+0x138
正常情況下:
ApcStatePointer[0] 指向 ApcState
ApcStatePointer[1] 指向 SavedApcState
掛靠情況下:
ApcStatePointer[0] 指向 SavedApcState
ApcStatePointer[1] 指向 ApcState
ApcStateIndex
描述:ApcStateIndex 用來標識當前線程處于什么狀態,位于 _KTHREAD+0x165
0:正常狀態
1:掛靠狀態
組合尋址
正常情況下,向ApcState隊列中插入APC時:
ApcStatePointer[0] 指向 ApcState,此時 ApcStateIndex 的值為 0
ApcStatePointer[ApcStateIndex] 指向 ApcState
掛靠情況下,向ApcState隊列中插入APC時:
ApcStatePointer[1] 指向 ApcState,此時 ApcStateIndex 的值為 1
ApcStatePointer[ApcStateIndex] 指向 ApcState
總結:
無論什么環境下,ApcStatePointer[ApcStateIndex] 指向的都是 ApcState
ApcState 總是表示線程當前使用的apc狀態
ApcQueueable
描述:
總結
以上是生活随笔為你收集整理的Windows APC学习笔记(一)—— APC的本质备用APC队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pwn学习总结(五) —— 堆溢出经典题
- 下一篇: Windows APC学习笔记(二)——