参考文章:
1.   http://blog.csdn.net/ayken/archive/2...3/1509027.aspx
2.   http://icwin.net/ShowArtitle.ASP?art_id=6315&cat_id=39

本文在主主要以上述两篇文章为基础,对PEB的结构进行了详细的分析,重点是在揭示PEB结构中的list—entry的应用,并且以C语言Code进行实证。

本文主要分为四个部分,第一部分说明PEB地址如何获得;第二部分说明PEB的框架结构;第三部对PEB中的List-Entry结构进行了详细剖析,第四部分给出了枚举用户模块列表的代码。

--------------------------------------------------------------------------------------------------------------
第一部分:PEB地址的取得

1.1原理:FS段寄存器指向当前的TEB结构,在TEB偏移0x30处是PEB指针,通过这个指针即可取得PEB的地址。
1.2实现方法:
__asm
{
mov eax,fs:[0x30]
mov PEB,eax
}
--------------------------------------------------------------------------------------------------------------
第二部分:PEB的框架结构

在PEB中的0x0c处为一指针,指向PEB_LDR_DATA结构,
在PEB_LDR_DATA的0x0c,0x14,0x1c中为三个LIST_ENTRY,在struct _LDR_MODULE的0x00,0x08和0x10处是三个对应的同名称的LIST_ENTRY, PEB_LDR_DATA和struct _LDR_MODULE就是通过这三个LIST_ENTRY对应连接起来的。

2.1 struct _PEB结构:
typedef struct _PEB { // Size: 0x1D8
/*000*/ UCHAR InheritedAddressSpace;
/*001*/ UCHAR ReadImageFileExecOptions;
/*002*/ UCHAR BeingDebugged;
/*003*/ UCHAR SpareBool; // Allocation size
/*004*/ HANDLE Mutant;
/*008*/ HINSTANCE ImageBaseAddress; // Instance
/*00C*/ VOID *DllList;
/*010*/ PPROCESS_PARAMETERS *ProcessParameters;
/*014*/ ULONG SubSystemData;
/*018*/ HANDLE DefaultHeap;
/*01C*/ KSPIN_LOCK FastPebLock;
/*020*/ ULONG FastPebLockRoutine;
/*024*/ ULONG FastPebUnlockRoutine;
/*028*/ ULONG EnvironmentUpdateCount;
/*02C*/ ULONG KernelCallbackTable;
/*030*/ LARGE_INTEGER SystemReserved;
/*038*/ ULONG FreeList;
/*03C*/ ULONG TlsExpansionCounter;
/*040*/ ULONG TlsBitmap;
/*044*/ LARGE_INTEGER TlsBitmapBits;
/*04C*/ ULONG ReadOnlySharedMemoryBase;
/*050*/ ULONG ReadOnlySharedMemoryHeap;
/*054*/ ULONG ReadOnlyStaticServerData;
/*058*/ ULONG AnsiCodePageData;
/*05C*/ ULONG OemCodePageData;
/*060*/ ULONG UnicodeCaseTableData;
/*064*/ ULONG NumberOfProcessors;
/*068*/ LARGE_INTEGER NtGlobalFlag; // Address of a local copy
/*070*/ LARGE_INTEGER CriticalSectionTimeout;
/*078*/ ULONG HeapSegmentReserve;
/*07C*/ ULONG HeapSegmentCommit;
/*080*/ ULONG HeapDeCommitTotalFreeThreshold;
/*084*/ ULONG HeapDeCommitFreeBlockThreshold;
/*088*/ ULONG NumberOfHeaps;
/*08C*/ ULONG MaximumNumberOfHeaps;
/*090*/ ULONG ProcessHeaps;
/*094*/ ULONG GdiSharedHandleTable;
/*098*/ ULONG ProcessStarterHelper;
/*09C*/ ULONG GdiDCAttributeList;
/*0A0*/ KSPIN_LOCK LoaderLock;
/*0A4*/ ULONG OSMajorVersion;
/*0A8*/ ULONG OSMinorVersion;
/*0AC*/ USHORT OSBuildNumber;
/*0AE*/ USHORT OSCSDVersion;
/*0B0*/ ULONG OSPlatformId;
/*0B4*/ ULONG ImageSubsystem;
/*0B8*/ ULONG ImageSubsystemMajorVersion;
/*0BC*/ ULONG ImageSubsystemMinorVersion;
/*0C0*/ ULONG ImageProcessAffinityMask;
/*0C4*/ ULONG GdiHandleBuffer[0x22];
/*14C*/ ULONG PostProcessInitRoutine;
/*150*/ ULONG TlsExpansionBitmap;
/*154*/ UCHAR TlsExpansionBitmapBits[0x80];
/*1D4*/ ULONG SessionId;
} PEB, *PPEB;

