Windows内核进程管理器解析
Windows内核是如何实现线程挂起的?如何实现线程挂载到进程的?如何实现杀死进程和线程的?
从源码分析一下,这些操作具体在源码上是如何实现的。
进程创建、线程切换、线程跨越CPU权限级、进程挂靠、杀死进程、杀死线程
一.进程创建
可以分几个部分来说。首先说进程的地址空间是怎么创建起来的,进程的EPROCESS->VadRoot是用来描述进程的用户地址空间的。只有在VadRoot结构中分配了的空间才可能被使用。进程初始化空间使用了MmCreateProcessAddressSpace函数,这个函数如下.
二.线程切换
操作系统如何从一个线程切换到另一个线程?
首先,只有内核模式下有线程切换。
三.杀死进程
对应于官方接口分别是用户层的TerminateProcess()和内核层的ZwTerminateProcess()。
杀死进程与创建进程很像,都是一个由多步复合的过程。原因就是因为进程是一个包揽众多的容器。
比如进程有地址空间、有内核对象、也有所拥有的线程。倘若要创建进程势必要创建线程,倘若要杀死进程势必要杀死线程。
所以进程真正的“运行终止”,其实是取决于杀死线程。
四.创建线程
先放上KTHREAD和ETHREAD结构的情况,可见线程对象里面也是有很多东西的
typedef struct _KTHREAD
{
DISPATCHER_HEADER Header;
UINT64 CycleTime;
ULONG HighCycleTime;
UINT64 QuantumTarget;
PVOID InitialStack;
PVOID StackLimit;
PVOID KernelStack;
ULONG ThreadLock;
union
{
KAPC_STATE ApcState;
UCHAR ApcStateFill[];
};
CHAR Priority;
WORD NextProcessor;
WORD DeferredProcessor;
ULONG ApcQueueLock;
ULONG ContextSwitches;
UCHAR State;
UCHAR NpxState;
UCHAR WaitIrql;
CHAR WaitMode;
LONG WaitStatus;
union
{
PKWAIT_BLOCK WaitBlockList;
PKGATE GateObject;
};
union
{
ULONG KernelStackResident: ;
ULONG ReadyTransition: ;
ULONG ProcessReadyQueue: ;
ULONG WaitNext: ;
ULONG SystemAffinityActive: ;
ULONG Alertable: ;
ULONG GdiFlushActive: ;
ULONG Reserved: ;
LONG MiscFlags;
};
UCHAR WaitReason;
UCHAR SwapBusy;
UCHAR Alerted[];
union
{
LIST_ENTRY WaitListEntry;
SINGLE_LIST_ENTRY SwapListEntry;
};
PKQUEUE Queue;
ULONG WaitTime;
union
{
struct
{
SHORT KernelApcDisable;
SHORT SpecialApcDisable;
};
ULONG CombinedApcDisable;
};
PVOID Teb;
union
{
KTIMER Timer;
UCHAR TimerFill[];
};
union
{
ULONG AutoAlignment: ;
ULONG DisableBoost: ;
ULONG EtwStackTraceApc1Inserted: ;
ULONG EtwStackTraceApc2Inserted: ;
ULONG CycleChargePending: ;
ULONG CalloutActive: ;
ULONG ApcQueueable: ;
ULONG EnableStackSwap: ;
ULONG GuiThread: ;
ULONG ReservedFlags: ;
LONG ThreadFlags;
};
union
{
KWAIT_BLOCK WaitBlock[];
struct
{
UCHAR WaitBlockFill0[];
UCHAR IdealProcessor;
};
struct
{
UCHAR WaitBlockFill1[];
CHAR PreviousMode;
};
struct
{
UCHAR WaitBlockFill2[];
UCHAR ResourceIndex;
};
UCHAR WaitBlockFill3[];
};
UCHAR LargeStack;
LIST_ENTRY QueueListEntry;
PKTRAP_FRAME TrapFrame;
PVOID FirstArgument;
union
{
PVOID CallbackStack;
ULONG CallbackDepth;
};
PVOID ServiceTable;
UCHAR ApcStateIndex;
CHAR BasePriority;
CHAR PriorityDecrement;
UCHAR Preempted;
UCHAR AdjustReason;
CHAR AdjustIncrement;
UCHAR Spare01;
CHAR Saturation;
ULONG SystemCallNumber;
ULONG Spare02;
ULONG UserAffinity;
PKPROCESS Process;
ULONG Affinity;
PKAPC_STATE ApcStatePointer[];
union
{
KAPC_STATE SavedApcState;
UCHAR SavedApcStateFill[];
};
CHAR FreezeCount;
CHAR SuspendCount;
UCHAR UserIdealProcessor;
UCHAR Spare03;
UCHAR Iopl;
PVOID Win32Thread;
PVOID StackBase;
union
{
KAPC SuspendApc;
struct
{
UCHAR SuspendApcFill0[];
CHAR Spare04;
};
struct
{
UCHAR SuspendApcFill1[];
UCHAR QuantumReset;
};
struct
{
UCHAR SuspendApcFill2[];
ULONG KernelTime;
};
struct
{
UCHAR SuspendApcFill3[];
PKPRCB WaitPrcb;
};
struct
{
UCHAR SuspendApcFill4[];
PVOID LegoData;
};
UCHAR SuspendApcFill5[];
};
UCHAR PowerState;
ULONG UserTime;
union
{
KSEMAPHORE SuspendSemaphore;
UCHAR SuspendSemaphorefill[];
};
ULONG SListFaultCount;
LIST_ENTRY ThreadListEntry;
LIST_ENTRY MutantListHead;
PVOID SListFaultAddress;
PVOID MdlForLockedTeb;
} KTHREAD, *PKTHREAD;
KTHREAD
typedef struct _ETHREAD
{
KTHREAD Tcb;
LARGE_INTEGER CreateTime;
union
{
LARGE_INTEGER ExitTime;
LIST_ENTRY KeyedWaitChain;
};
union
{
LONG ExitStatus;
PVOID OfsChain;
};
union
{
LIST_ENTRY PostBlockList;
struct
{
PVOID ForwardLinkShadow;
PVOID StartAddress;
};
};
union
{
PTERMINATION_PORT TerminationPort;
PETHREAD ReaperLink;
PVOID KeyedWaitValue;
PVOID Win32StartParameter;
};
ULONG ActiveTimerListLock;
LIST_ENTRY ActiveTimerListHead;
CLIENT_ID Cid;
union
{
KSEMAPHORE KeyedWaitSemaphore;
KSEMAPHORE AlpcWaitSemaphore;
};
PS_CLIENT_SECURITY_CONTEXT ClientSecurity;
LIST_ENTRY IrpList;
ULONG TopLevelIrp;
PDEVICE_OBJECT DeviceToVerify;
_PSP_RATE_APC * RateControlApc;
PVOID Win32StartAddress;
PVOID SparePtr0;
LIST_ENTRY ThreadListEntry;
EX_RUNDOWN_REF RundownProtect;
EX_PUSH_LOCK ThreadLock;
ULONG ReadClusterSize;
LONG MmLockOrdering;
ULONG CrossThreadFlags;
ULONG Terminated: ;
ULONG ThreadInserted: ;
ULONG HideFromDebugger: ;
ULONG ActiveImpersonationInfo: ;
ULONG SystemThread: ;
ULONG HardErrorsAreDisabled: ;
ULONG BreakOnTermination: ;
ULONG SkipCreationMsg: ;
ULONG SkipTerminationMsg: ;
ULONG CopyTokenOnOpen: ;
ULONG ThreadIoPriority: ;
ULONG ThreadPagePriority: ;
ULONG RundownFail: ;
ULONG SameThreadPassiveFlags;
ULONG ActiveExWorker: ;
ULONG ExWorkerCanWaitUser: ;
ULONG MemoryMaker: ;
ULONG ClonedThread: ;
ULONG KeyedEventInUse: ;
ULONG RateApcState: ;
ULONG SelfTerminate: ;
ULONG SameThreadApcFlags;
ULONG Spare: ;
ULONG StartAddressInvalid: ;
ULONG EtwPageFaultCalloutActive: ;
ULONG OwnsProcessWorkingSetExclusive: ;
ULONG OwnsProcessWorkingSetShared: ;
ULONG OwnsSystemWorkingSetExclusive: ;
ULONG OwnsSystemWorkingSetShared: ;
ULONG OwnsSessionWorkingSetExclusive: ;
ULONG OwnsSessionWorkingSetShared: ;
ULONG OwnsProcessAddressSpaceExclusive: ;
ULONG OwnsProcessAddressSpaceShared: ;
ULONG SuppressSymbolLoad: ;
ULONG Prefetching: ;
ULONG OwnsDynamicMemoryShared: ;
ULONG OwnsChangeControlAreaExclusive: ;
ULONG OwnsChangeControlAreaShared: ;
ULONG PriorityRegionActive: ;
UCHAR CacheManagerActive;
UCHAR DisablePageFaultClustering;
UCHAR ActiveFaultCount;
ULONG AlpcMessageId;
union
{
PVOID AlpcMessage;
ULONG AlpcReceiveAttributeSet;
};
LIST_ENTRY AlpcWaitListEntry;
ULONG CacheManagerCount;
} ETHREAD, *PETHREAD;
ETHREAD
杀死线程是通过APC来实现的。首先会判断当前线程是否是最后的线程,如果是就直接调用 结束当前线程。如果有别的线程就向它们插入一个APC,用于结束。
Windows内核进程管理器解析的更多相关文章
- Chocolatey:Windows软件包管理器
Chocolatey 2016-08-03 https://chocolatey.org/ Chocolatey是一个Windows软件包管理器,就像Nuget或者npm,或者说类似Linux上的ap ...
- windows 服务管理器使用系统内置帐户时密码的输入
windows 服务管理器使用系统内置帐户时在选择帐户如network services后不需要输入密码,直接确认即可,系统会自动附加密码.
- Windows包管理器
Windows包管理器 Scoop 参考 安装命令 set-executionpolicy remotesigned -scope currentuser #用powershell执行 iex (ne ...
- 使用 Windows 包管理器 (winget) 安装 .Net
用户可以在 Windows 10 和 Windows 11 计算机上使用 winget 命令行工具来发现.安装.升级.删除和配置应用程序. 此工具是 Windows 程序包管理器服务的客户端接口. 以 ...
- Windows包管理器——Scoop 包管理器
Scoop 包管理器 目录 Scoop 包管理器 参考 官方 博客 声明 目录 scoop 安装&&卸载 安装( 使用 powershell) 卸载(软件的使用权归自己所有,一言不合即 ...
- 向Windows 日志管理器写入系统程序日志信息
标准样例代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...
- 多媒体管理器解析IMultimediaManager
一.基本API bool Available { get; } bool Working { get; } AdvancedOptions Advanced { get; } 二.作为通信引擎 str ...
- 获取windows凭证管理器明文密码
1.运行cmdkey /list查看windows保存凭证 方法1.mimikaz mimikatz vault::cred 2.利用powershell尝试获取 windows 普通凭据类型中的明文 ...
- 转:获取windows凭证管理器明文密码
1.运行cmdkey /list查看windows保存凭证 方法1.mimikaz mimikatz vault::cred 2.利用powershell尝试获取 windows 普通凭据类型中的明文 ...
随机推荐
- 通过系统自带的MSI安装包来提权账号
Windows environments provide a group policy setting which allows a regular user to install a Microso ...
- Chiaki Sequence Revisited HDU - 6304 lowbit找规律法
Problem Description Chiaki is interested in an infinite sequence a1,a2,a3,..., which is defined as f ...
- 基于epoll封装的事件回调miniserver
epoll技术前两节已经阐述过了,目前主要做一下封装,很多epoll的服务器都是采用事件回调方式处理, 其实并没有什么复杂的,我慢慢给大家阐述下原理. 在networking.h和networking ...
- 限制SSH远程登录用户仅能只读访问Linux中指定的目录
资料参考:http://os.51cto.com/art/201703/534895.htm 背景需求: 在TOMCAT服务器上建立一个普通帐号log_user,只能查看TOMCAT日志,不能删改任何 ...
- numpy数组中冒号和负号的含义
numpy数组中":"和"-"的意义 觉得有用的话,欢迎一起讨论相互学习~Follow Me 在实际使用numpy时,我们常常会使用numpy数组的-1维度和& ...
- [LeetCode] 28. Implement strStr() ☆
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- 数字配对(bzoj 4514)
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
- Oracle数据库语句
Oracle数据库语句 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHEC ...
- react系列一,react虚拟dom如何转成真实的dom
react,想必作为前端开发一定不陌生,组件化以及虚拟dom使得react成为最受欢迎额前端框架之一.我们知道react是基于虚拟dom的,但是什么是虚拟dom呢,其实就是一组js对象,那么我们今天就 ...
- python初步学习-面向对象之 类(二)
方法重写 如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法: #!/usr/bin/env python #coding:utf8 class Parent: def myMeth ...