比如对 send 函数进行HOOK的,我是这样写的:(这个函数没有替换任何东西)int WINAPI mysend(SOCKET s, char *buf, int len, int flags)
{
int ret;
ret =send(s, (char *)buf, len, flags);
return ret;
}
如果替换 buf 这个参数,
只要客户端应用程序调用send的时候,不论发送什么数据,服务端收到的都是 "Hello World"int WINAPI mysend(SOCKET s, char *buf, int len, int flags)
{
char *buf1 = "Hello World";
int ret;
ret =send(s, (char *)buf1, len, flags);
return ret;
}现在我要HOOK WSASend这个函数,内部参数总是填错
用 "?" 表示的参数,就是我不知道如何填写的
先不替换参数,请大家帮忙看看应该怎么填int WINAPI myWSASend(SOCKET s,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesSent,
  DWORD dwFlags,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
int ret;
ret =WSASend(s,
?, //直接填 lpBuffers 会编译出错,下面的类同
dwBufferCount,
?,
dwFlags,
?,
?,);
return ret;
}

解决方案 »

  1.   

    如果你已经用你的myWSASend替代了WSASend,照你的现在的写法的话,我觉得应该会再次CALL到你的程式里来,这样不就是死循环了吗?是不是有别的处理,还是贴详细一点,如果你处理了这问题,直接填原有的参数,不会出问题的.替换了发送内容后,记得也要改返回值,因为你替换后的长度同原有长度应该会不是一样吧.
      

  2.   

    Hook与被Hook的函数之间的关系你是否搞清楚了?
      

  3.   

    [我是楼主]
      如果函数内部所填的参数,和形参一样的话,
    ret =WSASend(s,
             lpBuffers,
    dwBufferCount,
    lpNumberOfBytesSent, 
    dwFlags,
             lpOverlapped,  
    lpCompletionRoutine);编译就会出现以下错误提示(mydll.dll是正在修改的工程)
    Mydll.obj : error LNK2019: 无法解析的外部符号 __imp__WSASend@28 ,该符号在函数 "int __stdcall myWSASend(unsigned int,struct _WSABUF *,unsigned long,unsigned long *,unsigned long,struct _OVERLAPPED *,void (__stdcall*)(unsigned long,unsigned long,struct _OVERLAPPED *,unsigned long))" (?myWSASend@@YGHIPAU_WSABUF@@KPAKKPAU_OVERLAPPED@@P6GXKK2K@Z@Z) 中被引用..\mydll.dll : fatal error LNK1120: 1 个无法解析的外部命令
      

  4.   

    头文件下面填加一句:
    #pragma comment(lib,"ws2_32.lib")
    这样就没有这个:“fatal error LNK1120: 1 个无法解析的外部命令”bug了~~`