【旧文章搬运】Idle进程相关的一些东西
原文发表于百度空间,2009-05-13
==========================================================================
Idle进程和System进程一样,也是系统中的一个特殊进程,严格讲它不算是一个进程,但是它有自己的EPROCESS,并有一个IdleThread.
若说它算一个进程,它的进程空间、句柄表、Token等却又和System进程一样,即共享了System的内核数据,所以不能以常理对待之.
关于Idle进程的两个问题:
一.活动进程链上为何找不到Idle进程?
事实上是因为Idle进程根本就不在活动进程链上挂着.
有人在遍历ActiveProcessLink时总会看到一个很奇怪的进程,PID很离奇,也得不到映像名,便以为是Idle进程了.
其实那是PsActiveProcessHead,就是活动进程链的链表头,它只是一个LIST_ENTRY结构而已,读取它后面的数据是没有意义的.
二.如何找到Idle进程?
似乎看到过一种暴搜法,但是事实上完全没有必要.
在处理器控制块中保存着IdleThread,当处理器空闲时,它就会调度这个线程来完成一些工作(零页面处理?).
因此从处理器控制域KPRCB中找Idle进程是最方便快捷的.
过程如下:
lkd> dt _KPRCB ffdff120
nt!_KPRCB
+0x000 MinorVersion :
+0x002 MajorVersion :
+0x004 CurrentThread : 0x8958fda8 _KTHREAD
+0x008 NextThread : (null)
+0x00c IdleThread : 0x80561c20 _KTHREAD //Idle线程 lkd> dt _KTHREAD 0x80561c20
nt!_KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListHead : _LIST_ENTRY [ 0x80561c30 - 0x80561c30 ]
+0x018 InitialStack : 0x80559480
+0x01c StackLimit : 0x80556480
+0x020 Teb : (null)
+0x024 TlsArray : (null)
+0x028 KernelStack : 0x805591cc
....
+0x034 ApcState : _KAPC_STATE lkd> dt _KAPC_STATE 0x80561c20+
nt!_KAPC_STATE
+0x000 ApcListHead : [] _LIST_ENTRY [ 0x80561c54 - 0x80561c54 ]
+0x010 Process : 0x80561e80 _KPROCESS //这个就是Idle进程了
+0x014 KernelApcInProgress : ''
+0x015 KernelApcPending : ''
+0x016 UserApcPending : ''
获取IdleProcess的代码如下:
VOID GetIdleProcess()
{
PEPROCESS IdleProcess;
_asm
{
mov eax,fs:[0x20] //取KPCR
mov eax,[eax+0xC] //取IdleThread
mov eax,[eax+0x44]//取ApcState->Process
mov IdleProcess,eax
}
DbgPrint("IdleProcess=0x%08X\n",IdleProcess);
}
四行代码搞定~~
【旧文章搬运】Idle进程相关的一些东西的更多相关文章
- 【旧文章搬运】如何从EPROCESS辨别一个进程是否已退出
原文发表于百度空间,2008-7-31========================================================================== 前面已经通过 ...
- 【旧文章搬运】Windows内核常见数据结构(进程相关)
原文发表于百度空间,2008-7-24========================================================================== 进程的相关结 ...
- 【旧文章搬运】再谈隐藏进程中的DLL模块
原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...
- 【旧文章搬运】Windows内核常见数据结构(线程相关)
原文发表于百度空间,2008-7-24========================================================================== 线程是进程的 ...
- 【旧文章搬运】关于在指定进程调用KeUserModeCallback的问题
原文发表于百度空间,2010-10-07========================================================================== 由于KeU ...
- 【旧文章搬运】为什么win32k.sys在System进程空间无法访问
原文发表于百度空间,2010-01-02========================================================================== 玩过Sha ...
- 【旧文章搬运】Windows内核常见数据结构(驱动相关)
原文发表于百度空间,2008-7-24========================================================================== 这些是驱动中 ...
- 【旧文章搬运】深入分析Win7的对象引用跟踪机制
原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...
- 【旧文章搬运】分析了一下360安全卫士的HOOK(二)——架构与实现
原文发表于百度空间及看雪论坛,2009-10-14 看雪论坛地址:https://bbs.pediy.com/thread-99460.htm 刚发这篇文章的时候,因为内容涉及360的核心产品,文章被 ...
随机推荐
- tech blog link
http://amitsaha.github.io/site/notes/index.html
- php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的
原文呢:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict Onl ...
- 进程间通信之-信号signal--linux内核剖析(九)
信号及信号来源 什么是信号 信号是UNIX和Linux系统响应某些条件而产生的一个事件.接收到该信号的进程会对应地採取一些行动.通常信号是由一个错误产生的. 但它们还能够作为进程间通信或修改行为的一种 ...
- 【Objective-C】09-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储不论什么内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针.在没有被详细初始化之前.其值为0. 以下两个都是空 ...
- mysql limit分页优化方法分享
同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是 ...
- linux下提示command not found
首先就要考虑root 的$PATH里是否已经包含了这些环境变量. 主要是这四个:/bin ,/usr/bin,/sbin,/usr/sbin. 四个主要存放的东东: ./bin: bin为binary ...
- hdu4921 Map
给最多10条链.每条链长度最大1000,链上每点有权值,每条链上按顺序,第i个点属于level[i]. 链上后一个点能够选的前提是前面的点都选了. 选择了一些点能够得到的分数是两部分加起来:1.所有点 ...
- SLG, 菱形格子的算法.(递归版
class GeoPoint{ public: int x; int y; public: bool operator == (const GeoPoint& p){ return p.x = ...
- python 2: 解决python中的plot函数的图例legend不能显示中文问题
问题: 图像标题.横纵坐标轴的标签都能显示中文名字,但是图例就是不能显示中文,怎么解决呢? 解决: plt.figure() plt.title(u'训练性能', fontproperties=f ...
- swing_AbstractTableModel 创建表格
import javax.swing.table.AbstractTableModel; public class MyTable extends AbstractTableModel { /** * ...