目录
KernelBase - > ReadProcessMemory
ntkrnlpa.exe - > NtReadVirtualMemory
MmCopyVirtualMemory
KeStackAttachProcess
KiAttachProcess
前言
异步过程调用中介绍了线程内核结构KTHREAD成员ApcState、ApcStateIndex、ApcStatePointer、SavedApcState在原始状态以及挂靠状态下的含义.以及"进程挂靠".
通过逆向分析ReadProcessMemory,论证KTHREAD.ApcStatePointer[ApcStateIndex] 无论什么环境下都指向ApcState.以及替换拷贝ApcState、SavedApcState的过程.
KernelBase - > ReadProcessMemory
0实现直接调用NtReadVirtualMemory.
ntkrnlpa.exe - > NtReadVirtualMemory
校验部分在NtReadVirtualMemory中处理,校验成功后通过句柄获取进程内核对象并调用MmCopyVirtualMemory.
MmCopyVirtualMemory
函数流程稍微复杂这里只展示与本文有关部分.
各种校验通过后会执行KeStackAttachProcess附加进程.
KeStackAttachProcess
首先判断附加进程与当前线程所属进程是否相同.
相同直接跳转返回.
不同提升IRQL至DPC_LEVEL,获取APC队列锁进入自旋,满足跳出条件后通过KTHREAD.ApcStateIndex来决定使用ApcState还是SavedApcState.
KiAttachProcess
eax存储Kthread,压入附加进程以及备用APC.
KiMoveApcState中完成拷贝
拷贝完成后,交换ApcStatePointer中的值,设置ApcStateIndex为1(挂靠环境)
正常情况下:ApcStateIndex = 0ApcStatePointer[ApcStateIndex] 指向 ApcState ApcStatePointer[ApcStateIndex] 指向 SavedApcState 挂靠情况下: ApcStateIndex = 1 ApcStatePointer[ApcStateIndex] 指向 SavedApcState ApcStatePointer[ApcStateIndex] 指向 ApcState 无论什么环境下,ApcStatePointer[ApcStateIndex]都指向ApcState.切换CR3在KiSwapProcess中实现.
至此线程操作数据已经在挂靠进程.