遍历PEB结构

在进行脱壳练习的时候,遇到了这方面的难题,遂,研究了一下:大概的遍历过程如下:
首先,我们要知道,32位的程序和64位程序的区别:那就是32位的程序TEB以及PEB都在fs段里边,而64位程序的TEB和PEB都在gs段里边,这是非常重要的:好接下来步入正题:
首先我们来看一下TEB的结构:
遍历PEB结构_第1张图片
接下来我们可以来看一下PEB的具体结构:(那么怎么从TEB到PEB结构呢?我们从刚才那张图可以看到,PEB是TEB里边偏移量为0x30的元素,也就是说TEB偏移0X30得到的就是PEB的地址)
遍历PEB结构_第2张图片
(当然PEB结构和TEB结构里边不仅仅有这些元素,还有其他元素。)
汇编代码:mov eax DWORD ptr fs:[0x30]
同时我们要看一下PEB结构的地址,方便以后使用:
遍历PEB结构_第3张图片
在Custem2.exe中,我们采用的是第三个门来进行遍历的,这里我们也采用初始化的方式进行遍历:
Ldr的结构如下:
遍历PEB结构_第4张图片
_LIST_ENTRY的结构如下图所示:
在这里插入图片描述
在偏移处的_LIST_ENTRY的结构:
在这里插入图片描述
遍历PEB:
遍历PEB结构_第5张图片
可以看到第一个模块是ntdll.dll模块,注意命令,之所以要减去0x10是为了,移动指针到结构体顶端,防止,模块信息显示错误:如下图;
遍历PEB结构_第6张图片
继续遍历:
遍历PEB结构_第7张图片
遍历了第三次的时候,到达我们这次旅行的终点:KERNELL32.dll。
在实际的程序运行过程中,大多数情况下加壳的程序都会有这样的程序,因为它要这样来找它所需要的模块里边的函数,找到函数之后再去调用。
就先写成这样,如果有写错的希望大家可以指正,互相学习,谢谢

你可能感兴趣的:(遍历PEB结构)