首页 > 其他分享 >8.1 TEB与PEB概述

8.1 TEB与PEB概述

时间:2023-09-25 09:13:02浏览次数:38  
标签:8.1 TEB eax 线程 进程 ID PEB

在开始使用TEB/PEB获取进程或线程ID之前,我想有必要解释一下这两个名词,PEB指的是进程环境块(Process Environment Block),用于存储进程状态信息和进程所需的各种数据。每个进程都有一个对应的PEB结构体。TEB指的是线程环境块(Thread Environment Block),用于存储线程状态信息和线程所需的各种数据。每个线程同样都有一个对应的TEB结构体。

PEB中包含了进程的代码、数据段指针、进程的环境变量、进程启动参数信息以及加载的dll信息等。PEB结构体中的FS段寄存器通常被设置为0x30,指向当前进程的PEB结构体。其他进程可以通过访问自己的PEB结构体来获取自己的状态和信息。

TEB中包含了线程的堆栈指针、TLS(线程本地存储)指针、异常处理链表指针、用户模式分页表指针等信息。TEB中的FS段寄存器通常被设置为fs:[0],指向当前线程的TEB结构体。其他线程可以通过访问自己的TEB结构体来获取自己的状态和信息。

在创建进程时,操作系统会为每个线程分配一个TEB(线程环境块),并且该环境块中FS段寄存器总是被设置为fs:[0]的位置上,也就是默认指向当前线程的TEB数据。因此,在进行代码分析时,可以通过通配符来找到TEB结构体的具体名称。

接着我们可通过dt -rv ntdll!_TEB命令,查询ntdll!_TEB结构,如下图所示,我们可以看到偏移为+0x018的位置就是TEB结构头指针,在该地址基础上向下偏移0x30就可以得到PEB(进程环境块)的基地址。

其中+0x000的位置指向了NT_TIB结构,+0x018指向NT_TIB结构TEB自身,+0x020+0x000指向的是当前进程的PID,+0x020+0x004则指向父进程的PPID,+0x030指向了PEB结构体,其他字段读者可自行查阅官方文档;

接着再来验证一下,首先偏移地址0x18是TEB结构基地址,也就是指向自身偏移fs:[0x18]的位置,而!teb地址加0x30正是PEB的位置,在teb的基础上加上0x30就可以得到PEB的基地址,拿到PEB基地址就可以干很多事了。

在线程环境块内,fs:[0x18]定位到TEB(线程环境块),加上0x20得到ClientId,此处存储的就是进程与线程ID的结构位置,通过+0x000可得到UniqueProcess也就是进程PID,通过+0x004可得到UniqueThread也就是线程TID,读者可输入如下所示的命令自行验证;

0:000> dd fs:[0x18]                                  # 找到TEB基地址
0053:00000018  0081e000 00000000 0000139c 0000194c
0053:00000028  00000000 0081e02c 0081b000 00000000

0:000> dt _teb 0081e000 
ntdll!_TEB
   +0x000 NtTib            : _NT_TIB
   +0x01c EnvironmentPointer : (null) 
   +0x020 ClientId         : _CLIENT_ID              # 将TEB+0x20定位到这里(进程与线程信息)
   +0x028 ActiveRpcHandle  : (null) 

0:004> dt _CLIENT_ID 0081e000                        # 查看进程详细结构
ntdll!_CLIENT_ID
   +0x000 UniqueProcess    : 0x00b3f774 Void         # 获取进程PID
   +0x004 UniqueThread     : 0x00b40000 Void         # 获取线程TID

有了上述分析结果那么读者可以很容易的获取到当前自身进程的PID以及TID信息,其完整代码片段如下所示,当读者向GetSelfID()传入1则表示读取PID,否则则读取TID信息;

#include <stdio.h>
#include <Windows.h>

// 传入1获取PID传入0获取TID
DWORD GetSelfID(DWORD isPid)
{
    DWORD ref = 0;

    if (isPid == 1)
    {
        __asm
        {
            mov eax, fs:[0x18]    // 获取到PEB基地址
            add eax, 0x20         // 加上20得到 _CLIENT_ID
            add eax, 0x0          // 加上偏移0得到 UniqueProcess
            mov eax, [eax]        // 取出内存地址中的值
            mov ref, eax
        }
    }
    else
    {
        __asm
        {
            mov eax, fs:[0x18]   // 获取到PEB基地址
            add eax, 0x20        // 加上20得到 _CLIENT_ID
            add eax, 0x04        // 加上偏移04得到 UniqueThread
            mov eax, [eax]       // 取出内存地址中的值
            mov ref, eax
        }
    }
    return ref;
}

