• 进程的本质


    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
    ", (PUCHAR)p + 0x174);
            p = MACRO_GetNextProcess(p);
        } while (p != Process);
    
    }

      2)_KPROCESS+0x88 双向链表

        struct _LIST_ENTRY ActiveProcessLinks;                                  //0x88

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

        

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

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

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

        

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

        

  • 相关阅读:
    linux下后台执行shell脚本nohup
    notepad++常用命令
    dmidecode查看硬件信息
    CSV文件自动化(自定义参数)
    服务器数据恢复案例分享-硬盘掉线恢复
    DELL EqualLogic PS6100存储硬盘坏道数据恢复
    成功恢复某服务器丢失数据过程
    分析Linux raid6同步成raid5导致数据丢失的情况
    服务器RAID硬盘离线和数据库损坏数据恢复方法
    chkdsk 后数据丢失的恢复方法
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12701135.html
Copyright © 2020-2023  润新知