• PEB结构学习


    一、什么是PEB结构(Process Envirorment Block Structure)

        英文翻译过来就是进程环境信息块,这里包含了一写进程的信息。我接触到这个东西主要是在研究软件的保护技术的时候,有种保护技术会检测是否有调试器正在调试保护软件,然后需要获取是否被调试的消息,这个消息存储在PEB结构中.

    二、PEB结构(可以去msdn官网查看原文)

        msdn地址:https://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx

        可以看到PEB的结构如下图。

    typedef struct _PEB {
      BYTE                          Reserved1[2];
      BYTE                          BeingDebugged; //被调试状态
      BYTE                          Reserved2[1];
      PVOID                         Reserved3[2];
      PPEB_LDR_DATA                 Ldr;
      PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
      BYTE                          Reserved4[104];
      PVOID                         Reserved5[52];
      PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
      BYTE                          Reserved6[128];
      PVOID                         Reserved7[1];
      ULONG                         SessionId;
    } PEB, *PPEB;

       我们看到有很多的保留字,保留字我们不用去管,那个是留给系统处理的。所以一共只有4个关键字需要了解。

           第一个,BYTE BeingDebugged //,这里就是记录程序的调试状态的,(1代表被调试,0代表没有被调试)

    我们可以使用 BOOL WINAPI IsDebuggerPresent(void);这个函数来检测是否有调试器存在,返回非0值代表被调试,如果返回0代表没有被调试。

           我们可以写一个小程序来实验一下。

    #include <iostream>
    #include <vector>
    #include <string>
    #include <windows.h>
    
    int main(int argc, char *argv[]) {
        bool status;
        status = IsDebuggerPresent();
        if (status) {
            MessageBox(nullptr, "Detecting debugger", "Find Debugger", MB_OK);
        }
        else {
            MessageBox(nullptr, "Not detect debugger", "No Debugger", MB_OK);
        }
        return 0;
    }

    处于被调试状态:

          没有调试的:

    76A9A720 64 A1 30 00 00 00    mov         eax,dword ptr fs:[00000030h]  //获取PEB结构基地址
    76A9A726 0F B6 40 02          movzx       eax,byte ptr [eax+2]                       //根据PEB结构,我们知道是取
    76A9A72A C3                   ret  

        

    我们现在继续观察这个程序,调试跟踪一下。PEB结构在TEB结构的0x30偏移的地方,也就是fs:[0x30]处可以取到PEB的基地址。

    观察汇编代码,https://en.wikipedia.org/wiki/Win32_Thread_Information_Block, 这里可以看到PEB的偏移地址

    76A9A720 64 A1 30 00 00 00    mov         eax,dword ptr fs:[00000030h]  //获取PEB结构基地址
    76A9A726 0F B6 40 02          movzx       eax,byte ptr [eax+2]        //根据PEB结构,我们知道这里是获取BeingDebugged的值
    76A9A72A C3 ret  //程序返回

    我们看一下程序调用IsDebuggerPresent()函数的汇编代码,然后一步步跟踪,就会发现PEB的地址,观察它在内存中的数据

    然后看程序得到PEB的地址

    然后我们观看一下这个内存中的数据,就可以看到PEB结构的数据了。

    可以看到第3个字节,也就是BeingDebug为1,代表被调试,其他的数据也可以分析了,但是这里就分析到这里了,其他的结构有时间会继续分析的。

    最后,我们可以使用内嵌asm语言来获得PEB结构的值,如下图,没有调试,获得beingdebug的值。

    好了,就分析到这里了。

  • 相关阅读:
    WINNER队成立(第二天)
    新学期组队合作
    构建之法第8、9、10章
    第一阶段冲刺(第一天)
    作业六:小学生四则运算之NABCD模型与产品Backlog。
    构建之法第六章、第七章观后感
    四则运算,测试与封装。
    使用Webpack4 搭建React项目
    算法一小时--希尔排序
    算法一小时-插入排序
  • 原文地址:https://www.cnblogs.com/binlmmhc/p/6501545.html
Copyright © 2020-2023  润新知