|
6 | 6 | #include "pool_party.h" |
7 | 7 | #include "pool_party_ext.h" |
8 | 8 |
|
| 9 | + |
9 | 10 | NtDll* pNtDll = NULL; |
10 | 11 | POOLPARTY_INJECTOR* poolLifeguard = NULL; |
11 | 12 |
|
@@ -145,24 +146,53 @@ POOLPARTY_INJECTOR* GetOrInitPoolParty(DWORD dwSourceArch, DWORD dwDestinationAr |
145 | 146 | // wow64 -> x64 (tp_direct_insertion) |
146 | 147 |
|
147 | 148 | BOOL supports_poolparty_injection(DWORD dwSourceArch, DWORD dwDestinationArch) { |
148 | | - OSVERSIONINFO os = {0}; |
149 | | - os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |
150 | | - NTSTATUS (*pRtlGetVersion)(OSVERSIONINFO* os) = (NTSTATUS (*)(OSVERSIONINFO* os))GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlGetVersion"); |
151 | | - dprintf("[INJECT][supports_poolparty_injection] RtlGetVersion: %p", pRtlGetVersion); |
152 | | - if (!pRtlGetVersion(&os)) { |
153 | | - dprintf("[INJECT][supports_poolparty_injection] dwSourceArch: %d dwDestinationArch: %d", dwSourceArch, dwDestinationArch); |
154 | | - dprintf("[INJECT][supports_poolparty_injection] os.dwMajorVersion: %d os.dwMinorVersion: %d", os.dwMajorVersion, os.dwMinorVersion); |
155 | | - if (os.dwMajorVersion >= 10) { |
156 | | - if (dwDestinationArch == PROCESS_ARCH_X64 && (dwSourceArch == PROCESS_ARCH_X64 || dwSourceArch == PROCESS_ARCH_X86)) { |
157 | | - return TRUE; // tp_direct_insertion |
158 | | - } |
159 | | - BOOL bIsWow64 = FALSE; |
160 | | - BOOL bResult = IsWow64Process(GetCurrentProcess(), &bIsWow64); |
161 | | - if (dwDestinationArch == PROCESS_ARCH_X86 && dwSourceArch == PROCESS_ARCH_X86 && !bIsWow64 && bResult != 0) { |
162 | | - return TRUE; |
163 | | - } |
164 | | - } |
| 149 | + // Allocate OSVERSIONINFOEXW structure |
| 150 | + OSVERSIONINFOEXW os = {0}; |
| 151 | + os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); |
| 152 | + |
| 153 | + // Get RtlGetVersion function pointer |
| 154 | + HMODULE hNtdll = GetModuleHandleA("ntdll.dll"); |
| 155 | + if (hNtdll == NULL) { |
| 156 | + dprintf("[INJECT][supports_poolparty_injection] Failed to get ntdll.dll handle"); |
| 157 | + return FALSE; |
| 158 | + } |
| 159 | + |
| 160 | + typedef NTSTATUS (WINAPI *RtlGetVersionPtr)(PRTL_OSVERSIONINFOEXW); |
| 161 | + RtlGetVersionPtr pRtlGetVersion = (RtlGetVersionPtr)GetProcAddress(hNtdll, "RtlGetVersion"); |
| 162 | + |
| 163 | + if (pRtlGetVersion == NULL) { |
| 164 | + dprintf("[INJECT][supports_poolparty_injection] Failed to get RtlGetVersion address"); |
| 165 | + return FALSE; |
| 166 | + } |
| 167 | + |
| 168 | + // Call RtlGetVersion |
| 169 | + NTSTATUS status = pRtlGetVersion((PRTL_OSVERSIONINFOEXW)&os); |
| 170 | + if (status != STATUS_SUCCESS) { |
| 171 | + dprintf("[INJECT][supports_poolparty_injection] RtlGetVersion failed with status: 0x%x", status); |
| 172 | + return FALSE; |
| 173 | + } |
| 174 | + |
| 175 | + dprintf("[INJECT][supports_poolparty_injection] dwSourceArch: %d dwDestinationArch: %d", dwSourceArch, dwDestinationArch); |
| 176 | + dprintf("[INJECT][supports_poolparty_injection] OS Version: %d.%d Build: %d", |
| 177 | + os.dwMajorVersion, os.dwMinorVersion, os.dwBuildNumber); |
| 178 | + |
| 179 | + // Check if Windows 10 or greater (major version >= 10) |
| 180 | + if (os.dwMajorVersion < 10) { |
| 181 | + dprintf("[INJECT][supports_poolparty_injection] OS version is less than Windows 10"); |
| 182 | + return FALSE; |
| 183 | + } |
| 184 | + |
| 185 | + // Check architecture compatibility |
| 186 | + if (dwDestinationArch == PROCESS_ARCH_X64 && (dwSourceArch == PROCESS_ARCH_X64 || dwSourceArch == PROCESS_ARCH_X86)) { |
| 187 | + return TRUE; // tp_direct_insertion |
| 188 | + } |
| 189 | + |
| 190 | + BOOL bIsWow64 = FALSE; |
| 191 | + BOOL bResult = IsWow64Process(GetCurrentProcess(), &bIsWow64); |
| 192 | + if (dwDestinationArch == PROCESS_ARCH_X86 && dwSourceArch == PROCESS_ARCH_X86 && !bIsWow64 && bResult != 0) { |
| 193 | + return TRUE; |
165 | 194 | } |
| 195 | + |
166 | 196 | return FALSE; |
167 | 197 | } |
168 | 198 |
|
|
0 commit comments