2.2  PEB_LDR_DATA结构
typedef struct _PEB_LDR_DATA
{
 ULONG Length; // +0x00
 BOOLEAN Initialized; // +0x04
 PVOID SsHandle; // +0x08
 LIST_ENTRY InLoadOrderModuleList; // +0x0c
 LIST_ENTRY InMemoryOrderModuleList; // +0x14
 LIST_ENTRY InInitializationOrderModuleList;// +0x1c
} PEB_LDR_DATA,*PPEB_LDR_DATA; // +0x24

2.3  struct _LDR_MODULE结构
-typedef struct _LDR_MODULE
-{
-    LIST_ENTRY          InLoadOrderModuleList;   +0x00
-    LIST_ENTRY          InMemoryOrderModuleList; +0x08  
-    LIST_ENTRY          InInitializationOrderModuleList; +0x10
-    void*               BaseAddress;  +0x18
-    void*               EntryPoint;   +0x1c
-    ULONG               SizeOfImage;
-    UNICODE_STRING      FullDllName;
-    UNICODE_STRING      BaseDllName;
-    ULONG               Flags;
-    SHORT               LoadCount;
-    SHORT               TlsIndex;
-    HANDLE              SectionHandle;
-    ULONG               CheckSum;
-    ULONG               TimeDateStamp;
-} LDR_MODULE, *PLDR_MODULE;

--------------------------------------------------------------------------------------------------------------
第三部分:List-Entry链接

PEB_LDR_DATA结构的最后三项跟struct _LDR_MODULE结构的前三项是一样的List-Entry链接,InLoadOrderModuleList,InMemoryOrderModuleList,和InInitializationOrderModuleList,但是这两个结构是怎样链接起来的呢?

其实,着两个结果中的三个List-Entry是共用的,如下图所示:


--------------------------------------------------------------------------------------------------------------
第四部分:代码实现:
4.1程枚举用户模块列表时,可以通过以下步骤实现:
a.  从fs:[30h]获取PEB地址
b.   从PEB[0x0c]获取Ldr地址
c.   从Ldr[0x0c]获取InLoadOrderModuleList.Flink/
InMemoryOrderModuleList/InInitializationOrderModuleList
d.  从InLoadOrderModuleList.Flink/
InMemoryOrderModuleList.Flink/InInitializationOrderModuleList.Flink开始前向遍历循环链表
e.  显示LDR_MODULE结构的BaseAddress、FullDllName成员。

4.2以下为取得InLoadOrderModuleList列表的code

#include "stdafx.h"
#include "windows.h"
#include "winsvc.h"

int _tmain(int argc, _TCHAR* argv[])
{
  void *PEB = NULL,
    *Ldr = NULL,
    *Flink = NULL,
    *p = NULL,
    *BaseAddress = NULL,
    *FullDllName = NULL;

__asm
  {
    mov eax,fs:[0x30]
    mov PEB,eax
  }
  Ldr = *( ( void ** )( ( unsigned char * )PEB+0x0c ) );
  Flink = *( ( void ** )( ( unsigned char * )Ldr+ 0x0c ) );
  p = Flink;
  do
  {
    BaseAddress = *( ( void ** )( ( unsigned char * )p+ 0x18 ) );
    FullDllName = *( ( void ** )( ( unsigned char * )p+ 0x28 ) );
    wprintf(L"FullDllName is %s/n",FullDllName);
    printf("BaseAddress is %x/n",BaseAddress);
    p = *( ( void ** )p);
  }
  while ( Flink != p );
  return 0;
}
4.3以下为取得InMemoryOrderModuleList列表的code
#include "stdafx.h"
#include "windows.h"
#include "winsvc.h"

int _tmain(int argc, _TCHAR* argv[])
{
  void *PEB = NULL,
    *Ldr = NULL,
    *Flink = NULL,
    *p = NULL,
    *BaseAddress = NULL,
    *FullDllName = NULL;

__asm
  {
    mov eax,fs:[0x30]
    mov PEB,eax
  }
  Ldr = *( ( void ** )( ( unsigned char * )PEB+0x0c ) );
  Flink = *( ( void ** )( ( unsigned char * )Ldr+ 0x14 ) );
  p = Flink;
  do
  {
    BaseAddress = *( ( void ** )( ( unsigned char * )p+ 0x10 ) );
    FullDllName = *( ( void ** )( ( unsigned char * )p+ 0x20 ) );
    wprintf(L"FullDllName is %s/n",FullDllName);
    printf("BaseAddress is %x/n",BaseAddress);
    p = *( ( void ** )p);
  }
  while ( Flink != p );
  return 0;
}

4.4以下为取得InInitializationOrderModuleList列表的code
#include "stdafx.h"
#include "windows.h"
#include "winsvc.h"

int _tmain(int argc, _TCHAR* argv[])
{
  void *PEB = NULL,
    *Ldr = NULL,
    *Flink = NULL,
    *p = NULL,
    *BaseAddress = NULL,
    *FullDllName = NULL;

__asm
  {
    mov eax,fs:[0x30]
    mov PEB,eax
  }
  Ldr = *( ( void ** )( ( unsigned char * )PEB+0x0c ) );
  Flink = *( ( void ** )( ( unsigned char * )Ldr+ 0x1c ) );
  p = Flink;
  do
  {
    BaseAddress = *( ( void ** )( ( unsigned char * )p+ 0x08 ) );
    FullDllName = *( ( void ** )( ( unsigned char * )p+ 0x18) );
    wprintf(L"FullDllName is %s/n",FullDllName);
    printf("BaseAddress is %x/n",BaseAddress);
    p = *( ( void ** )p);
  }
  while ( Flink != p );
  return 0;
}

