首页
社区
课程
招聘
[已解决]如何由PEB获得Kernel32.dll的内存基地址?
发表于: 2010-7-5 16:03 4037

[已解决]如何由PEB获得Kernel32.dll的内存基地址?

2010-7-5 16:03
4037
原文是这样的
一般应用程序最先加载的是NTDLL。dll和kernel32.dll,peb+0x0c获得PEB_LDR_DATA的地址,PEB_LDR_DATA + 0X1C处存放着指向模块初始化链表InInitializationOrderModuleList的头指针,第一个链表节点是ntdll.dll,第二个链表的节点就是Kernel32.dll,+0x08获得kernel32的内存基地址

自己用WINDBG 查看
lkd>  dt _PEB_LDR_DATA 0x7ffdc000
nt!_PEB_LDR_DATA
   +0x000 Length           : 0x111ffdc
   +0x004 Initialized      : 0 ''
   +0x008 SsHandle         : 0x0111e000
   +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x0 - 0x1e00 ]
   +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x0 - 0x7ffdc000 ]
   +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x0 - 0xbb4 ]
   +0x024 EntryInProgress  : 0x00000c90
原来是这个。。。。
第二部分: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;

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//