我照 windows核心编程 上面做了一个api钩子,替换了war3条用的 send函数,然后进入魔兽中,点局域网 就弹出 不能连入网络的对话框,还原后有恢复正常,替换后的send 也只是直接return 原有的send函数而已,没有任何改变,这是为什么,是魔兽能检测出api被替换了吗 

解决方案 »

  1.   

    hook 之后原函数就变动了,你再直接return 过来可能会导致问题。
      

  2.   

    你是通过操作模块的输入节来挂接API?
      

  3.   

    挂钩自己编的测试程序能行,就是挂接war3 不行,就好想它知道我挂钩了它的函数,根本都没去执行(因为替换的函数里有一个弹出对话框的语句)直接就弹个魔兽对话框说无法连入网络
      

  4.   

    应该是魔兽有检测程序,我在修改IAT时,把send的地址替换为本来send的地址,魔兽就能进局域网,替换为send本身地址+1,就会弹出 不能连入网络的 提示
      

  5.   

    魔兽没有作检查的
    本地内存数据可以随意修改的hook send成功后下一步?
    局域网游戏是几台联网的机器同步运算的,不像一般的网游
      

  6.   

    hook sendto and recvfrom
      

  7.   

    调试了一天,终于明白了,WASAStartup函数会对每一个socket函数调用LoadLibrary,只要替换掉一个socket api 的地址,WSAStartup就会调用失败,导致局域网无法启动,
      

  8.   

    WSAStartup与你的HOOK无关WSAStartup 只要初始化一次就够了hook send,后直接return,不向外发包,怎么收到包?局域网数据也要通过send 发包
      

  9.   

    不是直接return 是直接return原有的send
      

  10.   

    又调试一整天,总算是弄清楚了,通过修改调用者IAT,WSAStartup能成功返回,WSAStartup调用了GetProcAddress得到各socket函数的绝对地址,然后比较标准值,不等就失败,而修改调用者IAT,不影响LoadLibrary的返回值,所以成功,windows核心编程里的方法为了能够始动态加载的dll也被hook,挂接了loadlibrary和GetProcAddress,所以WSAStartup调用GetProcAddress时其实是条用的HookGetProcAddress,返回的是挂接的my_send函数的地址,导致WSAStartup失败
      

  11.   

    又调试一整天,总算是弄清楚了,通过修改调用者IAT,WSAStartup能成功返回,WSAStartup调用了GetProcAddress得到各socket函数的绝对地址,然后比较标准值,不等就失败,而修改调用者IAT,不影响GetProcAddress的返回值,所以成功,windows核心编程里的方法为了能够始动态加载的dll也被hook,挂接了loadlibrary和GetProcAddress,所以WSAStartup调用GetProcAddress时其实是条用的HookGetProcAddress,返回的是挂接的my_send函数的地址,导致WSAStartup失败