【旧文章搬运】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      : 1
    +0x002 MajorVersion      : 1
    +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+34
nt!_KAPC_STATE
    +0x000 ApcListHead       : [2] _LIST_ENTRY [ 0x80561c54 - 0x80561c54 ]
    +0x010 Process           : 0x80561e80 _KPROCESS  //这个就是Idle进程了
    +0x014 KernelApcInProgress : 0 ‘‘
    +0x015 KernelApcPending : 0 ‘‘
    +0x016 UserApcPending    : 0 ‘‘

获取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);
}

四行代码搞定~~

原文地址:https://www.cnblogs.com/achillis/p/10181622.html

时间: 2024-10-08 10:12:14

【旧文章搬运】Idle进程相关的一些东西的相关文章

【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录

原文发表于百度空间,2008-7-24 当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了========================================================================== 先从分析PEB开始吧.感觉分析这个东西,首先要把类型定义搞清楚,这个在Windbg里dt _PEB就可以了搞清楚定义主要是为了定位相关变量的偏移.PEB中的ProcessParameters部分就是进程的参数了,里面就有我们感兴

【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程

原文发表于百度空间,2008-7-25========================================================================== 前面对PEB的相关结构和其中的重要成员进行了分析和学习,现在开始真正进入内核,学习内核中的一些结构.这个EPROCESS结构在ntddk.h中有定义,但是并未给出具体的结构,因此要得到EPROCESS中一些重要的成员变量,只能通过偏移的方法,比如PID,ImageName等.这些偏移可以在Windbg中dt _

【旧文章搬运】ZwQuerySystemInformation枚举进线程信息

原文发表于百度空间,2008-10-15========================================================================== 很古老的东西了,写一写,权当练手吧.本来以为没什么难度,很科普很傻瓜的东西,但是写的时候还是遇到一些问题,进程信息正确,得到的线程信息总是不正确,后来分析了一下,发现这个ntdll sdk中定义的进程信息结构和线程信息结构都有点问题,可能它是来自<Win2000 Native API>一书,不适用于Wind

【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误

原文发表于百度空间,2008-12-03========================================================================== 今天写程序,用ZwQuerySystemInformation枚举系统中的文件句柄时出了问题,死活一个都找不到,可是这明显不可能啊?于是用Process Explorer随便找了个文件句柄对象,然后看了它的OBJECT_TYPE,才发现文件句柄的类型索引应为28,而我用的是炉子给的那个SYSTEM_HANDL

【旧文章搬运】ZwQuerySystemInformation枚举内核模块及简单应用

原文发表于百度空间,2008-10-24========================================================================== 简单说,即调用第11号功能,枚举一下内核中已加载的模块.部分代码如下://功能号为11,先获取所需的缓冲区大小ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&needlen);//申请内存ZwAllocateVirtualMemory(NtCu

【旧文章搬运】分析了一下360安全卫士的HOOK

原文发表于百度空间及看雪论坛,2009-10-08 看雪论坛地址:https://bbs.pediy.com/thread-99128.htm 看时间,09年的国庆节基本上就搞这玩意儿了...========================================================================== 分析了一下360的HOOK,通过直接hook KiFastCallEntry实现对所有系统调用的过滤. 我分析的版本如下:主程序版本: 6.0.1.1003H

【旧文章搬运】Windows中全局钩子DLL的加载过程

原文发表于百度空间,2011-03-24========================================================================== 看雪上别人问的一个问题,顺便在此记录下吧~~ kd> kvn # ChildEBP RetAddr Args to Child 00 0012f7b8 77d2dbfb 0012f81c 00000000 00000008 kernel32!LoadLibraryExW+0x2 (FPO: [Non-Fpo]

Linux如何创建idle进程

关于idle进程 也就是pid=0的进程.它是内核完成初始化后所创建的第一个进程,在系统空闲时执行.它的代码很简单: for(;;) pause(): 强调一下,idle进程是用户态进程.那么问题来了,内核从启动到初始化过程总都处在内核态,那么内核是怎么创    建idle并且切换到用户态呢? 一种很直接简单的想法是,内核直接调用用户空间的代码实现内核态到用户态的转换,但是这是不可能的,因为规 不能这么做.那怎么办呢?这就是这篇文章要讲的问题. 进程相关的结构 进程是一个动态的概念,要管理进程首

Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的创建 前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) * idle进程由系统自动创建, 运行在内核态 idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_t