• 32位 64位 获得进程peb的方法


    PEB.H
    
    #pragma once
    
    #include <Windows.h>
    #include <Strsafe.h>
    #include <wchar.h>
    #include <vector>
    
    
    #define NT_SUCCESS(x) ((x) >= 0)
    
    #define ProcessBasicInformation 0
    typedef
    NTSTATUS(WINAPI *pfnNtWow64QueryInformationProcess64)
    (HANDLE ProcessHandle, UINT32 ProcessInformationClass,
        PVOID ProcessInformation, UINT32 ProcessInformationLength,
        UINT32* ReturnLength);
    
    typedef
    NTSTATUS(WINAPI *pfnNtWow64ReadVirtualMemory64)
    (HANDLE ProcessHandle, PVOID64 BaseAddress,
        PVOID BufferData, UINT64 BufferLength,
        PUINT64 ReturnLength);
    
    typedef
    NTSTATUS(WINAPI *pfnNtQueryInformationProcess)
    (HANDLE ProcessHandle, ULONG ProcessInformationClass,
        PVOID ProcessInformation, UINT32 ProcessInformationLength,
        UINT32* ReturnLength);
    
    template <typename T>
    struct _UNICODE_STRING_T
    {
        WORD Length;
        WORD MaximumLength;
        T Buffer;
    };
    
    template <typename T>
    struct _LIST_ENTRY_T
    {
        T Flink;
        T Blink;
    };
    
    template <typename T, typename NGF, int A>
    struct _PEB_T
    {
        typedef T type;
    
        union
        {
            struct
            {
                BYTE InheritedAddressSpace;
                BYTE ReadImageFileExecOptions;
                BYTE BeingDebugged;
                BYTE BitField;
            };
            T dummy01;
        };
        T Mutant;
        T ImageBaseAddress;
        T Ldr;
        T ProcessParameters;
        T SubSystemData;
        T ProcessHeap;
        T FastPebLock;
        T AtlThunkSListPtr;
        T IFEOKey;
        T CrossProcessFlags;
        T UserSharedInfoPtr;
        DWORD SystemReserved;
        DWORD AtlThunkSListPtr32;
        T ApiSetMap;
        T TlsExpansionCounter;
        T TlsBitmap;
        DWORD TlsBitmapBits[2];
        T ReadOnlySharedMemoryBase;
        T HotpatchInformation;
        T ReadOnlyStaticServerData;
        T AnsiCodePageData;
        T OemCodePageData;
        T UnicodeCaseTableData;
        DWORD NumberOfProcessors;
        union
        {
            DWORD NtGlobalFlag;
            NGF dummy02;
        };
        LARGE_INTEGER CriticalSectionTimeout;
        T HeapSegmentReserve;
        T HeapSegmentCommit;
        T HeapDeCommitTotalFreeThreshold;
        T HeapDeCommitFreeBlockThreshold;
        DWORD NumberOfHeaps;
        DWORD MaximumNumberOfHeaps;
        T ProcessHeaps;
        T GdiSharedHandleTable;
        T ProcessStarterHelper;
        T GdiDCAttributeList;
        T LoaderLock;
        DWORD OSMajorVersion;
        DWORD OSMinorVersion;
        WORD OSBuildNumber;
        WORD OSCSDVersion;
        DWORD OSPlatformId;
        DWORD ImageSubsystem;
        DWORD ImageSubsystemMajorVersion;
        T ImageSubsystemMinorVersion;
        T ActiveProcessAffinityMask;
        T GdiHandleBuffer[A];
        T PostProcessInitRoutine;
        T TlsExpansionBitmap;
        DWORD TlsExpansionBitmapBits[32];
        T SessionId;
        ULARGE_INTEGER AppCompatFlags;
        ULARGE_INTEGER AppCompatFlagsUser;
        T pShimData;
        T AppCompatInfo;
        _UNICODE_STRING_T<T> CSDVersion;
        T ActivationContextData;
        T ProcessAssemblyStorageMap;
        T SystemDefaultActivationContextData;
        T SystemAssemblyStorageMap;
        T MinimumStackCommit;
        T FlsCallback;
        _LIST_ENTRY_T<T> FlsListHead;
        T FlsBitmap;
        DWORD FlsBitmapBits[4];
        T FlsHighIndex;
        T WerRegistrationData;
        T WerShipAssertPtr;
        T pContextData;
        T pImageHeaderHash;
        T TracingFlags;
        T CsrServerReadOnlySharedMemoryBase;
    };
    
    typedef _PEB_T<DWORD, DWORD64, 34> _PEB32;
    typedef _PEB_T<DWORD64, DWORD, 30> _PEB64;
    
    typedef struct _STRING_32
    {
        WORD Length;
        WORD MaximumLength;
        UINT32 Buffer;
    } STRING32, *PSTRING32;
    
    typedef struct _STRING_64
    {
        WORD Length;
        WORD MaximumLength;
        UINT64 Buffer;
    } STRING64, *PSTRING64;
    
    typedef struct _RTL_DRIVE_LETTER_CURDIR_32
    {
        WORD Flags;
        WORD Length;
        ULONG TimeStamp;
        STRING32 DosPath;
    } RTL_DRIVE_LETTER_CURDIR32, *PRTL_DRIVE_LETTER_CURDIR32;
    
    typedef struct _RTL_DRIVE_LETTER_CURDIR_64
    {
        WORD Flags;
        WORD Length;
        ULONG TimeStamp;
        STRING64 DosPath;
    } RTL_DRIVE_LETTER_CURDIR64, *PRTL_DRIVE_LETTER_CURDIR64;
    
    typedef struct _UNICODE_STRING_32
    {
        WORD Length;
        WORD MaximumLength;
        UINT32 Buffer;
    } UNICODE_STRING32, *PUNICODE_STRING32;
    
    typedef struct _UNICODE_STRING_64
    {
        WORD Length;
        WORD MaximumLength;
        UINT64 Buffer;
    } UNICODE_STRING64, *PUNICODE_STRING64;
    
    
    typedef struct _CURDIR_32
    {
        UNICODE_STRING32 DosPath;
        UINT32 Handle;
    } CURDIR32, *PCURDIR32;
    
    typedef struct _RTL_USER_PROCESS_PARAMETERS_32
    {
        ULONG MaximumLength;
        ULONG Length;
        ULONG Flags;
        ULONG DebugFlags;
        UINT32 ConsoleHandle;
        ULONG ConsoleFlags;
        UINT32 StandardInput;
        UINT32 StandardOutput;
        UINT32 StandardError;
        CURDIR32 CurrentDirectory;
        UNICODE_STRING32 DllPath;
        UNICODE_STRING32 ImagePathName;
        UNICODE_STRING32 CommandLine;
        UINT32 Environment;
        ULONG StartingX;
        ULONG StartingY;
        ULONG CountX;
        ULONG CountY;
        ULONG CountCharsX;
        ULONG CountCharsY;
        ULONG FillAttribute;
        ULONG WindowFlags;
        ULONG ShowWindowFlags;
        UNICODE_STRING32 WindowTitle;
        UNICODE_STRING32 DesktopInfo;
        UNICODE_STRING32 ShellInfo;
        UNICODE_STRING32 RuntimeData;
        RTL_DRIVE_LETTER_CURDIR32 CurrentDirectores[32];
        ULONG EnvironmentSize;
    } RTL_USER_PROCESS_PARAMETERS32, *PRTL_USER_PROCESS_PARAMETERS32;
    
    
    typedef struct _CURDIR_64
    {
        UNICODE_STRING64 DosPath;
        UINT64 Handle;
    } CURDIR64, *PCURDIR64;
    
    typedef struct _RTL_USER_PROCESS_PARAMETERS_64
    {
        ULONG MaximumLength;
        ULONG Length;
        ULONG Flags;
        ULONG DebugFlags;
        UINT64 ConsoleHandle;
        ULONG ConsoleFlags;
        UINT64 StandardInput;
        UINT64 StandardOutput;
        UINT64 StandardError;
        CURDIR64 CurrentDirectory;
        UNICODE_STRING64 DllPath;
        UNICODE_STRING64 ImagePathName;
        UNICODE_STRING64 CommandLine;
        UINT64 Environment;
        ULONG StartingX;
        ULONG StartingY;
        ULONG CountX;
        ULONG CountY;
        ULONG CountCharsX;
        ULONG CountCharsY;
        ULONG FillAttribute;
        ULONG WindowFlags;
        ULONG ShowWindowFlags;
        UNICODE_STRING64 WindowTitle;
        UNICODE_STRING64 DesktopInfo;
        UNICODE_STRING64 ShellInfo;
        UNICODE_STRING64 RuntimeData;
        RTL_DRIVE_LETTER_CURDIR64 CurrentDirectores[32];
        ULONG EnvironmentSize;
    } RTL_USER_PROCESS_PARAMETERS64, *PRTL_USER_PROCESS_PARAMETERS64;
    
    
    
    typedef struct _PROCESS_BASIC_INFORMATION64 {
        NTSTATUS ExitStatus;
        UINT32 Reserved0;
        UINT64 PebBaseAddress;
        UINT64 AffinityMask;
        UINT32 BasePriority;
        UINT32 Reserved1;
        UINT64 UniqueProcessId;
        UINT64 InheritedFromUniqueProcessId;
    } PROCESS_BASIC_INFORMATION64;
    
    typedef struct _PROCESS_BASIC_INFORMATION32 {
        NTSTATUS ExitStatus;
        UINT32 PebBaseAddress;
        UINT32 AffinityMask;
        UINT32 BasePriority;
        UINT32 UniqueProcessId;
        UINT32 InheritedFromUniqueProcessId;
    } PROCESS_BASIC_INFORMATION32;
    

      

    PEB.C
    
    // 枚举PEB.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "PEB.h"
    #include <iostream>
    
    using namespace std;
    
    
    
    
    
    int main()
    {
        HANDLE m_ProcessHandle;
        int PID;
        cout << "输入PID:";
        cin >> PID;
    
        m_ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    
        BOOL bSource = FALSE;
        BOOL bTarget = FALSE;
        //判断自己的位数
        IsWow64Process(GetCurrentProcess(), &bSource);
        //判断目标的位数
        IsWow64Process(m_ProcessHandle, &bTarget);
    
        if(bTarget == FALSE && bSource == TRUE)
        {
            HMODULE NtdllModule = GetModuleHandle(L"ntdll.dll");
            pfnNtWow64QueryInformationProcess64 NtWow64QueryInformationProcess64 = (pfnNtWow64QueryInformationProcess64)GetProcAddress(NtdllModule, "NtWow64QueryInformationProcess64");
            pfnNtWow64ReadVirtualMemory64 NtWow64ReadVirtualMemory64 = (pfnNtWow64ReadVirtualMemory64)GetProcAddress(NtdllModule, "NtWow64ReadVirtualMemory64");
    
            PROCESS_BASIC_INFORMATION64 pbi = { 0 };
            UINT64 ReturnLength = 0;
    
            NTSTATUS Status = NtWow64QueryInformationProcess64(m_ProcessHandle, ProcessBasicInformation, &pbi, (UINT32)sizeof(pbi), (UINT32*)&ReturnLength);
    
            if (NT_SUCCESS(Status))
            {
    
                _PEB64* Peb = (_PEB64*)malloc(sizeof(_PEB64));
                RTL_USER_PROCESS_PARAMETERS64* ProcessParameters = (RTL_USER_PROCESS_PARAMETERS64*)malloc(sizeof(RTL_USER_PROCESS_PARAMETERS64));
                Status = NtWow64ReadVirtualMemory64(m_ProcessHandle, (PVOID64)pbi.PebBaseAddress,
                    (_PEB64*)Peb, sizeof(_PEB64), &ReturnLength);
    
    
                cout << "PebBaseAddress:" << hex << pbi.PebBaseAddress << endl;
                cout << "Ldr:" << hex << Peb->Ldr << endl;
                cout << "ImageBaseAddress:" << hex << Peb->ImageBaseAddress << endl;
            }
        }
    
        //自己是32  目标是32
        else if (bTarget == TRUE && bSource == TRUE)
        {
            HMODULE NtdllModule = GetModuleHandle(L"ntdll.dll");
            pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(NtdllModule,
                "NtQueryInformationProcess");
            PROCESS_BASIC_INFORMATION32 pbi = { 0 };
            UINT32  ReturnLength = 0;
            NTSTATUS Status = NtQueryInformationProcess(m_ProcessHandle,
                ProcessBasicInformation, &pbi, (UINT32)sizeof(pbi), (UINT32*)&ReturnLength);
            if (NT_SUCCESS(Status))
            {
                _PEB32* Peb = (_PEB32*)malloc(sizeof(_PEB32));
                ReadProcessMemory(m_ProcessHandle, (PVOID)pbi.PebBaseAddress, (_PEB32*)Peb, sizeof(_PEB32), NULL);
                printf("PEB:%x
    ", pbi.PebBaseAddress);
                printf("LdrAddress:%x
    ", ((_PEB32*)Peb)->Ldr);
                printf("ImageBaseAddress:%x
    ", ((_PEB32*)Peb)->ImageBaseAddress);
            }
        }
    
        
            
    
        return 0;
    }
    

      

  • 相关阅读:
    Java DES 测试
    HttpClient3.1 警告: Cookie rejected:
    WebService实现文件上传下载
    使用dom4j生成xml字符串,以及解析xml字符串
    Java 单例总结
    weblogic使用脚本部署
    Java比较两个日期的大小
    Ubuntu14.04 weblogic11g集群环境测试
    Gson 禁止特殊字符转码
    只用CSS做到完全居中
  • 原文地址:https://www.cnblogs.com/testvt/p/11832226.html
Copyright © 2020-2023  润新知