#pragma once #include "../Include/Winheaders.h" #include "../Include/Types.h" #include "../Include/Macro.h" #include #include #include #include #include namespace blackbone { enum CreateThreadFlags { NoThreadFlags = 0x0000, CreateSuspended = 0x0001, NoDllCallbacks = 0x0002, HideFromDebug = 0x0004, }; ENUM_OPS(CreateThreadFlags) class Native { public: BLACKBONE_API Native( HANDLE hProcess, bool x86OS = false ); BLACKBONE_API ~Native(); BLACKBONE_API inline const Wow64Barrier& GetWow64Barrier() const { return _wowBarrier; } /// /// Allocate virtual memory /// /// Allocation address /// Region size /// Allocation type /// Memory protection /// Status code virtual NTSTATUS VirtualAllocExT( ptr_t& lpAddress, size_t dwSize, DWORD flAllocationType, DWORD flProtect ); /// /// Free virtual memory /// /// Memory address /// Region size /// Memory release type. /// Status code virtual NTSTATUS VirtualFreeExT( ptr_t lpAddress, size_t dwSize, DWORD dwFreeType ); /// /// Change memory protection /// /// Memory address. /// Region size /// New protection. /// Old protection /// Status code virtual NTSTATUS VirtualProtectExT( ptr_t lpAddress, DWORD64 dwSize, DWORD flProtect, DWORD* flOld ); /// /// Read virtual memory /// /// Memory address /// Output buffer /// Number of bytes to read /// Mumber of bytes read /// Status code virtual NTSTATUS ReadProcessMemoryT( ptr_t lpBaseAddress, LPVOID lpBuffer, size_t nSize, DWORD64 *lpBytes = nullptr ); /// /// Write virtual memory /// /// Memory address /// Buffer to write /// Number of bytes to read /// Mumber of bytes read /// Status code virtual NTSTATUS WriteProcessMemoryT( ptr_t lpBaseAddress, LPCVOID lpBuffer, size_t nSize, DWORD64 *lpBytes = nullptr ); /// /// Query virtual memory /// /// Address to query /// Retrieved memory info /// Status code virtual NTSTATUS VirtualQueryExT( ptr_t lpAddress, PMEMORY_BASIC_INFORMATION64 lpBuffer ); /// /// Query virtual memory /// /// Address to query /// Retrieved memory info /// Status code virtual NTSTATUS VirtualQueryExT( ptr_t lpAddress, MEMORY_INFORMATION_CLASS infoClass, LPVOID lpBuffer, size_t bufSize ); /// /// Call NtQueryInformationProcess for underlying process /// /// Information class /// Output buffer /// Buffer size /// Status code virtual NTSTATUS QueryProcessInfoT( PROCESSINFOCLASS infoClass, LPVOID lpBuffer, uint32_t bufSize ); /// /// Call NtSetInformationProcess for underlying process /// /// Information class /// Input buffer /// Buffer size /// Status code virtual NTSTATUS SetProcessInfoT( PROCESSINFOCLASS infoClass, LPVOID lpBuffer, uint32_t bufSize ); /// /// Creates new thread in the remote process /// /// Created thread handle /// Thread entry point /// Thread argument /// Creation flags /// Access override /// Status code virtual NTSTATUS CreateRemoteThreadT( HANDLE& hThread, ptr_t entry, ptr_t arg, CreateThreadFlags flags, DWORD access = THREAD_ALL_ACCESS ); /// /// Get native thread context /// /// Thread handle. /// Thread context /// Status code virtual NTSTATUS GetThreadContextT( HANDLE hThread, _CONTEXT64& ctx ); /// /// Get WOW64 thread context /// /// Thread handle. /// Thread context /// Status code virtual NTSTATUS GetThreadContextT( HANDLE hThread, _CONTEXT32& ctx ); /// /// Set native thread context /// /// Thread handle. /// Thread context /// Status code virtual NTSTATUS SetThreadContextT( HANDLE hThread, _CONTEXT64& ctx ); /// /// Set WOW64 thread context /// /// Thread handle. /// Thread context /// Status code virtual NTSTATUS SetThreadContextT( HANDLE hThread, _CONTEXT32& ctx ); /// /// NtQueueApcThread /// /// Thread handle. /// APC function /// APC argument /// Status code virtual NTSTATUS QueueApcT( HANDLE hThread, ptr_t func, ptr_t arg ); /// /// Get WOW64 PEB /// /// Retrieved PEB /// PEB pointer virtual ptr_t getPEB( _PEB32* ppeb ); /// /// Get native PEB /// /// Retrieved PEB /// PEB pointer virtual ptr_t getPEB( _PEB64* ppeb ); /// /// Get WOW64 TEB /// /// Retrieved TEB /// TEB pointer virtual ptr_t getTEB( HANDLE hThread, _TEB32* pteb ); /// /// Get native TEB /// /// Retrieved TEB /// TEB pointer virtual ptr_t getTEB( HANDLE hThread, _TEB64* pteb ); /// /// Enumerate valid memory regions /// /// If true - non-allocated regions will be included in list /// Found regions> BLACKBONE_API std::vector EnumRegions( bool includeFree = false ); /// /// Enumerate process modules /// /// Found modules /// Module type: x86 or x64 /// Module count BLACKBONE_API std::vector EnumModules( eModSeachType search = LdrList, eModType mtype = mt_default ); /// /// Get lowest possible valid address value /// /// Address value BLACKBONE_API inline ptr_t minAddr() const { return 0x10000; } /// /// Get highest possible valid address value /// /// Address value BLACKBONE_API inline ptr_t maxAddr() const { return 0x7FFFFFFEFFFF; } /// /// Get page size /// /// Address value BLACKBONE_API inline uint32_t pageSize() const { return _pageSize; } private: /// /// Enumerate process modules /// /// Found modules /// Module count template std::vector EnumModulesT(); /// /// Enum process section objects /// /// Found modules /// Sections count std::vector EnumSections(); /// /// Enum pages containing valid PE headers /// /// Found modules /// Sections count std::vector EnumPEHeaders(); protected: HANDLE _hProcess; // Process handle Wow64Barrier _wowBarrier; // WOW64 barrier info uint32_t _pageSize; }; }