枚举PspCidTable利用API

转载 2011年01月19日 10:32:00

看Windows内核情景分析的时候看到讲PspCidTable中会保存每个进程和线程的CID,就在想可以通过这个表来获取到每个进程的PID及相关信息,然后网上一搜,已经有N多人通过这种方法来获取进程列表了,Iceword也是有这种方法来枚举进程的。Anyway,还是自己实现一遍吧。当然也借鉴了别人的代码。

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
    HANDLE h;
   
    DbgPrint("DriverEntry/n");
    DriverObject->DriverUnload = DrvUnload;
   
   
    ExEnumHandleTable = (EXENUMHANDLETABLE)GetFunctionAddr(L"ExEnumHandleTable");
    if(ExEnumHandleTable == NULL )
    {
        DbgPrint("Get ExEnumHandleTable Address Error/n");
        return STATUS_SUCCESS;
    }
    DbgPrint("Address of ExEnumHandleTable:%x/n", ExEnumHandleTable);
   
    GetPspCidTable();
    DbgPrint("CidTable:%x/n", pPspCidTable);
   
    ExEnumHandleTable(pPspCidTable, ExEnumHandleCallBack, NULL, &h);
   
    return STATUS_SUCCESS;
}void GetPspCidTable( )
{
    PUCHAR cPtr;
    DWORD PsAddr = GetFunctionAddr(L"PsLookupProcessByProcessId");
   
    for(cPtr = (PUCHAR)PsAddr;
        cPtr < (PUCHAR)PsAddr + PAGE_SIZE; cPtr++)
    {
        if(*(PUSHORT)cPtr == 0x35FF)
        {
            pPspCidTable = **(PVOID**)(cPtr+2);
            break;
        }
    }
}BOOLEAN ExEnumHandleCallBack(PHANDLE_TABLE_ENTRY HandleTableEntry, HANDLE Handle, PVOID EnumParameter)
{
    NTSTATUS ntStatus;
    HANDLE Cid;
    PEPROCESS Process;
    ULONG uTableCount;
    ULONG uTablePage = 0;
   
    if(EnumParameter == HandleTableEntry)
    {
        return TRUE;
    }
    else
    {
        for(uTableCount = 0; uTableCount < 0x1000; uTableCount++)
        {
            if(HandleTableEntry->Object)
            {
                Cid = (HANDLE)((1024*uTablePage)+(uTableCount<<2));
                if(Cid > (PVOID)4)
                {
                    ntStatus = PsLookupProcessByProcessId(Cid, &Process);
                    if(NT_SUCCESS(ntStatus))
                    {
                        DbgPrint("PID:%4d/tProcess Name:%-16s/n",
                            Cid, ((PUCHAR)Process+EPROC_NAME_OFFSET));
                        ObDereferenceObject(Process);
                    }
                }
                else
                {
                    if(Cid == 0)
                    {
                        DbgPrint("PID:%4d/tProcess Name:Idle/n", 0);
                    }
                    else
                    {
                        DbgPrint("PID:%4d/tProcess Name:System/n", 4);
                    }
                }
            }
        }
        uTablePage++;
        return TRUE;
    }
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/strongxu/archive/2009/12/07/4959757.aspx

相关文章推荐

(Win7) PspCidTable遍历进程句柄表,枚举进程

本文出自悠然品鉴小悠,转载请注明出处http://www.youranshare.com/blog/sid/102.html 先说一下句柄表是什么 在windows内核中定义了很多内核对象,像文件对...

枚举系统进程api的使用

  • 2010年03月25日 13:28
  • 28KB
  • 下载

C/C++ Windows API——枚举进程、结束进程及提升权限

// EnumProcessDemo.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include #include //CreateToolhelp32S...

bcb利用NETBIOS枚举MAC地址

  • 2006年02月23日 09:05
  • 620KB
  • 下载

使用API中的函数:NetUserEnum来枚举用户 NetUserGetInfo来获取用户的信息

使用API中的函数:NetUserEnum来枚举用户;NetUserGetInfo来获取用户的信息. 思路应该是这样的。 以下为Windows Conlse Appilication下的枚举所有用户...

使用Setup API枚举系统设备

#pragma comment(lib, "Setupapi.lib") #pragma comment(lib, "shlwapi.lib") #include "stdafx.h" ...

数据结构与算法_枚举(穷举)算法

  • 2017年11月14日 23:03
  • 20.2MB
  • 下载

枚举java基础知识点

  • 2017年11月03日 12:39
  • 27KB
  • 下载

Java 利用枚举实现单例模式

引言单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。Java枚举基本用法枚举的用法比较多,本文主要旨在介绍利用枚举实现单...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:枚举PspCidTable利用API
举报原因:
原因补充:

(最多只允许输入30个字)