Skip to content

Commit 8e7374e

Browse files
committed
feat: enhance OS version check in supports_poolparty_injection function
1 parent 1106fe1 commit 8e7374e

1 file changed

Lines changed: 47 additions & 17 deletions

File tree

c/meterpreter/source/metsrv/pool_party.c

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "pool_party.h"
77
#include "pool_party_ext.h"
88

9+
910
NtDll* pNtDll = NULL;
1011
POOLPARTY_INJECTOR* poolLifeguard = NULL;
1112

@@ -145,24 +146,53 @@ POOLPARTY_INJECTOR* GetOrInitPoolParty(DWORD dwSourceArch, DWORD dwDestinationAr
145146
// wow64 -> x64 (tp_direct_insertion)
146147

147148
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;
165194
}
195+
166196
return FALSE;
167197
}
168198

0 commit comments

Comments
 (0)