mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
Refactor: new winobject directory
This commit is contained in:
@@ -1777,4 +1777,24 @@ typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
|
||||
ULONG HandleCount;
|
||||
ULONG PointerCount;
|
||||
ULONG Reserved[10];
|
||||
} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
|
||||
} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
|
||||
|
||||
|
||||
typedef struct _EVENTLOGRECORD {
|
||||
DWORD Length;
|
||||
DWORD Reserved;
|
||||
DWORD RecordNumber;
|
||||
DWORD TimeGenerated;
|
||||
DWORD TimeWritten;
|
||||
DWORD EventID;
|
||||
WORD EventType;
|
||||
WORD NumStrings;
|
||||
WORD EventCategory;
|
||||
WORD ReservedFlags;
|
||||
DWORD ClosingRecordNumber;
|
||||
DWORD StringOffset;
|
||||
DWORD UserSidLength;
|
||||
DWORD UserSidOffset;
|
||||
DWORD DataLength;
|
||||
DWORD DataOffset;
|
||||
} EVENTLOGRECORD, *PEVENTLOGRECORD;
|
||||
@@ -14,5 +14,5 @@ setup(
|
||||
license = 'BSD',
|
||||
keywords = 'windows python',
|
||||
url = '',
|
||||
packages = ['windows', 'windows.generated_def', 'windows.native_exec', 'windows.utils'],
|
||||
packages = ['windows', 'windows.generated_def', 'windows.native_exec', 'windows.utils', 'windows.winobject'],
|
||||
)
|
||||
+7
-8
@@ -11,9 +11,12 @@ Exported:
|
||||
current_thread : :class:`windows.winobject.CurrentThread`
|
||||
"""
|
||||
|
||||
from . import winproxy
|
||||
from .utils import VirtualProtected
|
||||
from .winobject import System, CurrentProcess, CurrentThread
|
||||
from windows import winproxy
|
||||
from windows import winobject
|
||||
|
||||
from winobject.system import System
|
||||
from winobject.process import CurrentProcess, CurrentThread
|
||||
|
||||
|
||||
system = System()
|
||||
current_process = CurrentProcess()
|
||||
@@ -26,18 +29,14 @@ del CurrentThread
|
||||
# Late import: other imports should go here
|
||||
# Do not move it: risk of circular import
|
||||
|
||||
import windows.exception
|
||||
import windows.wmi
|
||||
import windows.utils
|
||||
import windows.debug
|
||||
import windows.service
|
||||
import windows.wintrust
|
||||
import windows.volumes
|
||||
import windows.syswow64
|
||||
|
||||
__all__ = ["system", 'current_process', 'current_thread']
|
||||
|
||||
import os
|
||||
|
||||
if bool(os.environ.get("SPHINX_BUILD", 0)):
|
||||
# I know it's shameful
|
||||
# But it's the only way I can think of right now to get a full class
|
||||
|
||||
+13
-10
@@ -2,15 +2,18 @@ import os.path
|
||||
from collections import defaultdict
|
||||
|
||||
import windows
|
||||
import windows.winobject.exception as winexception
|
||||
import windows.native_exec.simple_x86 as x86
|
||||
import windows.native_exec.simple_x64 as x64
|
||||
|
||||
from windows.winobject import WinProcess, WinThread
|
||||
from windows.winobject.process import WinProcess, WinThread
|
||||
from windows.dbgprint import dbgprint
|
||||
from windows import winproxy
|
||||
from windows.generated_def.winstructs import *
|
||||
from .generated_def import windef
|
||||
from windows.exception import VectoredException
|
||||
|
||||
|
||||
from windows.winobject.exception import VectoredException
|
||||
|
||||
|
||||
|
||||
@@ -245,9 +248,9 @@ class Debugger(object):
|
||||
self._update_debugger_state(debug_event)
|
||||
|
||||
if windows.current_process.bitness == 32:
|
||||
exception.__class__ = windows.exception.EEXCEPTION_DEBUG_INFO32
|
||||
exception.__class__ = winexception.EEXCEPTION_DEBUG_INFO32
|
||||
else:
|
||||
exception.__class__ = windows.exception.EEXCEPTION_DEBUG_INFO64
|
||||
exception.__class__ = winexception.EEXCEPTION_DEBUG_INFO64
|
||||
|
||||
excp_code = exception.ExceptionRecord.ExceptionCode
|
||||
excp_addr = exception.ExceptionRecord.ExceptionAddress
|
||||
@@ -428,7 +431,7 @@ class Debugger(object):
|
||||
The default behaviour is to return ``DBG_CONTINUE`` for the known exception code
|
||||
and ``DBG_EXCEPTION_NOT_HANDLED`` else
|
||||
"""
|
||||
if not exception.ExceptionRecord.ExceptionCode in windows.exception.exception_name_by_value:
|
||||
if not exception.ExceptionRecord.ExceptionCode in winexception.exception_name_by_value:
|
||||
return DBG_EXCEPTION_NOT_HANDLED
|
||||
return DBG_CONTINUE
|
||||
|
||||
@@ -510,9 +513,9 @@ class LocalDebugger(object):
|
||||
self._reput_breakpoint = {}
|
||||
self._hxbp_breakpoint = defaultdict(dict)
|
||||
|
||||
self.callback_vectored = VectoredException(self.callback)
|
||||
self.callback_vectored = winexception.VectoredException(self.callback)
|
||||
winproxy.AddVectoredExceptionHandler(0, self.callback_vectored)
|
||||
self.setup_hxbp_callback_vectored = VectoredException(self.setup_hxbp_callback)
|
||||
self.setup_hxbp_callback_vectored = winexception.VectoredException(self.setup_hxbp_callback)
|
||||
self.hxbp_info = None
|
||||
self.code = windows.native_exec.create_function("\xcc\xc3", [PVOID])
|
||||
self.veh_depth = 0
|
||||
@@ -590,7 +593,7 @@ class LocalDebugger(object):
|
||||
"""Called on exception"""
|
||||
print(self.get_exception_code())
|
||||
windows.current_process.exit()
|
||||
if not self.get_exception_code() in windows.exception.exception_name_by_value:
|
||||
if not self.get_exception_code() in winexception.exception_name_by_value:
|
||||
return windef.EXCEPTION_CONTINUE_SEARCH
|
||||
return windef.EXCEPTION_CONTINUE_EXECUTION
|
||||
|
||||
@@ -710,7 +713,7 @@ class LocalDebugger(object):
|
||||
return
|
||||
|
||||
self.data = addr
|
||||
with windows.exception.VectoredExceptionHandler(1, self.setup_hxbp_callback):
|
||||
with winexception.VectoredExceptionHandler(1, self.setup_hxbp_callback):
|
||||
x = self.code()
|
||||
if x is None:
|
||||
raise ValueError("Could not setup HXBP")
|
||||
@@ -733,7 +736,7 @@ class LocalDebugger(object):
|
||||
raise ValueError("Could not setup HXBP")
|
||||
return
|
||||
self.data = addr
|
||||
with windows.exception.VectoredExceptionHandler(1, self.remove_hxbp_callback):
|
||||
with winexception.VectoredExceptionHandler(1, self.remove_hxbp_callback):
|
||||
x = self.code()
|
||||
if x is None:
|
||||
raise ValueError("Could not remove HXBP")
|
||||
|
||||
@@ -51,7 +51,7 @@ HCRYPTMSG = PVOID
|
||||
PALPC_PORT_ATTRIBUTES = PVOID
|
||||
VOID = DWORD
|
||||
|
||||
structs = ['_LIST_ENTRY', '_PEB_LDR_DATA', '_LSA_UNICODE_STRING', '_RTL_USER_PROCESS_PARAMETERS', '_PEB', '_SECURITY_ATTRIBUTES', '_SYSTEM_VERIFIER_INFORMATION', '_LDR_DATA_TABLE_ENTRY', '_IMAGE_FILE_HEADER', '_IMAGE_DATA_DIRECTORY', '_IMAGE_SECTION_HEADER', '_IMAGE_OPTIONAL_HEADER64', '_IMAGE_OPTIONAL_HEADER', '_IMAGE_NT_HEADERS64', '_IMAGE_NT_HEADERS', '_IMAGE_IMPORT_DESCRIPTOR', '_IMAGE_IMPORT_BY_NAME', '_IMAGE_EXPORT_DIRECTORY', '_MEMORY_BASIC_INFORMATION', '_MEMORY_BASIC_INFORMATION32', '_MEMORY_BASIC_INFORMATION64', '_STARTUPINFOA', '_STARTUPINFOW', '_PROCESS_INFORMATION', '_FLOATING_SAVE_AREA', '_CONTEXT32', '_WOW64_FLOATING_SAVE_AREA', '_WOW64_CONTEXT', '_M128A', '_CONTEXT64', 'tagPROCESSENTRY32W', 'tagPROCESSENTRY32', 'tagTHREADENTRY32', '_LUID', '_LUID_AND_ATTRIBUTES', '_TOKEN_PRIVILEGES', '_TOKEN_ELEVATION', '_SID_AND_ATTRIBUTES', '_TOKEN_MANDATORY_LABEL', '_TOKEN_USER', '_OSVERSIONINFOA', '_OSVERSIONINFOW', '_OSVERSIONINFOEXA', '_OSVERSIONINFOEXW', '_OVERLAPPED', '_MIB_TCPROW_OWNER_PID', '_MIB_TCPTABLE_OWNER_PID', '_MIB_UDPROW_OWNER_PID', '_MIB_UDPTABLE_OWNER_PID', '_MIB_UDP6ROW_OWNER_PID', '_MIB_UDP6TABLE_OWNER_PID', '_MIB_TCP6ROW_OWNER_PID', '_MIB_TCP6TABLE_OWNER_PID', '_MIB_TCPROW', '_EXCEPTION_RECORD', '_EXCEPTION_RECORD32', '_EXCEPTION_RECORD64', '_EXCEPTION_POINTERS64', '_EXCEPTION_POINTERS32', '_DEBUG_PROCESSOR_IDENTIFICATION_ALPHA', '_DEBUG_PROCESSOR_IDENTIFICATION_AMD64', '_DEBUG_PROCESSOR_IDENTIFICATION_IA64', '_DEBUG_PROCESSOR_IDENTIFICATION_X86', '_DEBUG_PROCESSOR_IDENTIFICATION_ARM', '_DEBUG_PROCESSOR_IDENTIFICATION_ALL', '_SYMBOL_INFO', '_MODLOAD_DATA', '_SYSTEM_MODULE32', '_SYSTEM_MODULE64', '_SYSTEM_MODULE_INFORMATION32', '_SYSTEM_MODULE_INFORMATION64', 'tagSAFEARRAYBOUND', 'tagSAFEARRAY', '_DEBUG_BREAKPOINT_PARAMETERS', '_DEBUG_REGISTER_DESCRIPTION', '_DEBUG_STACK_FRAME', '_DEBUG_LAST_EVENT_INFO_BREAKPOINT', '_DEBUG_LAST_EVENT_INFO_EXCEPTION', '_DEBUG_LAST_EVENT_INFO_EXIT_THREAD', '_DEBUG_LAST_EVENT_INFO_EXIT_PROCESS', '_DEBUG_LAST_EVENT_INFO_LOAD_MODULE', '_DEBUG_LAST_EVENT_INFO_UNLOAD_MODULE', '_DEBUG_LAST_EVENT_INFO_SYSTEM_ERROR', '_DEBUG_SPECIFIC_FILTER_PARAMETERS', '_DEBUG_EXCEPTION_FILTER_PARAMETERS', '_GUID', '_CRYPTOAPI_BLOB', 'WINTRUST_FILE_INFO_', '_CRYPT_ATTRIBUTE', '_CTL_ENTRY', '_CRYPT_ATTRIBUTE', '_CRYPT_ATTRIBUTES', '_CRYPT_ALGORITHM_IDENTIFIER', '_CMSG_SIGNER_INFO', '_CERT_EXTENSION', '_CTL_USAGE', '_CTL_INFO', '_CTL_CONTEXT', 'WINTRUST_CATALOG_INFO_', 'WINTRUST_BLOB_INFO_', '_CRYPT_BIT_BLOB', '_CERT_PUBLIC_KEY_INFO', '_CERT_INFO', '_CERT_CONTEXT', 'WINTRUST_SGNR_INFO_', '_FILETIME', 'WINTRUST_CERT_INFO_', '_TMP_WINTRUST_UNION_TYPE', '_WINTRUST_DATA', '_PROCESS_BASIC_INFORMATION', '_JIT_DEBUG_INFO', '_SID_IDENTIFIER_AUTHORITY', '_EXCEPTION_DEBUG_INFO', '_CREATE_THREAD_DEBUG_INFO', '_CREATE_PROCESS_DEBUG_INFO', '_EXIT_THREAD_DEBUG_INFO', '_EXIT_PROCESS_DEBUG_INFO', '_LOAD_DLL_DEBUG_INFO', '_UNLOAD_DLL_DEBUG_INFO', '_OUTPUT_DEBUG_STRING_INFO', '_RIP_INFO', '_TMP_UNION_DEBUG_INFO', '_DEBUG_EVENT', '_STRING', '_OBJECT_ATTRIBUTES', '_SECURITY_QUALITY_OF_SERVICE', '_ALPC_PORT_ATTRIBUTES32', '_ALPC_PORT_ATTRIBUTES64', '_ALPC_MESSAGE_ATTRIBUTES', '_PORT_MESSAGE_TMP_UNION', '_PORT_MESSAGE_TMP_SUBSTRUCT_S1', '_PORT_MESSAGE_TMP_UNION_U1', '_PORT_MESSAGE_TMP_SUBSTRUCT_S2', '_PORT_MESSAGE_TMP_UNION_U2', '_PORT_MESSAGE', '_SERVICE_STATUS', '_SERVICE_STATUS_PROCESS', '_ENUM_SERVICE_STATUS_PROCESSA', '_ENUM_SERVICE_STATUS_PROCESSW', 'CATALOG_INFO_', '_SYSTEM_HANDLE', '_SYSTEM_HANDLE_INFORMATION', '__PUBLIC_OBJECT_TYPE_INFORMATION', '_PUBLIC_OBJECT_BASIC_INFORMATION']
|
||||
structs = ['_LIST_ENTRY', '_PEB_LDR_DATA', '_LSA_UNICODE_STRING', '_RTL_USER_PROCESS_PARAMETERS', '_PEB', '_SECURITY_ATTRIBUTES', '_SYSTEM_VERIFIER_INFORMATION', '_LDR_DATA_TABLE_ENTRY', '_IMAGE_FILE_HEADER', '_IMAGE_DATA_DIRECTORY', '_IMAGE_SECTION_HEADER', '_IMAGE_OPTIONAL_HEADER64', '_IMAGE_OPTIONAL_HEADER', '_IMAGE_NT_HEADERS64', '_IMAGE_NT_HEADERS', '_IMAGE_IMPORT_DESCRIPTOR', '_IMAGE_IMPORT_BY_NAME', '_IMAGE_EXPORT_DIRECTORY', '_MEMORY_BASIC_INFORMATION', '_MEMORY_BASIC_INFORMATION32', '_MEMORY_BASIC_INFORMATION64', '_STARTUPINFOA', '_STARTUPINFOW', '_PROCESS_INFORMATION', '_FLOATING_SAVE_AREA', '_CONTEXT32', '_WOW64_FLOATING_SAVE_AREA', '_WOW64_CONTEXT', '_M128A', '_CONTEXT64', 'tagPROCESSENTRY32W', 'tagPROCESSENTRY32', 'tagTHREADENTRY32', '_LUID', '_LUID_AND_ATTRIBUTES', '_TOKEN_PRIVILEGES', '_TOKEN_ELEVATION', '_SID_AND_ATTRIBUTES', '_TOKEN_MANDATORY_LABEL', '_TOKEN_USER', '_OSVERSIONINFOA', '_OSVERSIONINFOW', '_OSVERSIONINFOEXA', '_OSVERSIONINFOEXW', '_OVERLAPPED', '_MIB_TCPROW_OWNER_PID', '_MIB_TCPTABLE_OWNER_PID', '_MIB_UDPROW_OWNER_PID', '_MIB_UDPTABLE_OWNER_PID', '_MIB_UDP6ROW_OWNER_PID', '_MIB_UDP6TABLE_OWNER_PID', '_MIB_TCP6ROW_OWNER_PID', '_MIB_TCP6TABLE_OWNER_PID', '_MIB_TCPROW', '_EXCEPTION_RECORD', '_EXCEPTION_RECORD32', '_EXCEPTION_RECORD64', '_EXCEPTION_POINTERS64', '_EXCEPTION_POINTERS32', '_DEBUG_PROCESSOR_IDENTIFICATION_ALPHA', '_DEBUG_PROCESSOR_IDENTIFICATION_AMD64', '_DEBUG_PROCESSOR_IDENTIFICATION_IA64', '_DEBUG_PROCESSOR_IDENTIFICATION_X86', '_DEBUG_PROCESSOR_IDENTIFICATION_ARM', '_DEBUG_PROCESSOR_IDENTIFICATION_ALL', '_SYMBOL_INFO', '_MODLOAD_DATA', '_SYSTEM_MODULE32', '_SYSTEM_MODULE64', '_SYSTEM_MODULE_INFORMATION32', '_SYSTEM_MODULE_INFORMATION64', 'tagSAFEARRAYBOUND', 'tagSAFEARRAY', '_DEBUG_BREAKPOINT_PARAMETERS', '_DEBUG_REGISTER_DESCRIPTION', '_DEBUG_STACK_FRAME', '_DEBUG_LAST_EVENT_INFO_BREAKPOINT', '_DEBUG_LAST_EVENT_INFO_EXCEPTION', '_DEBUG_LAST_EVENT_INFO_EXIT_THREAD', '_DEBUG_LAST_EVENT_INFO_EXIT_PROCESS', '_DEBUG_LAST_EVENT_INFO_LOAD_MODULE', '_DEBUG_LAST_EVENT_INFO_UNLOAD_MODULE', '_DEBUG_LAST_EVENT_INFO_SYSTEM_ERROR', '_DEBUG_SPECIFIC_FILTER_PARAMETERS', '_DEBUG_EXCEPTION_FILTER_PARAMETERS', '_GUID', '_CRYPTOAPI_BLOB', 'WINTRUST_FILE_INFO_', '_CRYPT_ATTRIBUTE', '_CTL_ENTRY', '_CRYPT_ATTRIBUTE', '_CRYPT_ATTRIBUTES', '_CRYPT_ALGORITHM_IDENTIFIER', '_CMSG_SIGNER_INFO', '_CERT_EXTENSION', '_CTL_USAGE', '_CTL_INFO', '_CTL_CONTEXT', 'WINTRUST_CATALOG_INFO_', 'WINTRUST_BLOB_INFO_', '_CRYPT_BIT_BLOB', '_CERT_PUBLIC_KEY_INFO', '_CERT_INFO', '_CERT_CONTEXT', 'WINTRUST_SGNR_INFO_', '_FILETIME', 'WINTRUST_CERT_INFO_', '_TMP_WINTRUST_UNION_TYPE', '_WINTRUST_DATA', '_PROCESS_BASIC_INFORMATION', '_JIT_DEBUG_INFO', '_SID_IDENTIFIER_AUTHORITY', '_EXCEPTION_DEBUG_INFO', '_CREATE_THREAD_DEBUG_INFO', '_CREATE_PROCESS_DEBUG_INFO', '_EXIT_THREAD_DEBUG_INFO', '_EXIT_PROCESS_DEBUG_INFO', '_LOAD_DLL_DEBUG_INFO', '_UNLOAD_DLL_DEBUG_INFO', '_OUTPUT_DEBUG_STRING_INFO', '_RIP_INFO', '_TMP_UNION_DEBUG_INFO', '_DEBUG_EVENT', '_STRING', '_OBJECT_ATTRIBUTES', '_SECURITY_QUALITY_OF_SERVICE', '_ALPC_PORT_ATTRIBUTES32', '_ALPC_PORT_ATTRIBUTES64', '_ALPC_MESSAGE_ATTRIBUTES', '_PORT_MESSAGE_TMP_UNION', '_PORT_MESSAGE_TMP_SUBSTRUCT_S1', '_PORT_MESSAGE_TMP_UNION_U1', '_PORT_MESSAGE_TMP_SUBSTRUCT_S2', '_PORT_MESSAGE_TMP_UNION_U2', '_PORT_MESSAGE', '_SERVICE_STATUS', '_SERVICE_STATUS_PROCESS', '_ENUM_SERVICE_STATUS_PROCESSA', '_ENUM_SERVICE_STATUS_PROCESSW', 'CATALOG_INFO_', '_SYSTEM_HANDLE', '_SYSTEM_HANDLE_INFORMATION', '__PUBLIC_OBJECT_TYPE_INFORMATION', '_PUBLIC_OBJECT_BASIC_INFORMATION', '_EVENTLOGRECORD']
|
||||
|
||||
enums = ['_SYSTEM_INFORMATION_CLASS', '_MEMORY_INFORMATION_CLASS', '_THREAD_INFORMATION_CLASS', '_TCP_TABLE_CLASS', '_VARENUM', '_UDP_TABLE_CLASS', '_MIB_TCP_STATE', '_TOKEN_INFORMATION_CLASS', '_SECURITY_IMPERSONATION_LEVEL', '_SC_ENUM_TYPE', '_SC_STATUS_TYPE', '_OBJECT_INFORMATION_CLASS', '_SID_NAME_USE', '_IMAGEHLP_SYMBOL_TYPE_INFO', '_PROCESSINFOCLASS']
|
||||
|
||||
@@ -2337,3 +2337,26 @@ class _PUBLIC_OBJECT_BASIC_INFORMATION(Structure):
|
||||
PUBLIC_OBJECT_BASIC_INFORMATION = _PUBLIC_OBJECT_BASIC_INFORMATION
|
||||
PPUBLIC_OBJECT_BASIC_INFORMATION = POINTER(_PUBLIC_OBJECT_BASIC_INFORMATION)
|
||||
|
||||
# Struct _EVENTLOGRECORD definitions
|
||||
class _EVENTLOGRECORD(Structure):
|
||||
_fields_ = [
|
||||
("Length", DWORD),
|
||||
("Reserved", DWORD),
|
||||
("RecordNumber", DWORD),
|
||||
("TimeGenerated", DWORD),
|
||||
("TimeWritten", DWORD),
|
||||
("EventID", DWORD),
|
||||
("EventType", WORD),
|
||||
("NumStrings", WORD),
|
||||
("EventCategory", WORD),
|
||||
("ReservedFlags", WORD),
|
||||
("ClosingRecordNumber", DWORD),
|
||||
("StringOffset", DWORD),
|
||||
("UserSidLength", DWORD),
|
||||
("UserSidOffset", DWORD),
|
||||
("DataLength", DWORD),
|
||||
("DataOffset", DWORD),
|
||||
]
|
||||
PEVENTLOGRECORD = POINTER(_EVENTLOGRECORD)
|
||||
EVENTLOGRECORD = _EVENTLOGRECORD
|
||||
|
||||
|
||||
+2
-2
@@ -185,7 +185,7 @@ def get_current_process_syswow_peb():
|
||||
winproxy.NtWow64ReadVirtualMemory64(current_process.handle, addr, buffer_addr, size)
|
||||
return buffer_addr[:]
|
||||
peb_addr = get_current_process_syswow_peb_addr()
|
||||
return windows.winobject.RemotePEB64(peb_addr, CurrentProcessReadSyswow())
|
||||
return windows.winobject.process.RemotePEB64(peb_addr, CurrentProcessReadSyswow())
|
||||
|
||||
|
||||
class ReadSyswow64Process(object):
|
||||
@@ -285,7 +285,7 @@ def NtQueryVirtualMemory_32_to_64(ProcessHandle, BaseAddress, MemoryInformationC
|
||||
|
||||
@Syswow64ApiProxy(winproxy.NtGetContextThread)
|
||||
def NtGetContextThread_32_to_64(hThread, lpContext):
|
||||
if type(lpContext) == windows.exception.ECONTEXT64:
|
||||
if type(lpContext) == windows.winobject.exception.ECONTEXT64:
|
||||
lpContext = byref(lpContext)
|
||||
return NtGetContextThread_32_to_64.ctypes_function(hThread, lpContext)
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
from mytest import WindowsTestCase, WindowsAPITestCase, DebuggerTestCase, NativeUtilsTestCase, pop_calc_32, pop_calc_64, Calc32, Calc64
|
||||
from mytest import WindowsTestCase, WindowsAPITestCase, DebuggerTestCase, NativeUtilsTestCase, SystemTestCase, pop_calc_32, pop_calc_64, Calc32, Calc64
|
||||
|
||||
__all__ = ["WindowsTestCase", "WindowsAPITestCase", "DebuggerTestCase", "NativeUtilsTestCase"]
|
||||
__all__ = ["SystemTestCase", "WindowsTestCase", "WindowsAPITestCase", "DebuggerTestCase", "NativeUtilsTestCase"]
|
||||
|
||||
+30
-2
@@ -57,7 +57,8 @@ def Calc64(dwCreationFlags=0, exit_code=0):
|
||||
calc = pop_calc_64(dwCreationFlags)
|
||||
yield calc
|
||||
finally:
|
||||
calc.exit(exit_code)
|
||||
if "calc" in locals():
|
||||
calc.exit(exit_code)
|
||||
|
||||
@contextmanager
|
||||
def Calc32(dwCreationFlags=0, exit_code=0):
|
||||
@@ -65,7 +66,33 @@ def Calc32(dwCreationFlags=0, exit_code=0):
|
||||
calc = pop_calc_32(dwCreationFlags)
|
||||
yield calc
|
||||
finally:
|
||||
calc.exit(exit_code)
|
||||
if "calc" in locals():
|
||||
calc.exit(exit_code)
|
||||
|
||||
class SystemTestCase(unittest.TestCase):
|
||||
def test_version(self):
|
||||
return windows.system.version
|
||||
|
||||
def test_version_name(self):
|
||||
return windows.system.version_name
|
||||
|
||||
def test_computer_name(self):
|
||||
return windows.system.computer_name
|
||||
|
||||
def test_services(self):
|
||||
return windows.system.services
|
||||
|
||||
def test_logicaldrives(self):
|
||||
return windows.system.logicaldrives
|
||||
|
||||
def test_processes(self):
|
||||
return windows.system.processes
|
||||
|
||||
def test_threads(self):
|
||||
return windows.system.threads
|
||||
|
||||
def test_wmi(self):
|
||||
return windows.system.wmi.select("Win32_Process", "*")
|
||||
|
||||
|
||||
class WindowsTestCase(unittest.TestCase):
|
||||
@@ -732,6 +759,7 @@ class DebuggerTestCase(unittest.TestCase):
|
||||
|
||||
if __name__ == '__main__':
|
||||
alltests = unittest.TestSuite()
|
||||
alltests.addTest(unittest.makeSuite(SystemTestCase))
|
||||
alltests.addTest(unittest.makeSuite(WindowsTestCase))
|
||||
alltests.addTest(unittest.makeSuite(WindowsAPITestCase))
|
||||
alltests.addTest(unittest.makeSuite(DebuggerTestCase))
|
||||
|
||||
@@ -83,7 +83,7 @@ def create_process(path, args=None, dwCreationFlags=0, show_windows=False):
|
||||
if args:
|
||||
lpCommandLine = (" ".join([str(a) for a in args]))
|
||||
windows.winproxy.CreateProcessA(path, lpCommandLine=lpCommandLine, dwCreationFlags=dwCreationFlags, lpProcessInformation=ctypes.byref(proc_info), lpStartupInfo=lpStartupInfo)
|
||||
return windows.winobject.WinProcess(pid=proc_info.dwProcessId, handle=proc_info.hProcess)
|
||||
return windows.winobject.process.WinProcess(pid=proc_info.dwProcessId, handle=proc_info.hProcess)
|
||||
|
||||
|
||||
def enable_privilege(lpszPrivilege, bEnablePrivilege):
|
||||
|
||||
@@ -8,28 +8,20 @@ import itertools
|
||||
from contextlib import contextmanager
|
||||
|
||||
import windows
|
||||
import windows.network
|
||||
import windows.registry
|
||||
import windows.syswow64
|
||||
import windows.exception
|
||||
import windows.service
|
||||
import windows.volumes
|
||||
import windows.wmi
|
||||
|
||||
import windows.injection as injection
|
||||
import windows.native_exec as native_exec
|
||||
import windows.native_exec.simple_x86 as x86
|
||||
import windows.native_exec.simple_x64 as x64
|
||||
|
||||
from windows import winproxy
|
||||
from . import utils
|
||||
from windows import injection
|
||||
from windows import native_exec
|
||||
from windows import pe_parse
|
||||
from windows import winproxy
|
||||
from windows import utils
|
||||
from windows.dbgprint import dbgprint
|
||||
from windows.generated_def.winstructs import *
|
||||
from windows.generated_def.ntstatus import NtStatusException
|
||||
from .generated_def import windef
|
||||
|
||||
import windows.pe_parse as pe_parse
|
||||
from windows.generated_def import windef
|
||||
|
||||
from windows.winobject import exception
|
||||
|
||||
class AutoHandle(object):
|
||||
"""An abstract class that allow easy handle creation/destruction/wait"""
|
||||
@@ -63,193 +55,6 @@ class AutoHandle(object):
|
||||
self._close_function(self._handle)
|
||||
|
||||
|
||||
class System(object):
|
||||
"""Represent the current ``Windows`` system ``Python`` is running on"""
|
||||
|
||||
network = windows.network.Network() # Object of class :class:`windows.network.Network`
|
||||
registry = windows.registry.Registry() # Object of class :class:`windows.registry.Registry`
|
||||
|
||||
@property
|
||||
def processes(self):
|
||||
"""The list of running processes
|
||||
|
||||
:type: [:class:`WinProcess`] -- A list of Process
|
||||
"""
|
||||
return self.enumerate_processes()
|
||||
|
||||
@property
|
||||
def threads(self):
|
||||
"""The list of running threads
|
||||
|
||||
:type: [:class:`WinThread`] -- A list of Thread
|
||||
"""
|
||||
return self.enumerate_threads()
|
||||
|
||||
@property
|
||||
def logicaldrives(self):
|
||||
return windows.volumes.enum_logical_drive()
|
||||
|
||||
@property
|
||||
def services(self):
|
||||
"""The list of services (TODO: BETTER DOC)"""
|
||||
return windows.service.enumerate_services()
|
||||
|
||||
#@property
|
||||
#def handles(self):
|
||||
# size_needed = ULONG()
|
||||
# size = 0x1000
|
||||
# buffer = ctypes.c_buffer(size)
|
||||
#
|
||||
# try:
|
||||
# winproxy.NtQuerySystemInformation(16, buffer, size, ReturnLength=ctypes.byref(size_needed))
|
||||
# except WindowsError as e:
|
||||
# pass
|
||||
#
|
||||
# size = size_needed.value + 0x1000
|
||||
# buffer = ctypes.c_buffer(size)
|
||||
# winproxy.NtQuerySystemInformation(16, buffer, size, ReturnLength=ctypes.byref(size_needed))
|
||||
#
|
||||
# x = SYSTEM_HANDLE_INFORMATION.from_buffer(buffer)
|
||||
#
|
||||
# class _GENERATED_SYSTEM_HANDLE_INFORMATION(ctypes.Structure):
|
||||
# _fields_ = [
|
||||
# ("HandleCount", ULONG),
|
||||
# ("Handles", SYSTEM_HANDLE * x.HandleCount),
|
||||
# ]
|
||||
# return _GENERATED_SYSTEM_HANDLE_INFORMATION.from_buffer_copy(buffer[:size_needed.value]).Handles[:]
|
||||
|
||||
@utils.fixedpropety
|
||||
def bitness(self):
|
||||
"""The bitness of the system
|
||||
|
||||
:type: :class:`int` -- 32 or 64
|
||||
"""
|
||||
if os.environ["PROCESSOR_ARCHITECTURE"].lower() != "x86":
|
||||
return 64
|
||||
if "PROCESSOR_ARCHITEW6432" in os.environ:
|
||||
return 64
|
||||
return 32
|
||||
|
||||
@utils.fixedpropety
|
||||
def wmi(self):
|
||||
return windows.wmi.WmiRequester()
|
||||
|
||||
@utils.fixedpropety
|
||||
def computer_name(self):
|
||||
size = DWORD(0x1000)
|
||||
buf = ctypes.c_buffer(size.value)
|
||||
winproxy.GetComputerNameA(buf, ctypes.byref(size))
|
||||
return buf[:size.value]
|
||||
|
||||
@staticmethod
|
||||
def enumerate_processes():
|
||||
process_entry = WinProcess()
|
||||
process_entry.dwSize = ctypes.sizeof(process_entry)
|
||||
snap = winproxy.CreateToolhelp32Snapshot(windef.TH32CS_SNAPPROCESS, 0)
|
||||
winproxy.Process32First(snap, process_entry)
|
||||
res = []
|
||||
res.append(utils.swallow_ctypes_copy(process_entry))
|
||||
while winproxy.Process32Next(snap, process_entry):
|
||||
res.append(utils.swallow_ctypes_copy(process_entry))
|
||||
return res
|
||||
|
||||
@staticmethod
|
||||
def enumerate_processes():
|
||||
process_entry = PROCESSENTRY32()
|
||||
process_entry.dwSize = ctypes.sizeof(process_entry)
|
||||
snap = winproxy.CreateToolhelp32Snapshot(windef.TH32CS_SNAPPROCESS, 0)
|
||||
winproxy.Process32First(snap, process_entry)
|
||||
res = []
|
||||
res.append(WinProcess._from_PROCESSENTRY32(process_entry))
|
||||
while winproxy.Process32Next(snap, process_entry):
|
||||
res.append(WinProcess._from_PROCESSENTRY32(process_entry))
|
||||
return res
|
||||
|
||||
@staticmethod
|
||||
def enumerate_threads():
|
||||
thread_entry = WinThread()
|
||||
thread_entry.dwSize = ctypes.sizeof(thread_entry)
|
||||
snap = winproxy.CreateToolhelp32Snapshot(windef.TH32CS_SNAPTHREAD, 0)
|
||||
threads = []
|
||||
winproxy.Thread32First(snap, thread_entry)
|
||||
threads.append(copy.copy(thread_entry))
|
||||
while winproxy.Thread32Next(snap, thread_entry):
|
||||
threads.append(copy.copy(thread_entry))
|
||||
return threads
|
||||
|
||||
@utils.fixedpropety
|
||||
def version(self):
|
||||
data = self.get_version()
|
||||
result = data.dwMajorVersion, data.dwMinorVersion
|
||||
if result == (6,2):
|
||||
result_str = self.get_file_version("kernel32")
|
||||
result_tup = [int(x) for x in result_str.split(".")]
|
||||
result = tuple(result_tup[:2])
|
||||
return result
|
||||
|
||||
@utils.fixedpropety
|
||||
def version_name(self):
|
||||
version = self.version
|
||||
is_workstation = self.product_type == VER_NT_WORKSTATION
|
||||
if version == (10, 0):
|
||||
return ["Windows Server 2016, ""Windows 10"][is_workstation]
|
||||
elif version == (6, 3):
|
||||
return ["Windows Server 2012 R2", "Windows 8.1"][is_workstation]
|
||||
elif version == (6, 2):
|
||||
return ["Windows Server 2012", "Windows 8"][is_workstation]
|
||||
elif version == (6, 1):
|
||||
return ["Windows Server 2008 R2", "Windows 7"][is_workstation]
|
||||
elif version == (6, 0):
|
||||
return ["Windows Server 2008", "Windows Vista"][is_workstation]
|
||||
elif version == (5, 2):
|
||||
metric = winproxy.GetSystemMetrics(SM_SERVERR2)
|
||||
if is_workstation:
|
||||
if self.bitness == 64:
|
||||
return "Windows XP Professional x64 Edition"
|
||||
else:
|
||||
return "TODO: version (5.2) + is_workstation + bitness == 32"
|
||||
elif metric != 0:
|
||||
return "Windows Server 2003 R2"
|
||||
else:
|
||||
return "Windows Server 2003"
|
||||
elif version == (5, 1):
|
||||
return "Windows XP"
|
||||
elif version == (5, 0):
|
||||
return "Windows 2000"
|
||||
else:
|
||||
return "Unknow Windows <version={0} | is_workstation={1}>".format(version, is_workstation)
|
||||
|
||||
@utils.fixedpropety
|
||||
def product_type(self):
|
||||
version_map = {x:x for x in [VER_NT_WORKSTATION, VER_NT_DOMAIN_CONTROLLER, VER_NT_SERVER]}
|
||||
version = self.get_version()
|
||||
return version_map.get(version.wProductType, version.wProductType)
|
||||
|
||||
|
||||
def get_version(self):
|
||||
data = windows.generated_def.OSVERSIONINFOEXA()
|
||||
data.dwOSVersionInfoSize = ctypes.sizeof(data)
|
||||
windows.winproxy.GetVersionExA(ctypes.cast(ctypes.pointer(data), ctypes.POINTER(windows.generated_def.OSVERSIONINFOA)))
|
||||
return data
|
||||
|
||||
|
||||
def get_file_version(self, name):
|
||||
size = winproxy.GetFileVersionInfoSizeA(name)
|
||||
buf = ctypes.c_buffer(size)
|
||||
winproxy.GetFileVersionInfoA(name, 0, size, buf)
|
||||
|
||||
bufptr = PVOID()
|
||||
bufsize = UINT()
|
||||
winproxy.VerQueryValueA(buf, "\\VarFileInfo\\Translation", ctypes.byref(bufptr), ctypes.byref(bufsize))
|
||||
bufstr = ctypes.cast(bufptr, LPCSTR)
|
||||
tup = struct.unpack("<HH", bufstr.value[:4])
|
||||
req = "{0:04x}{1:04x}".format(*tup)
|
||||
winproxy.VerQueryValueA(buf, "\\StringFileInfo\\{0}\\ProductVersion".format(req), ctypes.byref(bufptr), ctypes.byref(bufsize))
|
||||
bufstr = ctypes.cast(bufptr, LPCSTR)
|
||||
return bufstr.value
|
||||
|
||||
|
||||
|
||||
class WinThread(THREADENTRY32, AutoHandle):
|
||||
"""Represent a thread """
|
||||
@utils.fixedpropety
|
||||
@@ -281,21 +86,21 @@ class WinThread(THREADENTRY32, AutoHandle):
|
||||
"""
|
||||
if self.owner.bitness == 32 and windows.current_process.bitness == 64:
|
||||
# Wow64
|
||||
x = windows.exception.ECONTEXTWOW64()
|
||||
x = exception.ECONTEXTWOW64()
|
||||
x.ContextFlags = CONTEXT_ALL
|
||||
winproxy.Wow64GetThreadContext(self.handle, x)
|
||||
return x
|
||||
|
||||
if self.owner.bitness == 64 and windows.current_process.bitness == 32:
|
||||
x = windows.exception.ECONTEXT64.new_aligned()
|
||||
x = exception.ECONTEXT64.new_aligned()
|
||||
x.ContextFlags = CONTEXT_ALL
|
||||
windows.syswow64.NtGetContextThread_32_to_64(self.handle, x)
|
||||
return x
|
||||
|
||||
if self.owner.bitness == 32:
|
||||
x = windows.exception.ECONTEXT32()
|
||||
x = exception.ECONTEXT32()
|
||||
else:
|
||||
x = windows.exception.ECONTEXT64.new_aligned()
|
||||
x = exception.ECONTEXT64.new_aligned()
|
||||
x.ContextFlags = CONTEXT_ALL
|
||||
winproxy.GetThreadContext(self.handle, x)
|
||||
return x
|
||||
@@ -372,7 +177,7 @@ class WinThread(THREADENTRY32, AutoHandle):
|
||||
tid = winproxy.GetThreadId(handle)
|
||||
try:
|
||||
# Really useful ?
|
||||
thread = [t for t in System().threads if t.tid == tid][0]
|
||||
thread = [t for t in windows.winobject.system.System().threads if t.tid == tid][0]
|
||||
# set AutoHandle _handle
|
||||
thread._handle = handle
|
||||
dbgprint("Thread {0} from handle {1}".format(thread, hex(handle)), "HANDLE")
|
||||
@@ -65,8 +65,6 @@ def enumerate_services():
|
||||
size = size_needed.value
|
||||
buffer = (ctypes.c_byte * size)()
|
||||
|
||||
print("SERVICE size = {0}".format(size))
|
||||
|
||||
try:
|
||||
windows.winproxy.EnumServicesStatusExA(scmanager, SC_ENUM_PROCESS_INFO, SERVICE_TYPE_ALL, SERVICE_ACTIVE, buffer, size, ctypes.byref(size_needed), ctypes.byref(nb_services), byref(counter), None)
|
||||
except WindowsError as e:
|
||||
@@ -0,0 +1,191 @@
|
||||
import os
|
||||
import ctypes
|
||||
import copy
|
||||
import struct
|
||||
|
||||
import windows
|
||||
from windows import winproxy
|
||||
from windows import utils
|
||||
from windows.generated_def import windef
|
||||
|
||||
from windows.winobject import process
|
||||
from windows.winobject import network
|
||||
from windows.winobject import registry
|
||||
from windows.winobject import exception
|
||||
from windows.winobject import service
|
||||
from windows.winobject import volume
|
||||
from windows.winobject import wmi
|
||||
|
||||
from windows.generated_def.winstructs import *
|
||||
|
||||
class System(object):
|
||||
"""Represent the current ``Windows`` system ``Python`` is running on"""
|
||||
|
||||
network = network.Network() # Object of class :class:`windows.network.Network`
|
||||
registry = registry.Registry() # Object of class :class:`windows.registry.Registry`
|
||||
|
||||
@property
|
||||
def processes(self):
|
||||
"""The list of running processes
|
||||
|
||||
:type: [:class:`WinProcess`] -- A list of Process
|
||||
"""
|
||||
return self.enumerate_processes()
|
||||
|
||||
@property
|
||||
def threads(self):
|
||||
"""The list of running threads
|
||||
|
||||
:type: [:class:`WinThread`] -- A list of Thread
|
||||
"""
|
||||
return self.enumerate_threads()
|
||||
|
||||
@property
|
||||
def logicaldrives(self):
|
||||
return volume.enum_logical_drive()
|
||||
|
||||
@property
|
||||
def services(self):
|
||||
"""The list of services (TODO: BETTER DOC)"""
|
||||
return service.enumerate_services()
|
||||
|
||||
#@property
|
||||
#def handles(self):
|
||||
# size_needed = ULONG()
|
||||
# size = 0x1000
|
||||
# buffer = ctypes.c_buffer(size)
|
||||
#
|
||||
# try:
|
||||
# winproxy.NtQuerySystemInformation(16, buffer, size, ReturnLength=ctypes.byref(size_needed))
|
||||
# except WindowsError as e:
|
||||
# pass
|
||||
#
|
||||
# size = size_needed.value + 0x1000
|
||||
# buffer = ctypes.c_buffer(size)
|
||||
# winproxy.NtQuerySystemInformation(16, buffer, size, ReturnLength=ctypes.byref(size_needed))
|
||||
#
|
||||
# x = SYSTEM_HANDLE_INFORMATION.from_buffer(buffer)
|
||||
#
|
||||
# class _GENERATED_SYSTEM_HANDLE_INFORMATION(ctypes.Structure):
|
||||
# _fields_ = [
|
||||
# ("HandleCount", ULONG),
|
||||
# ("Handles", SYSTEM_HANDLE * x.HandleCount),
|
||||
# ]
|
||||
# return _GENERATED_SYSTEM_HANDLE_INFORMATION.from_buffer_copy(buffer[:size_needed.value]).Handles[:]
|
||||
|
||||
@utils.fixedpropety
|
||||
def bitness(self):
|
||||
"""The bitness of the system
|
||||
|
||||
:type: :class:`int` -- 32 or 64
|
||||
"""
|
||||
if os.environ["PROCESSOR_ARCHITECTURE"].lower() != "x86":
|
||||
return 64
|
||||
if "PROCESSOR_ARCHITEW6432" in os.environ:
|
||||
return 64
|
||||
return 32
|
||||
|
||||
@utils.fixedpropety
|
||||
def wmi(self):
|
||||
return wmi.WmiRequester()
|
||||
|
||||
#TODO: use GetComputerNameExA ? and recover other names ?
|
||||
@utils.fixedpropety
|
||||
def computer_name(self):
|
||||
size = DWORD(0x1000)
|
||||
buf = ctypes.c_buffer(size.value)
|
||||
winproxy.GetComputerNameA(buf, ctypes.byref(size))
|
||||
return buf[:size.value]
|
||||
|
||||
@staticmethod
|
||||
def enumerate_processes():
|
||||
process_entry = PROCESSENTRY32()
|
||||
process_entry.dwSize = ctypes.sizeof(process_entry)
|
||||
snap = winproxy.CreateToolhelp32Snapshot(windef.TH32CS_SNAPPROCESS, 0)
|
||||
winproxy.Process32First(snap, process_entry)
|
||||
res = []
|
||||
res.append(process.WinProcess._from_PROCESSENTRY32(process_entry))
|
||||
while winproxy.Process32Next(snap, process_entry):
|
||||
res.append(process.WinProcess._from_PROCESSENTRY32(process_entry))
|
||||
return res
|
||||
|
||||
@staticmethod
|
||||
def enumerate_threads():
|
||||
thread_entry = process.WinThread()
|
||||
thread_entry.dwSize = ctypes.sizeof(thread_entry)
|
||||
snap = winproxy.CreateToolhelp32Snapshot(windef.TH32CS_SNAPTHREAD, 0)
|
||||
threads = []
|
||||
winproxy.Thread32First(snap, thread_entry)
|
||||
threads.append(copy.copy(thread_entry))
|
||||
while winproxy.Thread32Next(snap, thread_entry):
|
||||
threads.append(copy.copy(thread_entry))
|
||||
return threads
|
||||
|
||||
@utils.fixedpropety
|
||||
def version(self):
|
||||
data = self.get_version()
|
||||
result = data.dwMajorVersion, data.dwMinorVersion
|
||||
if result == (6,2):
|
||||
result_str = self.get_file_version("kernel32")
|
||||
result_tup = [int(x) for x in result_str.split(".")]
|
||||
result = tuple(result_tup[:2])
|
||||
return result
|
||||
|
||||
@utils.fixedpropety
|
||||
def version_name(self):
|
||||
version = self.version
|
||||
is_workstation = self.product_type == VER_NT_WORKSTATION
|
||||
if version == (10, 0):
|
||||
return ["Windows Server 2016, ""Windows 10"][is_workstation]
|
||||
elif version == (6, 3):
|
||||
return ["Windows Server 2012 R2", "Windows 8.1"][is_workstation]
|
||||
elif version == (6, 2):
|
||||
return ["Windows Server 2012", "Windows 8"][is_workstation]
|
||||
elif version == (6, 1):
|
||||
return ["Windows Server 2008 R2", "Windows 7"][is_workstation]
|
||||
elif version == (6, 0):
|
||||
return ["Windows Server 2008", "Windows Vista"][is_workstation]
|
||||
elif version == (5, 2):
|
||||
metric = winproxy.GetSystemMetrics(SM_SERVERR2)
|
||||
if is_workstation:
|
||||
if self.bitness == 64:
|
||||
return "Windows XP Professional x64 Edition"
|
||||
else:
|
||||
return "TODO: version (5.2) + is_workstation + bitness == 32"
|
||||
elif metric != 0:
|
||||
return "Windows Server 2003 R2"
|
||||
else:
|
||||
return "Windows Server 2003"
|
||||
elif version == (5, 1):
|
||||
return "Windows XP"
|
||||
elif version == (5, 0):
|
||||
return "Windows 2000"
|
||||
else:
|
||||
return "Unknow Windows <version={0} | is_workstation={1}>".format(version, is_workstation)
|
||||
|
||||
@utils.fixedpropety
|
||||
def product_type(self):
|
||||
version_map = {x:x for x in [VER_NT_WORKSTATION, VER_NT_DOMAIN_CONTROLLER, VER_NT_SERVER]}
|
||||
version = self.get_version()
|
||||
return version_map.get(version.wProductType, version.wProductType)
|
||||
|
||||
def get_version(self):
|
||||
data = windows.generated_def.OSVERSIONINFOEXA()
|
||||
data.dwOSVersionInfoSize = ctypes.sizeof(data)
|
||||
winproxy.GetVersionExA(ctypes.cast(ctypes.pointer(data), ctypes.POINTER(windows.generated_def.OSVERSIONINFOA)))
|
||||
return data
|
||||
|
||||
def get_file_version(self, name):
|
||||
size = winproxy.GetFileVersionInfoSizeA(name)
|
||||
buf = ctypes.c_buffer(size)
|
||||
winproxy.GetFileVersionInfoA(name, 0, size, buf)
|
||||
|
||||
bufptr = PVOID()
|
||||
bufsize = UINT()
|
||||
winproxy.VerQueryValueA(buf, "\\VarFileInfo\\Translation", ctypes.byref(bufptr), ctypes.byref(bufsize))
|
||||
bufstr = ctypes.cast(bufptr, LPCSTR)
|
||||
tup = struct.unpack("<HH", bufstr.value[:4])
|
||||
req = "{0:04x}{1:04x}".format(*tup)
|
||||
winproxy.VerQueryValueA(buf, "\\StringFileInfo\\{0}\\ProductVersion".format(req), ctypes.byref(bufptr), ctypes.byref(bufsize))
|
||||
bufstr = ctypes.cast(bufptr, LPCSTR)
|
||||
return bufstr.value
|
||||
@@ -0,0 +1,51 @@
|
||||
import ctypes
|
||||
|
||||
import windows
|
||||
from windows.generated_def import *
|
||||
|
||||
|
||||
|
||||
callback_type = ctypes.WINFUNCTYPE(UINT, HWND, LPARAM)
|
||||
|
||||
class Window(object):
|
||||
def __init__(self, handle):
|
||||
self.handle = handle
|
||||
|
||||
def name(self):
|
||||
size = 0x1024
|
||||
buffer = ctypes.c_buffer(size)
|
||||
|
||||
res = windows.winproxy.GetWindowTextA(self.handle, buffer, size)
|
||||
return buffer[:res]
|
||||
|
||||
# I don't understand the interest:
|
||||
# Either return "" or C:\Python27\python.exe
|
||||
#def module(self):
|
||||
# size = 0x1024
|
||||
# buffer = ctypes.c_buffer(size)
|
||||
# res = windows.winproxy.GetWindowModuleFileNameA(self.handle, buffer, size)
|
||||
# return buffer[:res]
|
||||
|
||||
|
||||
def enumwindows():
|
||||
result = []
|
||||
def callback(handle, param):
|
||||
result.append(handle)
|
||||
return True
|
||||
|
||||
try:
|
||||
x = windows.winproxy.EnumWindows(callback_type(callback), 0)
|
||||
except WindowsError:
|
||||
if not result:
|
||||
raise
|
||||
return result
|
||||
|
||||
|
||||
v = enumwindows()
|
||||
|
||||
for i in v:
|
||||
w = Window(i)
|
||||
if w.name():
|
||||
print("{0} -> {1} ".format(i, w.name()))
|
||||
|
||||
raise "YOLO"
|
||||
Reference in New Issue
Block a user