PEB结构----枚举用户模块列表相关推荐

  1. PEB结构----枚举用户模块列表(图)

    本文在主主要以上述两篇文章为基础,对PEB的结构进行了详细的分析,重点是在揭示PEB结构中的list-entry的应用,并且以C语言Code进行实证. 本文主要分为四个部分,第一部分说明PEB地址如何 ...

  2. 博客项目(一):API说明文档、用户模块、短信模块、支付模块

    文章目录 一.概述: 二.事件定义: 2.1 注册 2.2 登陆 2.3 修改个人信息 三.开发规范: 3.1 后端环境 3.2 通信协议 3.3 通信格式 3.4 API规范 四.用户模块 4.1 ...

  3. 《MySQL数据库用户模块需求分析》

    用户模块数据库设计数据库逻辑结构设计(将E-R图转表结构)数据库物理结构设计(将表结构转为sql代码)编写SQL代码创建用户模块的三个实体用户 Token 持有者约束说明:用于保证数据的完整性1)主键 ...

  4. 电商生鲜网站开发(二)——后台开发:用户模块

    电商生鲜网站开发(二)--后台开发:用户模块 文章目录 电商生鲜网站开发(二)--后台开发:用户模块 接口设计 开发任务与知识点 案例:注册接口 统一处理异常 Java异常体系 案例:登录接口 接口设 ...

  5. 电商千万用户 mysql设计_Mysql电商设计用户模块 一

    项目结构 用户模块 商品模块 订单模块 仓配模块 常见问题 数据插入异常 数据更新异常 数据删除异常 数据冗余 数据库设计范式 第一范式 第二范式 第三范式 数据库设计的最低要求要满足第三范式的要求 ...

  6. NET使用ABP框架搭建博客项目(二) 用户模块

    首先我们先来设计下用户模块,简单用户模块设计涵盖两个类,用户表以及角色表.如下图: 我们在Core项目中增加一个文件夹Domain,在Domain增加Customers文件夹,添加一个枚举Passwo ...

  7. 处理程序“WebServiceHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 500.21 - Internal Server Error 处理程序"WebServiceHandlerFactory-Integrated"在其模块列表中有一个 ...

  8. 电子商务(电销)平台中用户模块(User)数据库设计明细

    原文:电子商务(电销)平台中用户模块(User)数据库设计明细 以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 用户基础表(user_ba ...

  9. 使用Maven开发用户模块的CRUD(增删改查)

    使用Maven开发用户模块的CRUD(增删改查) < 使用Maven开发Web应用Archiva服务器的搭建步骤 > C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据 ...

最新文章

  1. 帮朋友招一个IM开发人员
  2. 第22条:理解NSCopying 协议
  3. oracle 显示格式化
  4. Python中安装模块的方法
  5. webpack 读取文件夹下的文件_TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建...
  6. OSError: Could not find kaggle.json
  7. 华为云技术开放日(第三季)话题介绍和直播群入口
  8. 鼠标双击检测_雷蛇巴塞利斯蛇无线游戏鼠标评测:青出于蓝胜于蓝
  9. Java内存溢出的情况
  10. 权重衰减(基于线性回归)
  11. catia 二次开发:获得投影视图
  12. wingdings字体符号在哪_Wingdings特殊字符及符號對照表 | 學步園
  13. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
  14. 云文件共享服务器,云文件共享服务器
  15. python 恶搞(仿粽子写的)
  16. 一米OA漏洞学习——getfile.jsp 任意文件读取漏洞
  17. Pr 电影开场帷幕拉开效果和轨道遮罩的应用
  18. MYSQL数据库⾯试题
  19. ubuntu下如何查看和设置分辨率
  20. 最优化方法一:微分求极值

热门文章

  1. SQL Server 存储过程定时转存数据
  2. windows服务器查看型号,Windows服务器查看内存型号
  3. 【复杂网络社团发现】GN算法边介数详解
  4. 慕课嵌入式系统(第九章.ucos-ii操作系统实验)
  5. 全自动量化交易软件的使用程序?
  6. 【NOMA】Resource Allocation for Multi-UAV Aided IoT NOMA Uplink Transmission Systems
  7. Python通过PyPDF2给pdf加密,权限分析
  8. Android文件夹占用空间分析,关于Android中图片大小、内存占用和drawable文件夹研究分析...
  9. OPPO|后端工程师|一面 二面| 远程牛客面试 | 凉经 (2021/08/19 | 2021/09/01)
  10. 微波炉定时c语言程序,微波炉定时器—微波炉定时器与微波炉原理