int main(int argc, char* argv[])
{
    printf("进程 Pid = %d \n", GetSelfID(1));
    printf("线程 Tid = %d \n", GetSelfID(0));

    system("pause");
    return 0;
}

读者可运行上述代码,并自行打开任务管理器验证是否可以正确获取到,此处执行效果图如下所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/f60a0f6f.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

标签:8.1,TEB,eax,线程,进程,ID,PEB
From: https://www.cnblogs.com/LyShark/p/17727118.html

相关文章

  • flask框架在Centos正常启动后到Windows浏览器访问(http://192.168.124.129:5550/)提示无
    1、flask在centos正常启动 2、然后复制链接到window访问,提示无法访问3、排查下,Linux和Windows互相ping下WindowpingLinuxIP LinuxpingWindowIP如上能够正常ping通,说明网段是正常的4、再排查下,Linux是不是防火墙没有关闭查看防火墙状态命令:systemctlstatusfir......
  • 在jupyter notebook实现代码自动提示
    为什么代码自动提示很重要?在使用JupyterNotebook编写代码时,代码自动提示是一项非常有用的功能。它可以帮助你快速找到函数、方法和变量的名称,提高了代码的编写效率,同时减少了潜在的拼写和语法错误。效果如下:本篇博客将介绍如何在JupyterNotebook中启用和使用代码自动提示功能......
  • QEMU 8.1 正式发布,提升 CPU 性能、支持 LoongArch LSX 扩展
    导读QEMU8.1已正式发布,这是QEMU8.0系列的首个重要更新。主要变化支持IntelGraniteRapids的新x86CPU模型微代码生成器(TinyCodeGenerator,TCG)支持RDPID指令,AES指令可以使用主机处理器上的AES加速,以及其他新功能从支持BF16扩展到Zfa扩展、Z......
  • 【技术研究】线程环境块TEB
    今天继续看逆向工程核心原理,今天看到了TEB,这个部分之前看加密与解密的时候基本上就没看明白,这次打算把环境配置完备,全部都实践一次。首先看到的是TEB结构体TEB结构体成员里面的重要成员有两个_NT_TIBProcessEnvironmentalBlock第二个是个指向结构体的指针第一个是NT_......
  • Jupter Notebook 常用配置
    更改工作路径命令行属于以下命令,生成配置文件。jupyternotebook--generate-config打开提示的jupyter-notebook.config.py文件。一般在:C:\Users\用户名\.jupyter\jupyter-notebook.config.py找到`c.NotebookApp.notebook_dir`这一行,重新复制一行,去掉注释符号#,然后将新的路......
  • 如何在notebook 中使用 @visactor/vchart 显示图表?
    要在JupyterNotebook中使用@visactor/vchart库显示图表,您需要执行以下步骤:安装@visactor/vchart库:如果尚未安装此库,您可以使用npm或yarn进行安装。在终端或命令提示符中运行以下命令之一:使用npm安装:npminstall@visactor/vchart或者使用yarn安装:yarnadd@visactor/vchart导入库......
  • struts2.1.8.1+jquery1.4.2返回json数据
    1、引入包(本文中的包全部引自struts-2.1.8.1\lib):struts2-json-plugin-2.1.8.1.jarjson-lib-2.1.jarcommons-collections-3.2.jarcommons-beanutils-1.7.0.jarcommons-lang-2.3.jarcommons-logging-1.0.4.jarezmorph-1.0.3.jar这7个包是返回json形式的数据必须的。因为jso......
  • Mysql8.0升级到8.1
    1.官网下载8.1版本本次选择的zip的方式,也可选择MSI的方式(MSI文件下载后双击即可安装)   2.备份旧版中的数据库(使用Navicate工具做的备份)命令方式备份数据:mysqldump-uroot-proot-h127.0.0.1-P3306--all-databases>“F:\MySQL\MySQLServer8.0\data\backup.sql”3......
  • Android基础入门教程——8.1.1 Android中的13种Drawable小结 Part 1
    本节引言:从本节开始我们来学习Android中绘图与动画中的一些基础知识,为我们进阶部分的自定义 打下基础!而第一节我们来扣下Android中的Drawable!Android中给我们提供了多达13种的 Drawable,本节我们就来一个个撸一遍!Drawable资源使用注意事项Drawable分为两种: 一种是我们普通的图片......
  • Windows安装MySQL Community Server 8.1.0 Innovation
    检查是否安装按win+r打开运行,输入services.msc回车在服务列表中查找mysql服务,如果存在mysql服务,说明已经安装mysql。反之,则说明没有安装了mysql服务。下载并安装下载链接:https://dev.mysql.com/downloads/mysql/MySQLCommunityServer8.1.0Innovation有msi版本......