Python Ctypes Windows Access Violation - læsning hukommelse placering

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en ansøgning ved hjælp af Deviare usermode hooking motor over COM i python. En af de funktioner, jeg hooker er CreateProcessA, men jeg synes at have problemer med at overføre de relevante pointers fra en hooked-funktion til ctypes kernel32.CreateProcess call. Mit mål er at stoppe et legitimt opkald til CreateProcess og genskabe det i en suspenderet tilstand.


Hvis det er nødvendigt, er Deviare-dokumentationen for funktionsargumenterne her: Deviare - Parametre [3]


Også MSDN for Create Process:
kernel32.CreateProcessA [4]


Nedenfor er min ctypes call, jeg finder ikke noget før dette eller opsæt en funktionsdefinition ved hjælp af 'args', er det nødvendigt i dette tilfælde?


'parametre' er en objekt i Deviare, der indeholder funktionsargumenterne, der sendes til den hooked funktion (CreateProcessA)


retval = ctypes.windll.kernel32.CreateProcessA(
ctypes.wintypes.LPCWSTR(parameters.GetAt(0).Value),
ctypes.wintypes.LPCWSTR(parameters.GetAt(1).Value),
ctypes.c\_ulong(parameters.GetAt(2).PointerVal),
ctypes.c\_ulong(parameters.GetAt(3).PointerVal),
ctypes.wintypes.BOOL(parameters.GetAt(4).Value),
ctypes.wintypes.DWORD(0x4),
ctypes.wintypes.LPVOID(parameters.GetAt(6).PointerVal),
ctypes.wintypes.LPCWSTR(parameters.GetAt(7).Value),
ctypes.cast(parameters.GetAt(8).PointerVal, ctypes.POINTER(ctypes.c\_ulong)),
ctypes.cast(parameters.GetAt(9).PointerVal, ctypes.POINTER(ctypes.c\_ulong)))


Min fejl og nogle nyttige/typede parametre bliver sendt til det nye CreateProcess-opkald:


lpApplicationName | LPCSTR | "" 
lpCommandLine | LPSTR | "python C:UsersuserPycharmProjects	estingAPI\_tests\_2.py" 
lpProcessAttributes | LPSECURITY\_ATTRIBUTES | N/A 
lpThreadAttributes | LPSECURITY\_ATTRIBUTES | N/A 
bInheritHandles | BOOL | 1 
dwCreationFlags | DWORD | 0 
lpEnvironment | LPVOID | N/A
lpCurrentDirectory | LPCSTR | "" 
lpStartupInfo | LPSTARTUPINFOA | 0x33eb90 
lpProcessInformation | LPPROCESS\_INFORMATION | 0x33eb60 

File "C:UsersuserPycharmProjects	estingEventHandlers.py", line 299, in OnFunctionCalled
    ctypes.POINTER(ctypes.c\_ulong)))
WindowsError: exception: access violation reading 0x000000000033EBF0


Nogle gange er placeringen af ​​adgangsbruddet i begyndelsen af ​​lpstartupinfo, andre gange i midten af ​​det. Jeg er ikke sikker på hvorfor, medmindre andet er forkert i mit miljø.


Jeg har bekræftet placeringen af ​​LPSTARTUPINFO & LPPROCESS\_INFORMATION skal være korrekt i en debugger.

Bedste reference