我的Hook程序可以拦截Wsock32.dll的Sendto和RecvFrom函数,Sendto完全正常,被截程序发一个它截一个,可RecvFrom只要被截程序收到一个包就会进入无限循环接收,这是为什么呢?在家帮帮忙看看,Sendto和这个差不多的,只是反馈Buf是在WriteProcessMemory前面
我怀疑是不是Result已经指示DLL接收了数据,而函数过程结束后又去继续接收了数据而引发再次Hook而导致死循环?不过为什么Sendto没事哟?不解中...function Sock2_RecvFrom(s:TSocket; var Buf; len, flags: Integer;var from:TSockAddr;fromlen: Integer): Integer; stdcall;
var dwSize: cardinal;
const Index=1;
begin
EnterCriticalSection(MyCriticalSection);
WriteProcessMemory(ProcessHandle, Myhook[index].TmpProc, @Myhook[index].FunJmp, 8, dwSize);
Result:= TSock2_RecvFrom(Myhook[index].FunProc)(s, buf, len, flags,from,fromlen);
WriteProcessMemory(ProcessHandle, Myhook[index].TmpProc, @Myhook[index].MyJmp, 8, dwSize);
move(buf,dlldata.buf[0],len);
sendmessage(dlldata.SpyWindow,MyWM_Sock2_RecvFrom,0,0);
LeaveCriticalSection(MyCriticalSection);
end; 

解决方案 »

  1.   

    你用了钩子函数
    SetWindowsHookEx(
      idHook: Integer;   {钩子类型}
      lpfn: TFNHookProc; {函数指针}
      hmod: HINST;       {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
      dwThreadId: DWORD  {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}
    ): HHOOK;            {返回钩子的句柄; 0 表示失败}//钩子类型 idHook 选项:
    WH_MSGFILTER       = -1; {线程级; 截获用户与控件交互的消息}
    WH_JOURNALRECORD   = 0;  {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录}
    WH_JOURNALPLAYBACK = 1;  {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列}
    WH_KEYBOARD        = 2;  {系统级或线程级; 截获键盘消息}
    WH_GETMESSAGE      = 3;  {系统级或线程级; 截获从消息队列送出的消息}
    WH_CALLWNDPROC     = 4;  {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生}
    WH_CBT             = 5;  {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等}
    WH_SYSMSGFILTER    = 6;  {系统级; 截获系统范围内用户与控件交互的消息}
    WH_MOUSE           = 7;  {系统级或线程级; 截获鼠标消息}
    WH_HARDWARE        = 8;  {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息}
    WH_DEBUG           = 9;  {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子}
    WH_SHELL           = 10; {系统级或线程级; 截获发向外壳应用程序的消息}
    WH_FOREGROUNDIDLE  = 11; {系统级或线程级; 在程序前台线程空闲时调用}
    WH_CALLWNDPROCRET  = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}
      

  2.   

    结贴率太低recvfrom死循环
    可能是阻塞的原因
      

  3.   

    原因没找到,不过问题解决了
    1。引用函数的From项必须用Var
    2.Hook了Ws2_32.dll,而实际程序用了WSock32.dll
    3.不能用资源临界点(否则线线程死)
    反正我把以上改了后就好了,不过还是谢谢大家现在又有新问题接收数据长度不对,应该是172(sniffer数据),接收到是532(Len参数)
    我想在Result后返回Result数值,可只要放到后面SendMessage就不能引发我主窗口的接收过程?为什么?
      

  4.   

    程序
    DLLData^.chHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, ThreadID);function Sock2_RecvFrom(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
    var dwSize: cardinal;
    const Index=1;
    begin
      //EnterCriticalSection(MyCriticalSection);
      MyDataMessage(s,len, PChar(@Buf), @from, nil, dtRecvFrom);
      WriteProcessMemory(ProcessHandle, Myhook[index].TmpProc, @Myhook[index].FunJmp, 8, dwSize);
      Result := TSock2_RecvFrom(Myhook[index].FunProc)(s, buf, len, flags,from,fromlen);
      WriteProcessMemory(ProcessHandle, Myhook[index].TmpProc, @Myhook[index].MyJmp, 8, dwSize);
      //LeaveCriticalSection(MyCriticalSection);
    end;
    MyDataMessage是我处理数据的过程,Sendto是正常的,该多少是多少,就这个RecvFrom不正常,放到后面再把len改成Result则调用窗口接收不到消息