原文发表于百度空间,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);
}

四行代码搞定~~

最新文章

  1. jQuery -原生 如何互转
  2. Spring知识点提炼
  3. PHP优化笔记
  4. android手动修改density(dpi)的方法
  5. linux 的useradd 命令的p选项
  6. 常用的网络配置命令 ifconfig 所在的包
  7. unity, 颜色随高度渐变shader
  8. Aptana Studio 快捷键
  9. DEV 打印gridcontrl
  10. Linux:crontab的安装以及使用方法
  11. head和tail命令-----得到头尾N行或者这去掉尾头N/N-1行
  12. 配置VLAN
  13. php 命令行参数
  14. libdl.so 动态库加载、查找
  15. SDRAM---页读写
  16. UVa 536 Tree Recovery(二叉树后序遍历)
  17. windows下安装ubuntu
  18. .gitignore文件如何编写?
  19. Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效
  20. 第二章:Internet地址结构

热门文章

  1. jquery+css实现邮箱自动补全
  2. js时间戳和时间格式之间的转换
  3. 391. Perfect Rectangle
  4. Dubbo和Spring集成Demo
  5. BUPT复试专题—统计字母(2008)
  6. Solidworks如何显示装饰螺纹线
  7. 怎么下载google商店的扩展程序?
  8. C#中Queue<T>类的使用以及部分方法的源代码分析
  9. ubuntu 16.04 更新后搜狗输入法无法输入中文的问题
  10. ISC DHCP: Enterprise grade solution for configuration needs