zoukankan      html  css  js  c++  java
  • 【旧文章搬运】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
    ",IdleProcess);
    }

    四行代码搞定~~

  • 相关阅读:
    maven项目启动报错
    maven环境变量配置
    jdk版本升级 eclipse启动失败
    jdk10 环境变量配置
    Invalid bound statement 无效的绑定 的解决办法!
    【Java】-NO.16.EBook.4.Java.1.004-【疯狂Java讲义第3版 李刚】- 内部类
    【Java】-NO.14.Java.4.Java.1.001-【Java JUnit 5 】-
    【Java】-NO.13.Java.1.Foundation.1.001-【Java IO】-
    【设计模式】用追MM来解释23种设计模式,转
    【Linux】-NO.8.Linux.4.Command.1.001-【Common Command】-
  • 原文地址:https://www.cnblogs.com/achillis/p/10181622.html
Copyright © 2011-2022 走看看