本文在主主要以上述两篇文章为基础,对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结构----枚举用户模块列表

    参考文章: 1.   http://blog.csdn.net/ayken/archive/2...3/1509027.aspx 2.   http://icwin.net/ShowArtitle.A ...

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

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

  3. 4.PEB断链隐藏模块

    0x4 PEB断链隐藏模块 1.如何找到_PEB_LDR_DATA 由_TEB找到_PEB,_PEB偏移0xC找到_PEB_LDR_DATA 2.基础知识 _LDR_DATA_TABLE_ENTRY结 ...

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

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

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

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

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

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

  7. 第三章 模块定义图:模块

    第三章 模块定义图 1. 模块 1.1 结构特性 1.1.1 约束属性 1.1.2 端口 1.2 行为特性 1.2.1 操作 1.2.2 接收   在BDD中出现的元素叫做定义元素.定义元素形成了其它 ...

  8. 阿里百秀项目之用户模块

    项目介绍 整个项目分为两大部分:内容管理和内容展示. 技术栈: 数据层:mongDB 服务层:node.js(express) 客户端:art-template.jQuery.font-awesome ...

  9. 宇贸电商二期-用户模块开发(一)

    Hello,大家好,我是Steafan_,在宇贸电商二期的上篇博文中,我们对宇贸电商二期的项目架构做了整体的演进与实操,并且对宇贸一期中的一些功能做了改进,针对电商平台该有的功能点呢,我们对宇贸二期的 ...

最新文章

  1. 从人工到机器智能,盗版监测在 AI 时代如何破局?
  2. 防止页面被iframe包含进去
  3. LinkedHashSet集合
  4. Java Spring Beans.xml里的Bean定义是如何被解析出来的
  5. 封装log4cp p
  6. 阿里云弹性计算负责人蒋林泉:亿级场景驱动的技术自研之路
  7. [Python] itertools.islice(iterable, start, stop[, step]) 创建迭代器并返回所选元素
  8. 访问oracle数据库语句,Oracle数据库SQL ——Select 语句使用方法
  9. 电容的耐压值选择---陶瓷电容、钽电容、电解电容
  10. QCC3040---芯片数据手册 ADK release data sheet
  11. Android:Content has been consumed
  12. html如何改变图片比例,如何更改图片像素和大小
  13. svg图片在vue项目中的应用
  14. html中账号绑定怎么做,绑定账号.html
  15. 【PP-2】定义生产调度员
  16. **软件包xx没有可安装候选**
  17. 计算机绘图实训体会,CAD实习心得体会
  18. 里氏代换原则(The Liskov Substitution Principle)
  19. ESP8266模块使用完整教程
  20. 在线调试摄像头 网页测试摄像头

热门文章

  1. iPhone音乐软件Jam:美国版“唱吧”
  2. 对RCS数据进行预处理
  3. 【LeetCode】【OO Design】 Elevator
  4. com.badlogic.gdx.utils.SerializationException: Error parsing XML on line 1 near
  5. python常见加密方式总结踩坑小贴士
  6. 十分钟开发物联网:烟雾感应监测(Wifi版)
  7. win7开启uasp协议_UASP与USB模式切换工具
  8. w ndows无法与设备或资源,windows无法与设备或资源通信怎么办?
  9. WIndows下cmd报错退出进程,代码为1
  10. 最小二乘法在ISP CCM标定中的简介