30#if !defined PROCESSINFOCLASS
34 NTSTATUS(WINAPI *_ZwQueryInformationProcess)(
35 IN HANDLE ProcessHandle,
37 OUT PVOID ProcessInformation,
38 IN ULONG ProcessInformationLength,
39 OUT PULONG ReturnLength
47 FARPROC procPtr = GetProcAddress(hNtDll,
"ZwQueryInformationProcess");
52 _ZwQueryInformationProcess = (
NTSTATUS(WINAPI *)(
78 static DWORD(WINAPI *_GetProcessId)(IN HANDLE Process) =
nullptr;
84 FARPROC procPtr = GetProcAddress(kernelLib,
"GetProcessId");
86 _GetProcessId = (DWORD(WINAPI *) (IN HANDLE))procPtr;
91 processID = _GetProcessId(hProcess);
102 for (
size_t i = 0; i < cave_size; i++) {
103 if (cave_ptr[i] != padding) {
112 if (!areaSize)
return false;
114 const DWORD dwForbiddenArea = PAGE_GUARD | PAGE_NOACCESS;
116 MEMORY_BASIC_INFORMATION mbi = { 0 };
117 const size_t mbiSize =
sizeof(MEMORY_BASIC_INFORMATION);
119 SIZE_T sizeToCheck = areaSize;
120 LPCVOID areaPtr = areaStart;
122 while (sizeToCheck > 0) {
124 memset(&mbi, 0, mbiSize);
127 if (VirtualQuery(areaPtr, &mbi, mbiSize) != mbiSize) {
131 bool isOk = (mbi.State & MEM_COMMIT)
132 && !(mbi.Protect & dwForbiddenArea)
133 && (mbi.Protect & dwAccessRights);
137 SIZE_T offset = (ULONG_PTR)areaPtr - (ULONG_PTR)mbi.BaseAddress;
138 SIZE_T queriedSize = mbi.RegionSize - offset;
139 if (queriedSize >= sizeToCheck) {
143 sizeToCheck -= queriedSize;
144 areaPtr = LPCVOID((ULONG_PTR)areaPtr + queriedSize);
153 return IsBadReadPtr(areaStart, areaSize);
155 const DWORD dwReadRights = PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY;
DWORD get_process_id(HANDLE hProcess)
bool is_mem_accessible(LPCVOID areaStart, SIZE_T areaSize, DWORD accessRights)
bool is_padding(const BYTE *cave_ptr, size_t cave_size, const BYTE padding_char)
HMODULE get_kernel32_hndl()
bool is_bad_read_ptr(LPCVOID areaStart, SIZE_T areaSize)
enum _PROCESSINFOCLASS PROCESSINFOCLASS
struct _PROCESS_BASIC_INFORMATION PROCESS_BASIC_INFORMATION
ULONG_PTR UniqueProcessId
DWORD ntdll_get_process_id(HANDLE hProcess)
Miscellaneous utility functions.