• PEB模块链表Ldr


    一、xp下peb结构

    kd> dt _peb
    ntdll!_PEB
       +0x000 InheritedAddressSpace : UChar
       +0x001 ReadImageFileExecOptions : UChar
       +0x002 BeingDebugged    : UChar
       +0x003 SpareBool        : UChar
       +0x004 Mutant           : Ptr32 Void
       +0x008 ImageBaseAddress : Ptr32 Void
       +0x00c Ldr              : Ptr32 _PEB_LDR_DATA        ;进程加载的模块链表
       +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
       +0x014 SubSystemData    : Ptr32 Void
       +0x018 ProcessHeap      : Ptr32 Void
       +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION
       +0x020 FastPebLockRoutine : Ptr32 Void
       +0x024 FastPebUnlockRoutine : Ptr32 Void
       +0x028 EnvironmentUpdateCount : Uint4B
       +0x02c KernelCallbackTable : Ptr32 Void
       +0x030 SystemReserved   : [1] Uint4B
       +0x034 AtlThunkSListPtr32 : Uint4B
       +0x038 FreeList         : Ptr32 _PEB_FREE_BLOCK
       +0x03c TlsExpansionCounter : Uint4B
       +0x040 TlsBitmap        : Ptr32 Void
       +0x044 TlsBitmapBits    : [2] Uint4B
       +0x04c ReadOnlySharedMemoryBase : Ptr32 Void
       +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void
       +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
       +0x058 AnsiCodePageData : Ptr32 Void
       +0x05c OemCodePageData  : Ptr32 Void
       +0x060 UnicodeCaseTableData : Ptr32 Void
       +0x064 NumberOfProcessors : Uint4B
       +0x068 NtGlobalFlag     : Uint4B
       +0x070 CriticalSectionTimeout : _LARGE_INTEGER
       +0x078 HeapSegmentReserve : Uint4B
       +0x07c HeapSegmentCommit : Uint4B
       +0x080 HeapDeCommitTotalFreeThreshold : Uint4B
       +0x084 HeapDeCommitFreeBlockThreshold : Uint4B
       +0x088 NumberOfHeaps    : Uint4B
       +0x08c MaximumNumberOfHeaps : Uint4B
       +0x090 ProcessHeaps     : Ptr32 Ptr32 Void
       +0x094 GdiSharedHandleTable : Ptr32 Void
       +0x098 ProcessStarterHelper : Ptr32 Void
       +0x09c GdiDCAttributeList : Uint4B
       +0x0a0 LoaderLock       : Ptr32 Void
       +0x0a4 OSMajorVersion   : Uint4B
       +0x0a8 OSMinorVersion   : Uint4B
       +0x0ac OSBuildNumber    : Uint2B
       +0x0ae OSCSDVersion     : Uint2B
       +0x0b0 OSPlatformId     : Uint4B
       +0x0b4 ImageSubsystem   : Uint4B
       +0x0b8 ImageSubsystemMajorVersion : Uint4B
       +0x0bc ImageSubsystemMinorVersion : Uint4B
       +0x0c0 ImageProcessAffinityMask : Uint4B
       +0x0c4 GdiHandleBuffer  : [34] Uint4B
       +0x14c PostProcessInitRoutine : Ptr32     void
       +0x150 TlsExpansionBitmap : Ptr32 Void
       +0x154 TlsExpansionBitmapBits : [32] Uint4B
       +0x1d4 SessionId        : Uint4B
       +0x1d8 AppCompatFlags   : _ULARGE_INTEGER
       +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER
       +0x1e8 pShimData        : Ptr32 Void
       +0x1ec AppCompatInfo    : Ptr32 Void
       +0x1f0 CSDVersion       : _UNICODE_STRING
       +0x1f8 ActivationContextData : Ptr32 Void
       +0x1fc ProcessAssemblyStorageMap : Ptr32 Void
       +0x200 SystemDefaultActivationContextData : Ptr32 Void
       +0x204 SystemAssemblyStorageMap : Ptr32 Void
       +0x208 MinimumStackCommit : Uint4B

     二、模块链表

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

    kd> dt _peb_ldr_data
    ntdll!_PEB_LDR_DATA
       +0x000 Length           : Uint4B
       +0x004 Initialized      : UChar
       +0x008 SsHandle         : Ptr32 Void
       +0x00c InLoadOrderModuleList : _LIST_ENTRY
       +0x014 InMemoryOrderModuleList : _LIST_ENTRY
       +0x01c InInitializationOrderModuleList : _LIST_ENTRY
       +0x024 EntryInProgress  : Ptr32 Void

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

    kd> dt _ldr_data_table_entry
    ntdll!_LDR_DATA_TABLE_ENTRY
       +0x000 InLoadOrderLinks : _LIST_ENTRY
       +0x008 InMemoryOrderLinks : _LIST_ENTRY
       +0x010 InInitializationOrderLinks : _LIST_ENTRY
       +0x018 DllBase          : Ptr32 Void
       +0x01c EntryPoint       : Ptr32 Void
       +0x020 SizeOfImage      : Uint4B
       +0x024 FullDllName      : _UNICODE_STRING
       +0x02c BaseDllName      : _UNICODE_STRING
       +0x034 Flags            : Uint4B
       +0x038 LoadCount        : Uint2B
       +0x03a TlsIndex         : Uint2B
       +0x03c HashLinks        : _LIST_ENTRY
       +0x03c SectionPointer   : Ptr32 Void
       +0x040 CheckSum         : Uint4B
       +0x044 TimeDateStamp    : Uint4B
       +0x044 LoadedImports    : Ptr32 Void
       +0x048 EntryPointActivationContext : Ptr32 Void
       +0x04c PatchInformation : Ptr32 Void

    三、模块链表图解

    四、核心代码

      MOV EAX, DWORD PTR FS:[30] ;获取PEB基址 

    MOV EAX, DWORD PTR DS:[EAX+C] ;获取PEB_LDR_DATA结构指针 
    MOV ESI, DWORD PTR DS:[EAX+1C] ;获取InInitializationOrderModuleList成员指针 
    LODS DWORD PTR DS:[ESI] ;获取双向链表当前节点的后继指针 
    MOV EBX, DWORD PTR DS:[EAX+8] ;取其基地址,该结构当前包含的是kernel32.dll
  • 相关阅读:
    WINCE/WM5.0如何让安装完后自动运行程序
    Android 图片透明度处理代码
    windows mobile UI 自定义开始菜单图标
    Windows mobile 6捕获键盘操作
    HTTP的post和get总结
    提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
    Windows Mobile 中ComboBox【下拉列表】的使用
    注册表修改今日桌面左右软键的功能
    .net compact framework 注册表操作
    两种实现Toast 的例子(图片&文字)
  • 原文地址:https://www.cnblogs.com/guanlaiy/p/2494501.html
Copyright © 2020-2023  润新知