我是靠谱客的博主 敏感滑板,最近开发中收集的这篇文章主要介绍枚举进程——PspCidTable zz,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

http://blog.csdn.net/strongxu/article/details/4959757

看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;
    }
}

最后

以上就是敏感滑板为你收集整理的枚举进程——PspCidTable zz的全部内容,希望文章能够帮你解决枚举进程——PspCidTable zz所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部