在python中使用easyhook时抛出退出代码0xC0000005

在python中使用easyhook时抛出退出代码0xC0000005,python,python-3.x,ctypes,easyhook,Python,Python 3.x,Ctypes,Easyhook,我正在尝试用python编写easyhook,下面是我的代码 #Hook/EasyHook.py 从ctypes导入* 从ctypes.util导入查找库 从pathlib导入路径 c_ulong_p=指针(c_ulong) c_void_pp=指针(c_void_p) res_path=str(路径(_文件__).parent/'res'/'EasyHook64.dll')) lib\u path=查找库(res\u path) clib=cdll.LoadLibrary(lib_路径) 类跟

我正在尝试用python编写easyhook,下面是我的代码

#Hook/EasyHook.py
从ctypes导入*
从ctypes.util导入查找库
从pathlib导入路径
c_ulong_p=指针(c_ulong)
c_void_pp=指针(c_void_p)
res_path=str(路径(_文件__).parent/'res'/'EasyHook64.dll'))
lib\u path=查找库(res\u path)
clib=cdll.LoadLibrary(lib_路径)
类跟踪\u钩子\u句柄(结构):
_字段=[(“链接”,c\u void\u p)]
lh\U安装钩=clib.lh安装钩
lh_安装_hook.restype=c_ulong
lh_install_hook.argtypes=[c_void_p,c_void_p,c_void_p,跟踪_hook_HANDLE]
#其他函数的一些定义。。。
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
从ctypes.wintypes导入*
t_dll=CDLL('User32.dll')
test=lambda:t_dll.MessageBoxW(无,'hi content!','hi title!',0)
测试()
接口=CFUNCTYPE(c_int、HWND、LPCWSTR、LPCWSTR、UINT)
def fake_功能(句柄、标题、消息、标志):
返回t_原件(手柄,“挂钩”+标题,“挂钩”+消息、标志)
t_hook_info=跟踪_hook_句柄(无)
如果lh_安装_hook(t_dll.MessageBoxW,接口(假函数),无,byref(t_hook_信息)):
引发异常(“挂钩错误[%s]:\n%s”%(rtl\U get\U last\U error(),rtl\U get\U last\U error\U string())
#此处发生错误,程序终止
#其他一些测试。。。
尝试之后,当运行到
lh\u install\u hook
调用时,它将在代码0xC0000005上退出,并且不会打印任何异常

然后尝试用API在

注入C++程序
lh_install_hook(func_address, interface(hook_function), None, byref(hook_info))
其中
func_address
是目标调用的实际地址,它导致

python38.dll+24174
_ctypes.pyd+A48D
python38.dll+33E00
python38.dll+3DA6E
_ctypes.pyd+3C69
_ctypes.pyd+38AB
python38.dll+507F5
python38.dll+491C8
有办法让它运行吗

编辑: 下面是我的代码在C++程序

中的注入和运行
#Hook/uuuu init.py
来自。EasyHook导入*
类钩子(对象):
定义初始化(self,func_地址:int):
self.enabled=False
self.hook\u info=tracked\u hook\u HANDLE(无)
自我中心=(c_ulong*1)(0)
self.acentries=cast(self.u acentries,指针(c_ulong))
接口=CFUNCTYPE(self.restype,*self.argtypes)
def hook_函数(*args):
返回self.hook_函数(*args)
如果lh_安装_hook(函数地址、接口(hook_函数)、无、byref(self.hook_信息)):
提升LocalHookError()
#此处发生错误,程序终止
#其他一些代码。。。
重新类型=c_void_p
argtypes=[]
def hook_功能(自,*参数):
返回原始文件(*args)
#main.py
从钩子导入钩子
从ctypes导入*
从ctypes.wintypes导入*
类内核32_beep_hook(hook):
重新类型=c_bool
argtypes=[DWORD,DWORD]
def挂钩功能(自身、a1、a2):
如果记录器不是无:
logger.log('beep_hook','%s,%s'(a1,a2))
返回原始文件(a1、a2)
#一些跳过代码
addr=kernel32.GetProcAddress(kernel32_模块,b“Beep”)
ctypes.windell.kernel32.Beep(500500)
hook=kernel32_beep_hook(addr)
#此处发生错误,程序终止
根据:

typedef struct\u HOOK\u TRACE\u INFO_
{
PLOCAL\u HOOK\u信息链接;
}钩子跟踪信息,*跟踪钩子句柄;
跟踪的\u HOOK\u HANDLE实际上是一个指针(尽管它的名称暗示相反),因此您的lh\u install\u HOOK.argtypes(第一个代码段)是不正确的。应该是:

lh\u install\u hook.argtypes=[c\u void\u p,c\u void\u p,指针(跟踪的\u hook\u句柄)]
从技术上讲,你遇到了

关于没有例外被抛出,也许应该透露一些信息


这应该解决问题,至少是主要问题。我不确定是否还有其他的,因为我没有安装(或构建)这个.lib,所以我没有运行你的代码
我的知识非常有限(所以这可能完全是胡说八道),但产生问题的一个潜在点是跟踪\u HOOK\u HANDLE->Link被初始化为NULL。

我不知道您是否有任何接口定义错误,但需要注意的是
lh\u安装\u HOOK(函数地址,接口(HOOK\u函数),None,byref(钩子信息)
接口(钩子功能)
必须存在一个生命周期,才能调用
hook\u函数
,但调用
lh\u install\u hook
后它就超出了范围。将其存储在变量中以维护引用。@MarkTolonen感谢您的评论,我认为这不会是当前的问题,程序在“安装”之前终止,我试图通过作弊引擎查看内存页,发现函数终止时所在的内存没有改变。
hook\u f=interface(fake\u function)lh\u install\u hook(t\u dll.MessageBoxW,hook\u f,None,byref(t\u hook\u info))
\code>lh\u install\u hook(t\u dll.MessageBoxW,interface(fake\u function),None,byref(t\u hook\u信息))#不工作,为什么?@CSQGB这是因为python中的gc系统,当函数(或python变量)不使用内存时,它将是免费的,因此当调用钩住的函数时,它将尝试访问一个已释放/另一个已使用的内存作为函数]非常感谢您的回答!虽然除了您在我的代码中指出的错误之外,还有一些编码错误,但您帮助我找出了最大的错误:)不客气!最好在一个单独的问题中处理每个(主要)错误,这样无论谁遇到其中一个错误都会更容易。@nyao你能给我看一下修复的代码吗。我遇到了同样的人problem@CSQGB我在github中放了一个示例代码