TEB偏移0x30处,即FS:[0x30]地址处保存着一个指针,指向PEB,PEB结构的偏移0xC处保存着另外一个指针ldr,该指针执行PEB_LDR_DATA

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;  //_PEB_LDR_DATA        ;进程加载的模块链表
/*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;

PEB_LDR_DATA结构

typedef struct _PEB_LDR_DATA
{ULONG Length; // +0x00BOOLEAN Initialized; // +0x04PVOID SsHandle; // +0x08LIST_ENTRY InLoadOrderModuleList; // +0x0cLIST_ENTRY InMemoryOrderModuleList; // +0x14LIST_ENTRY InInitializationOrderModuleList;// +0x1c
} PEB_LDR_DATA,*PPEB_LDR_DATA; // +0x24

该结构的后三个成员是指向LDR_MODULE链表结构中相应三条双向链表头的指针,分别是按照加载顺序、在内存中地址顺序和初始化顺序排列的模块信息结构的指针。LDR_MODULE结构,其实就是_LDR_DATA_TABLE_ENTRY结构

LDR_DATA_TABLE_ENTRY 结构

typedef struct _LDR_DATA_TABLE_ENTRY
{  LIST_ENTRY InLoadOrderLinks;  LIST_ENTRY InMemoryOrderLinks;  LIST_ENTRY InInitializationOrderLinks;  PVOID DllBase;  PVOID EntryPoint;  DWORD SizeOfImage;  UNICODE_STRING FullDllName;  UNICODE_STRING BaseDllName;  DWORD Flags;  WORD LoadCount;  WORD TlsIndex;  LIST_ENTRY HashLinks;  PVOID SectionPointer;  DWORD CheckSum;  DWORD TimeDateStamp;  PVOID LoadedImports;  PVOID EntryPointActivationContext;  PVOID PatchInformation;
}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;  

LIST_ENTRY结构

typedef struct _LIST_ENTRY
{struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;

获取模块的基址代码

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

通过PEB获取模块基址相关推荐

  1. linux下获取模块基址,通过DT_DEBUG来获得各个库的基址

    最近,在学习BCTF和0CTF的writeup时,注意到了一种通过DT_DEBUG来获得库的基址的方式:BCTF里的pattern用这一方法来获得ld-linux.so的地址,0CTF里的sandbo ...

  2. GetModuleHandle(NULL)获取当前DLL模块基址?

    做一项目想在DLL内部代码实现获取本DLL的模块基址,而且不知道本DLL名称 最简单的方法是想到GetModuleHandle(NULL),是否可以呢? 参看http://blog.csdn.net/ ...

  3. 易语言python模块_Python获取指定模块基址

    image 因为昨天研究FPS游戏时候,发现有个动态地址每次重启电脑都会不同,然后因为有过用C和易语言编写指定模块名获取基址的经验,所以打算用Python来试试 在网上搜索了一点资料,发现有吾爱有一篇 ...

  4. Windows10 x64 获取PEB表,并获取ntdll基址

    1.Windows通过TEB封装信息,TEB中包含PEB表,如图: (站在看雪大佬巨人的肩膀上才能看得更远) 具体过程是从teb->peb->ldr->InInitializatio ...

  5. Python 获取指定模块基址

    因为昨天研究FPS游戏时候,发现有个动态地址每次重启电脑都会不同,然后因为有过用C和易语言编写指定模块名获取基址的经验,所以打算用Python来试试 在网上搜索了一点资料,发现有吾爱有一篇是使用Pyt ...

  6. Python Pymem 游戏内存基址读取修改 - 获取游戏DLL模块基址

    运行环境 python3.9.0 - 64位 安装pymem pip install pymem Pymem 的文档 https://pymem.readthedocs.io/en/latest/ 读 ...

  7. Metasploit AFP信息获取模块afp_server_info

    Metasploit AFP信息获取模块afp_server_info AFP服务默认端口为548或者427.通过扫描该端口信息,afp_server_info模块可以获取AFP服务相关信息.这些信息 ...

  8. Windows获取模块基地址

    获取模块的基地址有如下几种方法: 1. 模块句柄就是模块基地址(或称模块加载地址),直接将模块句柄转换为模块基地址 2. 根据模块中的地址得到模块句柄,模块句柄就是基地址 GetModuleHandl ...

  9. 获取linux内核基址,LInux内核如何获取段基址和段长度

    引题: 0.11内核版本代码在do_exit函数中需要获取段的基址和长度 free_page_tables (get_base (current->ldt[1]), get_limit (0x0 ...

最新文章

  1. TCP/IP总结(4)TCP之4次挥手
  2. Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】
  3. 视频播放问题和提高性能方案
  4. oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...
  5. php类知识 self $this都只能在当前类中使用
  6. 忘记commit也会造成select查询的性能问题
  7. 【Qt教程】2.6 - Qt5 自定义控件封装
  8. react18并发渲染
  9. 【java学习之路】(java SE篇)003.java SE基础语法之数组
  10. HQL –Hibernate查询语言–示例教程
  11. 韩顺平Java学习 面向对象【高级】(笔记)
  12. u盘被写保护了无法格式化怎么办?
  13. 三维激光雷达点云处理发展趋势
  14. mysql多张表join_mysql多表联查join优化之 straight_join
  15. 不会聊天的程序员,如何开发聊天机器人
  16. Linux命令提示行设置--SP1
  17. 纯前端实现xls表格下载
  18. Mac (M1) 官网安装 Tomcat,XAMPP,MySQL
  19. dw中html文档命名标准,dw中的css是什么意思?
  20. Symbian S60 5th 切换程序UI方向为横屏或竖屏

热门文章

  1. NR 5G UE和5G网络功能之间的安全流程
  2. Kubernetes + CRI + Kata + Firecracker
  3. PAT A1030 动态规划
  4. Constraint4:default约束
  5. 1、Cocos2dx 3.0游戏开发三找一小块前言
  6. mysql 配置路径
  7. addslashes 及 其他 清除空格的方法是不安全的
  8. 对于技术 方法 生活等问题的思考
  9. 在centos7中如何搭建局域网yum源仓库
  10. 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误