• 进程peb结构、获得peb的方法


    PEB :进程环境块
    TEB.ProcessEnvironmentBlock成员就是PEB的结构体地址
    TEB结构体位于FS段选择符所指的段内存的起始地址处,
    且ProcessEnvironmentBlock成员位于距TEB结构体Offset 30的位置
    即有两种方法获得PEB的地址

    peb的结构申明:

    typedef struct _UNICODE_STR
    {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR pBuffer;
    } UNICODE_STR, *PUNICODE_STR;
    
    typedef struct _LDR_DATA_TABLE_ENTRY
    {
        //LIST_ENTRY InLoadOrderLinks; 
        LIST_ENTRY InMemoryOrderModuleList;
        LIST_ENTRY InInitializationOrderModuleList;
        PVOID DllBase;
        PVOID EntryPoint;
        ULONG SizeOfImage;
        UNICODE_STR FullDllName;
        UNICODE_STR BaseDllName;
        ULONG Flags;
        SHORT LoadCount;
        SHORT TlsIndex;
        LIST_ENTRY HashTableEntry;
        ULONG TimeDateStamp;
    } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
    
    typedef struct _PEB_LDR_DATA //, 7 elements, 0x28 bytes
    {
        DWORD dwLength;
        DWORD dwInitialized;
        LPVOID lpSsHandle;
        LIST_ENTRY InLoadOrderModuleList;
        LIST_ENTRY InMemoryOrderModuleList;
        LIST_ENTRY InInitializationOrderModuleList;
        LPVOID lpEntryInProgress;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
    
    typedef struct _PEB_FREE_BLOCK // 2 elements, 0x8 bytes
    {
        struct _PEB_FREE_BLOCK * pNext;
        DWORD dwSize;
    } PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;
    
    typedef struct __PEB // 65 elements, 0x210 bytes
    {
        BYTE bInheritedAddressSpace;
        BYTE bReadImageFileExecOptions;
        BYTE bBeingDebugged;
        BYTE bSpareBool;
        LPVOID lpMutant;
        LPVOID lpImageBaseAddress;
        PPEB_LDR_DATA pLdr;
        LPVOID lpProcessParameters;
        LPVOID lpSubSystemData;
        LPVOID lpProcessHeap;
        PRTL_CRITICAL_SECTION pFastPebLock;
        LPVOID lpFastPebLockRoutine;
        LPVOID lpFastPebUnlockRoutine;
        DWORD dwEnvironmentUpdateCount;
        LPVOID lpKernelCallbackTable;
        DWORD dwSystemReserved;
        DWORD dwAtlThunkSListPtr32;
        PPEB_FREE_BLOCK pFreeList;
        DWORD dwTlsExpansionCounter;
        LPVOID lpTlsBitmap;
        DWORD dwTlsBitmapBits[2];
        LPVOID lpReadOnlySharedMemoryBase;
        LPVOID lpReadOnlySharedMemoryHeap;
        LPVOID lpReadOnlyStaticServerData;
        LPVOID lpAnsiCodePageData;
        LPVOID lpOemCodePageData;
        LPVOID lpUnicodeCaseTableData;
        DWORD dwNumberOfProcessors;
        DWORD dwNtGlobalFlag;
        LARGE_INTEGER liCriticalSectionTimeout;
        DWORD dwHeapSegmentReserve;
        DWORD dwHeapSegmentCommit;
        DWORD dwHeapDeCommitTotalFreeThreshold;
        DWORD dwHeapDeCommitFreeBlockThreshold;
        DWORD dwNumberOfHeaps;
        DWORD dwMaximumNumberOfHeaps;
        LPVOID lpProcessHeaps;
        LPVOID lpGdiSharedHandleTable;
        LPVOID lpProcessStarterHelper;
        DWORD dwGdiDCAttributeList;
        LPVOID lpLoaderLock;
        DWORD dwOSMajorVersion;
        DWORD dwOSMinorVersion;
        WORD wOSBuildNumber;
        WORD wOSCSDVersion;
        DWORD dwOSPlatformId;
        DWORD dwImageSubsystem;
        DWORD dwImageSubsystemMajorVersion;
        DWORD dwImageSubsystemMinorVersion;
        DWORD dwImageProcessAffinityMask;
        DWORD dwGdiHandleBuffer[34];
        LPVOID lpPostProcessInitRoutine;
        LPVOID lpTlsExpansionBitmap;
        DWORD dwTlsExpansionBitmapBits[32];
        DWORD dwSessionId;
        ULARGE_INTEGER liAppCompatFlags;
        ULARGE_INTEGER liAppCompatFlagsUser;
        LPVOID lppShimData;
        LPVOID lpAppCompatInfo;
        UNICODE_STR usCSDVersion;
        LPVOID lpActivationContextData;
        LPVOID lpProcessAssemblyStorageMap;
        LPVOID lpSystemDefaultActivationContextData;
        LPVOID lpSystemAssemblyStorageMap;
        DWORD dwMinimumStackCommit;
    } _PEB, *_PPEB;

    获得PEB:

    #include "Test.h"
    #include <winioctl.h>
    
    int main()
    {
        _PPEB PebBaseAddress = (_PPEB)__readfsdword(0x30);   //FS[0x60]  即x86进程PEB
        int a = GetLastError();
    
        printf_s("PebBaseAddress:0x%x
    ", PebBaseAddress);
    
        PPEB_LDR_DATA pPebLdr = PebBaseAddress->pLdr;
        PLDR_DATA_TABLE_ENTRY pLdrDataHeader = (PLDR_DATA_TABLE_ENTRY)pPebLdr->InMemoryOrderModuleList.Flink;
        PLDR_DATA_TABLE_ENTRY pLdrDataTail = (PLDR_DATA_TABLE_ENTRY)pPebLdr->InMemoryOrderModuleList.Flink;
        printf_s("加载的模块:
    ");
        do
        {
            WCHAR* DllName = pLdrDataHeader->BaseDllName.pBuffer;
            //USHORT usCounter = pLdrDataHeader->BaseDllName.Length;
            pLdrDataHeader = (PLDR_DATA_TABLE_ENTRY)pLdrDataHeader->InMemoryOrderModuleList.Flink;
            printf_s("%S
    ", DllName);
    
        } 
        while (pLdrDataHeader != pLdrDataTail);
        return 0;
    }
  • 相关阅读:
    线程每隔5秒监控一次系统时间
    Struts2框架运行流程及案例
    list转为json
    Workbook读取Excel数据
    testng 接口测试,读取Excel表格数据,做数据驱动2(读取某些固定列数据)
    解析json数据,将json转为实体类
    通过maven命令将jar包放入本地仓库下
    遍历 Object[] [] 数组的值
    testng 接口测试,读取Excel表格数据,做数据驱动1(按照顺序读取Excel数据)
    解析json数据,将json转为Map
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/6395761.html
Copyright © 2020-2023  润新知