• 【旧文章搬运】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);
    }

    四行代码搞定~~

  • 相关阅读:
    Blank page instead of the SharePoint Central Administration site
    BizTalk 2010 BAM Configure
    Use ODBA with Visio 2007
    Handling SOAP Exceptions in BizTalk Orchestrations
    BizTalk与WebMethods之间的EDI交换
    Append messages in BizTalk
    FTP protocol commands
    Using Dynamic Maps in BizTalk(From CodeProject)
    Synchronous To Asynchronous Flows Without An Orchestration的简单实现
    WSE3 and "Action for ultimate recipient is required but not present in the message."
  • 原文地址:https://www.cnblogs.com/achillis/p/10181622.html
Copyright © 2020-2023  润新知