看了“hook 任意函数,任意位置 【共享资源】 soucre ”一文,还以为实现了我想要的“HOOK任意地址指令”功能,遗憾的是还是和以前的HOOK代码类似,都有局限性,5个字节的跳转要求使我们总不能想HOOK啥地址就HOOK啥地址,要选一些没有相对转移的位置来实施HOOK大法。一个字节0xCC的软中断是我们理想的选择,不用考虑什么跳转不跳转,直接中断下来干点什么坏事才转回去正是我们经常用OD干的事情,为什么不能用它来HOOK呢,哈哈!搜了下,已经有前辈写过类似的利用SEH实施API hook的文章,我就不重复了,我写的不是HOOK API而是HOOK任意地址,比如给游戏开个远程线程,给它的主线程安装个“HOOK任意地址”的SEH,干点什么想干的事,那是多么惬意的事情啊,哈哈!废话少说,高手请飘过,测试代码如下:

EXCEPTION_DISPOSITION _cdecl cc_handler
( struct _EXCEPTION_RECORD *ExceptionRecord,
        void * EstablisherFrame,
        struct _CONTEXT *ContextRecord,
        void * DispatcherContext )
{
  if (ExceptionRecord->ExceptionCode==STATUS_BREAKPOINT)
  {
    AfxMessageBox("不用调试器,自己处理断点!");
    //ContextRecord里想改啥改啥,EAX,EBX,ECX啥的,甚至EIP都可以改,嘿嘿!
    *(LPBYTE)(ContextRecord->Eip)=0x90;//0xCC处改成NOP,不然就一直在这里面打转了!
    return ExceptionContinueExecution;  
  } 
  else
    return ExceptionContinueSearch;
}

void CHookAnyAddrDlg::OnButton1() 
{
  // TODO: Add your control notification handler code here
    AfxMessageBox("start");

    __asm
    { 
        // 创建EXCEPTION_REGISTRATION结构:
        push offset cc_handler// handler 函数的地址
        push DWORD PTR FS:[0]  // 前一个handler函数的地址
        mov FS:[0],ESP // 安装新的EXECEPTION_REGISTRATION结构
   
        __emit 0xcc//触发INT3异常

        // 移去我们的EXECEPTION_REGISTRATION结构
        pop DWORD PTR FS:[0]
    add esp, 4 // 将我们的EXECEPTION_REGISTRATION弹出堆栈
    } 

  AfxMessageBox("end");  
}

是不是很简单,简单得不可思议,能简单实现的事情为什么要弄复杂呢,哈哈!

开一个远程线程实现下任意地址写0xcc,把SEH处理程序弄到全局范围内,一个远程“HOOK任意地址”就实现了。

上传的附件 Hook Any Addr.rar