我使用inline hook做api hooking,修改api入口前5 个地址跳转到我的函数其他api都不会有问题,唯独OpenEventW 和 NtOpenEvent会有问题只要修改这两个api的前5个字节就会崩溃掉,也没有异常抛出。我也查过进程内应该是没有其他线程正在调用这个api最奇怪的是,如果用调试器挂上目标进程,就可以通过。另外,如果使用改iat的方法可以hook OpenEventW, 但是NtOpenEvent同样会崩溃。请教一下是什么原因?
调试欢乐多
55 push ebp
8B EC mov ebp, esp
83 EC 24 sub esp, 24h这里如果你仍然使用5个字节做inline的话,那死掉应该是没错的。
8B EC mov ebp, esp
83 EC 24 sub esp, 24h这里如果你仍然使用5个字节做inline的话,那死掉应该是没错的。不是这个问题,我都是计算过每个api入口应该修改的字节数的,并保留一个副本用作重入的。其他api都是正常的。
而且xp下NtOpenEvent第一条指令就刚刚好是5个字节的。内存访问权限没有设吧,或者是有CPU保护。关掉CPU保护试试看。
内存我是设置为EXECUTE_WRITECOPY 的,我用来测试的cpu是没有硬件dep的,应该是没有影响吧?
我确认一下先。
最令我不解的是为什么调试器挂上的进程就没有这个问题,哪位能讲讲调试器究竟做了些什么小动作?
是DebugOutputString的问题
我在dummy OpenEvent里输出了调试信息,而DebugOutputString内部也调用了OpenEvent, 形成了无限递归,堆栈溢出。