zoukankan      html  css  js  c++  java
  • 获取PEB

    参考链接:http://www.cnblogs.com/HsinTsao/p/6399459.html

    自己感觉这个方法不行

    // GetProcessPEB.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <Windows.h>
    #include <Strsafe.h>
    #include <wchar.h>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    #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;
    VOID GetProcessByID(ULONG_PTR ProcessID)
    {
        HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
        LPBYTE BufferData = (LPBYTE)LocalAlloc(LPTR, 1024);       //暂时分配一下缓冲区
        CHAR* Environment = NULL;
        CHAR* CommandLine = NULL;
        UINT EnvironmentLength = 0;
        UINT CommandLineLength = 0;
        BOOL IsWow64 = FALSE;
        BOOL MyProcessIsWow64 = FALSE;
        IsWow64Process(ProcessHandle, &IsWow64);
        IsWow64Process(GetCurrentProcess(), &MyProcessIsWow64);
        if (IsWow64 == FALSE && MyProcessIsWow64 == 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(GetCurrentProcess(), 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(GetCurrentProcess(), (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 (IsWow64 == TRUE && MyProcessIsWow64 == TRUE)
        {
            HMODULE NtdllModule = GetModuleHandle(L"ntdll.dll");
            pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(NtdllModule,
                "NtQueryInformationProcess");
            PROCESS_BASIC_INFORMATION32 pbi = { 0 };
            UINT32  ReturnLength = 0;
            NTSTATUS Status = NtQueryInformationProcess(GetCurrentProcess(),
                ProcessBasicInformation, &pbi, (UINT32)sizeof(pbi), (UINT32*)&ReturnLength);
            if (NT_SUCCESS(Status))
            {
                _PEB32* Peb = (_PEB32*)malloc(sizeof(_PEB32));
                ReadProcessMemory(GetCurrentProcess(), (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);
            }
        }
    
    }
    int main()
    {
        int ProcessID = 0;
        while (cin >> ProcessID)
    //    cin >> ProcessID;
        GetProcessByID(ProcessID);
        return 0;
    }
    爱程序 不爱bug 爱生活 不爱黑眼圈 我和你们一样 我和你们不一样 我不是凡客 我要做geek
  • 相关阅读:
    小总结
    使用Bind提供域名解析服务(正向解析)
    在虚拟机上的NFS网络文件系统
    在虚拟机上的FTP FTP访问模式(虚拟用户模式)
    在虚拟机上的FTP FTP访问模式(本地用户模式)
    在虚拟机上的FTP,FTP访问模式(匿名)
    在虚拟机上的关于Apache(阿帕奇)(5)基于端口访问网站
    在虚拟机上的关于Apache(阿帕奇)(4)基于域名访问网站
    在虚拟机上的关于Apache(阿帕奇)(3)基于IP访问网站
    在虚拟机上的关于Apache(阿帕奇)(2)开启个人用户主页功能
  • 原文地址:https://www.cnblogs.com/yifi/p/6526341.html
Copyright © 2011-2022 走看看