From d8b1ec653693ff8a302642672b70cb06764d844c Mon Sep 17 00:00:00 2001 From: hakril Date: Thu, 15 May 2025 09:46:38 +0200 Subject: [PATCH] Update CurrentProcess.virtual_alloc to match Winprocess.virtual_alloc parameters + tests --- tests/test_process.py | 34 ++++++++++++++++++++++++++++++++++ windows/winobject/process.py | 5 +++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/tests/test_process.py b/tests/test_process.py index 10f80cd..a67cef5 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -170,6 +170,40 @@ class TestProcessWithCheckGarbage(object): current_proc.read_memory(waddr, 0x20) # Check that Reading dumbly fails assert current_proc.read_wstring(waddr) == test_string + def test_virtual_alloc_current_process(self): + current_proc = windows.current_process + addr1 = current_proc.virtual_alloc(0x1000, prot=gdef.PAGE_EXECUTE_READWRITE) + meminfo = current_proc.query_memory(addr1) + assert meminfo.AllocationBase == addr1 + assert meminfo.AllocationProtect == gdef.PAGE_EXECUTE_READWRITE + assert meminfo.Type == gdef.MEM_PRIVATE + assert meminfo.State == gdef.MEM_COMMIT + assert meminfo.Protect == gdef.PAGE_EXECUTE_READWRITE + del meminfo + + addr2 = current_proc.virtual_alloc(0x1000, prot=gdef.PAGE_READONLY, type=gdef.MEM_RESERVE) + meminfo = current_proc.query_memory(addr2) + assert meminfo.AllocationBase == addr2 + assert meminfo.AllocationProtect == gdef.PAGE_READONLY + assert meminfo.Type == gdef.MEM_PRIVATE + assert meminfo.State == gdef.MEM_RESERVE + + def test_virtual_alloc(self, proc32_64): + addr1 = proc32_64.virtual_alloc(0x1000, prot=gdef.PAGE_EXECUTE_READWRITE) + meminfo = proc32_64.query_memory(addr1) + assert meminfo.AllocationBase == addr1 + assert meminfo.AllocationProtect == gdef.PAGE_EXECUTE_READWRITE + assert meminfo.Type == gdef.MEM_PRIVATE + assert meminfo.State == gdef.MEM_COMMIT + assert meminfo.Protect == gdef.PAGE_EXECUTE_READWRITE + + addr2 = proc32_64.virtual_alloc(0x1000, prot=gdef.PAGE_READONLY, type=gdef.MEM_RESERVE) + meminfo = proc32_64.query_memory(addr2) + assert meminfo.AllocationBase == addr2 + assert meminfo.AllocationProtect == gdef.PAGE_READONLY + assert meminfo.Type == gdef.MEM_PRIVATE + assert meminfo.State == gdef.MEM_RESERVE + def test_query_memory(self, proc32_64): addr = proc32_64.virtual_alloc(0x2000, prot=gdef.PAGE_EXECUTE_READWRITE) proc32_64.virtual_protect(addr, 0x2000, gdef.PAGE_READONLY) diff --git a/windows/winobject/process.py b/windows/winobject/process.py index cc7e67d..22487b0 100644 --- a/windows/winobject/process.py +++ b/windows/winobject/process.py @@ -720,13 +720,14 @@ class CurrentProcess(Process): """ return ctypes.sizeof(gdef.PVOID) * 8 # byte to bits - def virtual_alloc(self, size, prot=PAGE_EXECUTE_READWRITE): + + def virtual_alloc(self, size, prot=PAGE_EXECUTE_READWRITE, addr=None, type=gdef.MEM_COMMIT): """Allocate memory in the process :return: The address of the allocated memory :rtype: :class:`int` """ - return winproxy.VirtualAlloc(dwSize=size, flProtect=prot) + return winproxy.VirtualAlloc(lpAddress=addr, dwSize=size, flAllocationType=type, flProtect=prot) def virtual_free(self, addr): """Free memory in the process by virtual_alloc"""