进程的本质

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

进程的本质

1. 进程的本质

2. _EPROCESS的重要数据结构

3. 保护进程

4. _PEB+0x10 _RTL_USER_PROCESS_PARAMETERS 分析

5.几个比较重要的知识点:

 

1. 进程的本质

  该结构有两种:微内核(KPROCESS)/执行体(EPROCESS)。

  其中执行体包含着微内核这个结构(有过之前基础很好理解)。

  进程的本质

 

 

2. _EPROCESS的重要数据结构

 +0x000 Header 可等待对象

  +0x018 DirectoryTable 页目录表基址(进程最重要的地址)

  +0x038 KernelTime 该进程在零环运行的时间

  +0x03c UserTime 该进程在三环用到的时间

  +0x05c Affinity 规定进程里的线程可以在哪个CPU跑(详细细节查询)

  +0x062 BasePriority 该进程中的所有线程中最起始的优先级

  +0x078 CreateTime 当前进程的创建时间

  +0x078 ExitTime 当前进程的退出时间

  +0x084 UniqueProcessId 进程编号,进程管理器的编号

  +0x088 ActiveProcessLink 当前系统活动进程的编号(进程管理器就是查找该链表)

  +0x090 QuotaUsage  / +0x09c QuotaPeak 物理页统计的相关信息

  +0x0a8 CommitCharge / +0x0ac PeakVirtualSize / +0x0b0 VirtualSize 虚拟内存相关的统计信息

  +0x11c VadRoot 标识0-2G哪些地址被占用了

  +0x0bc DebugPort / +0x0c0ExceptionPort 调试相关

  +0x0c4 ObjectTable 句柄表

  +0x174 ImageFileName 进程镜像文件名(最多16个字节)

  +0x1a0 ActiveThreads 活动线程的数量

  +0x1b0 PEB 在三环描述了相关信息

 

3. 保护进程

  CreateProcessA 其中存在一个参数 CREATE_PROTECTED_PROCESS,该参数保护进程。

  比如在最新Win10操作系统,当你远线程注入计算机等系统进程时会失败,原因就是其开启了这个进程保护。

  进程的本质

 

   在内核层直接修改其进程的有关标志位即可解决。

 

4. _PEB+0x10 _RTL_USER_PROCESS_PARAMETERS 分析

  其包含进程的各种信息,比如用户加载DLL的路径、用户启动参数、窗口标题等各种信息。

  这里存在一种反调试,如果正常启动不会带参数,但如果OD启动,肯定会附带参数,我们可以通过检查这个参数来判断是否处于被调试状态。

  进程的本质

 

5.几个比较重要的知识点:

  1)_KPROCESS+0x174 进程名称

    注意,其是UCHAR[16]直接是16个字节,而不是一个指向字符串的指针,因此我们在输出时直接 pEprocess+0x174即可,而不是 *(pEprocess+0x174),前期不注意很容易犯错。

// 遍历全部进程获取名称
VOID TraverseList() {
    PEPROCESS Process;
    ULONG pId = PsGetCurrentProcessId(); // 得到当前进程的id
    PsLookupProcessByProcessId(pId, &Process); // 获取EPROCESS结构体
    PEPROCESS p = Process;
    do {
        DbgPrint("进程名:%s\r\n", (PUCHAR)p + 0x174);
        p = MACRO_GetNextProcess(p);
    } while (p != Process);

}

  2)_KPROCESS+0x88 双向链表

    struct _LIST_ENTRY ActiveProcessLinks;                                  //0x88

    我们通过这条线路可以找到所有的驱动,当然,我们可以通过将这条链断开而达到驱动隐藏的效果,其效果如下

    进程的本质

 

  3)_KPROCESS+0xbc  DebugPort清零反调试

    之后的调试体系会讲到被调试进程通过DebugPort与调试器建立关系,简单的可以看一下这里《软件调试》。

    我们可以通过编写驱动将该位清零,这样我们可以达到反调试目的,效果如下:

    进程的本质

     可以看到即使打开之后,也没有其信息,过一段时间就可以看到被调试程序并没有反应,询问是否继续调试。

    进程的本质

进程的本质

上一篇:【iOS】被忽略的main函数


下一篇:虚拟机VMware正在使用中 - 解决办法