13 mod = GetModuleHandleA(mod_name);
15 mod = LoadLibraryA(mod_name);
18 return mod ? true :
false;
36#if !defined PROCESSINFOCLASS
37 typedef LONG PROCESSINFOCLASS;
40 NTSTATUS(WINAPI *_ZwQueryInformationProcess)(
41 IN HANDLE ProcessHandle,
42 IN PROCESSINFOCLASS ProcessInformationClass,
43 OUT PVOID ProcessInformation,
44 IN ULONG ProcessInformationLength,
45 OUT PULONG ReturnLength
53 FARPROC procPtr = GetProcAddress(hNtDll,
"ZwQueryInformationProcess");
58 _ZwQueryInformationProcess = (NTSTATUS(WINAPI *)(
66 typedef struct _PROCESS_BASIC_INFORMATION {
70 ULONG_PTR UniqueProcessId;
72 } PROCESS_BASIC_INFORMATION;
74 PROCESS_BASIC_INFORMATION pbi = { 0 };
75 if (_ZwQueryInformationProcess(hProcess, 0, &pbi,
sizeof(PROCESS_BASIC_INFORMATION), NULL) == S_OK) {
76 const DWORD pid =
static_cast<DWORD
>(pbi.UniqueProcessId);
84 static DWORD(WINAPI *_GetProcessId)(IN HANDLE Process) =
nullptr;
90 FARPROC procPtr = GetProcAddress(kernelLib,
"GetProcessId");
92 _GetProcessId = (DWORD(WINAPI *) (IN HANDLE))procPtr;
97 processID = _GetProcessId(hProcess);
108 for (
size_t i = 0; i < cave_size; i++) {
109 if (cave_ptr[i] != padding) {
118 if (!areaSize)
return false;
120 const DWORD dwForbiddenArea = PAGE_GUARD | PAGE_NOACCESS;
122 MEMORY_BASIC_INFORMATION mbi = { 0 };
123 const size_t mbiSize =
sizeof(MEMORY_BASIC_INFORMATION);
125 SIZE_T sizeToCheck = areaSize;
126 LPCVOID areaPtr = areaStart;
128 while (sizeToCheck > 0) {
130 memset(&mbi, 0, mbiSize);
133 if (VirtualQuery(areaPtr, &mbi, mbiSize) != mbiSize) {
137 bool isOk = (mbi.State & MEM_COMMIT)
138 && !(mbi.Protect & dwForbiddenArea)
139 && (mbi.Protect & dwAccessRights);
143 SIZE_T offset = (ULONG_PTR)areaPtr - (ULONG_PTR)mbi.BaseAddress;
144 SIZE_T queriedSize = mbi.RegionSize - offset;
145 if (queriedSize >= sizeToCheck) {
149 sizeToCheck -= queriedSize;
150 areaPtr = LPCVOID((ULONG_PTR)areaPtr + queriedSize);
159 return (IsBadReadPtr(areaStart, areaSize)) ? true :
false;
161 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 fetch_or_load_dll(IN const char *mod_name, IN OUT HMODULE &mod)
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)
DWORD ntdll_get_process_id(HANDLE hProcess)
Miscellaneous utility functions.