Python Ctypes Windows Access Violation - 读取内存位置

时间:2017-01-16 06:47:24

标签: python windows hook ctypes usermode

我正在使用Deviare用户模式挂钩引擎在python中使用COM编写应用程序。我正在挂钩的函数之一是CreateProcessA,但我似乎无法将适当的指针从钩子函数传递给ctypes kernel32.CreateProcess调用。我的目标是停止对CreateProcess的合法调用,并在挂起状态下重新创建它。

如果需要,函数参数的Deviare文档在这里:Deviare - Parameters

此外,创建过程的MSDN: kernel32.CreateProcessA

下面是我的ctypes调用,我没有在此之前实例化任何内容或使用'args'设置函数定义,在这种情况下是否必要?

'parameters'是Deviare中的一个对象,包含传递给钩子函数的函数参数(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)))

我的错误和一些有用/类型的参数传递给新的CreateProcess调用:

lpApplicationName | LPCSTR | "" 
lpCommandLine | LPSTR | "python C:\Users\user\PycharmProjects\testing\API_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:\Users\user\PycharmProjects\testing\EventHandlers.py", line 299, in OnFunctionCalled
    ctypes.POINTER(ctypes.c_ulong)))
WindowsError: exception: access violation reading 0x000000000033EBF0

有时,访问冲突的位置位于lpstartupinfo的开头,其他时间位于lpstartupinfo的中间。我不确定为什么,除非我的环境出现其他问题。

我已经确认了LPSTARTUPINFO&的位置。 LPPROCESS_INFORMATION在调试器中是正确的。

0 个答案:

没有答案