博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PEB结构学习
阅读量:7235 次
发布时间:2019-06-29

本文共 2408 字,大约阅读时间需要 8 分钟。

一、什么是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 
#include
#include
#include
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的值。

 

好了,就分析到这里了。

转载于:https://www.cnblogs.com/binlmmhc/p/6501545.html

你可能感兴趣的文章
透视Facebook算法帝国 ,我们只是工程思维的螺丝钉
查看>>
IPv4的消逝之路将漫长而缓慢
查看>>
论数据库运维的全流程管控技术
查看>>
打造"数据供应链"百分点发布大数据战略
查看>>
Relay2携边缘计算产品参加中国移动盛会
查看>>
Linux 64位操作系统安装配置java
查看>>
苹果进军印度市场到底有多难 连财政部长都不帮忙
查看>>
监控摄像机选型攻略之技术类型选用
查看>>
JAVA笔记——序列化
查看>>
《数据科学:R语言实现》——3.1 引言
查看>>
协作软件的前景、进展以及阵痛
查看>>
PyTorch 和 TensorFlow 哪个更好?看一线开发者怎么说
查看>>
怎么善于发现seo网站优化的问题?
查看>>
《Metasploit渗透测试手册》—第8章8.1节介绍
查看>>
《UG NX8.0中文版完全自学手册》一1.4 工具栏的定制
查看>>
合三为一,Linux 基金会欲打造顶级开源峰会
查看>>
《计算机系统:系统架构与操作系统的高度集成》——2.8 编译函数调用
查看>>
不要成为工具的奴隶
查看>>
IO多路复用之select/poll/epoll总结
查看>>
菜鸟Vue学习笔记(一)
查看>>