我现在有个程序,希望能不被别人Hook,主要是保护程序里的Socket控件,不被Hook,抓包。
请高手指点,分数不够再加,谢谢。

解决方案 »

  1.   

    不被抓包是不太可能的,局域网里随便sniffer,都用不着本地机
      

  2.   

    不知道win下有没有枚举hook链的接口,也许又是一个未公开的接口呢。。呵呵
      

  3.   

    壳是没有用的,局域网内sinffer没有关系,我只希望他hook不了我的程序。
      

  4.   

    壳无用,这种东西没法根除,驱动层上倒是可以用NDIS HOOK保护,不过未免太小题大做了点,而且这也不能算是无懈可击,可能比较现实的方法就是采用加密算法拖延时间了……
      

  5.   

    因为HOOK一般是全局的,不光HOOK你的程序,所以控制起来不容易。
    但是我记得以前见过一个程序,可以检测出当前系统中的钩子。
      

  6.   


    这个也困难呀,现在他们利用抓包做坏事,,如果我加密,必须是随机加密,服务端上也要随机解密,但似乎这种技术还没有发明出来吧。比如有个封包内容是bbbbbbb加密后变在了ccccccc那么,他只要拿到这cccccc后,向服务端发送cccccc,这时服务端收到ccccccc后一样会解码成bbbbbb
    这样又是没有办法了你说是不是?有没有办法,,客户端随机加密后
    服务端也随机解码~~~
      

  7.   

    如何知道自己的程序被Hook了?
      

  8.   


    本身HOOK之後就是將包改掉再發出,跟發二個包有多大關系? 基於TCP/IP同樣包?還是重發包這是TCP/IP來處理的。
      

  9.   

    这个总之是一个老大难问题,希望继续等待高手我这些天在找资料,说Windows 2000以上系统的代码里有一个可以让本程序不被Hook的Flag,只要这个Flag设上某个值,Windows就会不响应其他程序对本程序的Hook要求。昨天还见过这段代码的C代码,,今天突然找不到了,有高手有了解这方面内容吗?
      

  10.   

    如果是网络传输的数据,完全可以用ssl来做
      

  11.   

    问题现在是TCP/IP呢。。要传输协议基本上是不可能的事情
      

  12.   

    这个很简单,采用session key不过,其实的你的需求不是这个(每次加密的密文都不同),而是:复制使用过的合法的密文重新发过来欺诈是无效!
    这个就更简单了:服务端保留每个客户端的最后一次会话的id(或时间),要求客户端把这个id自动加一,下一次客户端发来的数据包里必须含这个id
      

  13.   

    最终还是利用加密算法为好,你说的修改寄存器防止HOOK是防止IAT HOOK那类型的吧?这和网络抓包不是一个概念……
      

  14.   

    就没办法档住WPE这该日的东西了吗?
      

  15.   

    问题已解决,现在提供方法原理是这样的Wpe等一些抓包软件,会Hook掉系统的wsock32.dll里的recv和send二个函数一但钩上,那么这二个函数的入口点就改变了Win2000-2003的函数入口点是 0055  这是系统默认不变的
    WinXP -Vista  的函数入口点是 008B 也是默认不变的
    Win98暂时没条件测试基于上面的原理,我们只要检查函数入口点是否有改变就能知道是不是被Hook了代码如下 function CheckApiHook(): Boolean;
    var
      PNum: Pointer;
      lpBuffer: pByte;
      lpNumberOfBytesRead: DWORD;
      DllHandle: Cardinal;
    begin
    //  Result := False;
      DllHandle := LoadLibrary('wsock32.dll');
      lpBuffer := AllocMem(4);
      PNum := GetProcAddress(DllHandle, 'recv');
      ReadProcessMemory(GetCurrentProcess(), pnum, lpBuffer, 4, lpNumberOfBytesRead);
      if (intTohex(lpBuffer^, 4) = '008B') or (intTohex(lpBuffer^, 4) = '0055') then
        Result := False
      else
        Result := True;
      FreeMem(lpBuffer);
    end;
    特别感谢 一下随波逐流  东方未明  二位