我使用inline hook做api hooking,修改api入口前5 个地址跳转到我的函数其他api都不会有问题,唯独OpenEventW 和 NtOpenEvent会有问题只要修改这两个api的前5个字节就会崩溃掉,也没有异常抛出。我也查过进程内应该是没有其他线程正在调用这个api最奇怪的是,如果用调试器挂上目标进程,就可以通过。另外,如果使用改iat的方法可以hook OpenEventW, 但是NtOpenEvent同样会崩溃。请教一下是什么原因?

解决方案 »

  1.   

    你从内核挂,挂之前将IRQL提至较高级,以防其中有例程打断修改过程,试试看。
      

  2.   

    不知道楼主是什么系统?列一下Win2k sp4的OpenEventW头部:
    55        push    ebp
    8B EC     mov     ebp, esp
    83 EC 24  sub     esp, 24h这里如果你仍然使用5个字节做inline的话,那死掉应该是没错的。
      

  3.   

    内存访问权限没有设吧,或者是有CPU保护。关掉CPU保护试试看。
      

  4.   

    不知道楼主是什么系统?列一下Win2k   sp4的OpenEventW头部: Assembly code55        push    ebp
    8B EC     mov     ebp, esp
    83 EC 24  sub     esp, 24h这里如果你仍然使用5个字节做inline的话,那死掉应该是没错的。
    不是这个问题,我都是计算过每个api入口应该修改的字节数的,并保留一个副本用作重入的。其他api都是正常的。
    而且xp下NtOpenEvent第一条指令就刚刚好是5个字节的。内存访问权限没有设吧,或者是有CPU保护。关掉CPU保护试试看。
    内存我是设置为EXECUTE_WRITECOPY 的,我用来测试的cpu是没有硬件dep的,应该是没有影响吧?
    我确认一下先。
    最令我不解的是为什么调试器挂上的进程就没有这个问题,哪位能讲讲调试器究竟做了些什么小动作?
      

  5.   

    如果修改IAT仍然崩溃那只能说明你的hook代码有问题, 有访问异常或者堆栈溢出
      

  6.   

    如果你在改的时候被打断了,这是肯定会崩溃。而且NtOpenEvent还是比较常用的native API,这个都很难说。
      

  7.   

    我hook MSN send API 结果也过也挂了。
      

  8.   

    问题解决了。
    是DebugOutputString的问题
    我在dummy OpenEvent里输出了调试信息,而DebugOutputString内部也调用了OpenEvent, 形成了无限递归,堆栈溢出。