通过PEB获取模块基址
来源:互联网 发布:java 生成邀请码 编辑:程序博客网 时间:2024/05/14 02:32
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;
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
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;
获取模块的基址代码
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);}
0 0
- 通过PEB获取模块基址
- 通过PEB->LDR_DATA结构获取模块基址
- 搜索PEB结构获取Kernel32.dll基址
- 获取模块句柄/基址
- 内核程序中通过KPCR获取内核模块基址
- 搜索PEB的相关结构获取Kernel32.DLL的基址
- PEB中获取指定名称的DLL的基址
- peb获取kernel32基址,用第一和第二种
- 枚举PEB获取进程模块列表
- 从PEB获取内存中模块列表
- ios获取内存镜像模块基址
- 通过TopStack方法获取kernel基址简介
- 通过驱动名字获取驱动基址和大小
- 通过读写PEB.Ldr实现模块枚举和模块隐藏(脱链)
- 获取当前进程的模块句柄(获取当前模块的基址)
- PEB结构的获取
- 通过TEB/PEB枚举当前进程空间中用户模块列表
- 通过TEB/PEB枚举当前进程空间中用户模块列表
- C++第14周项目模板【项目3-数组类模板】
- Android代码混淆踩过的那些坑
- 栈的实现 -- 顺序栈和链式栈(C++描述)
- Mac上如果看不到.git目录的解决方法
- 意图与逻辑 —— C 语言
- 通过PEB获取模块基址
- Linux下的代码代码复制和转移方案(FTP配置)
- 触碰十年后的自己(2026年)
- 使用HTTP协议访问网络
- jquery绑定事件
- openjudge 弟弟的作业
- Hive与HBase实现数据互导
- HDU 2083 简易版之最短距离(快排)
- 算法系列(二)查找算法--基本查找和二分查找