这几天在网上找了好多封包捕获的资料和源码
碰到一些问题
我要捕获的目标程序,用WPE获得的发送包都是send,而不是wsasend
在DELPHI中用了
hookapi('ws2_32.dll',wsasend,@xxxx,xxxx)来HOOK,
不能捕获封包
而另一个通过修改API地址的例子中,源程序是有封包通过的时候响铃一声,不加任何东西的时候运行没有问题,封包经过时也会响铃,但是加进去自己的代码以后,马上就会出错,我用的代码只是把buf中的字符读取到字符数组中。
而且这个程序我试了好多次没办法加进去热键呼出窗口。(是否可以)?
而用hookapi的例子中,wsarecv可是得到进来的封包。如果要HOOKAPI  send,请问如何实现?
请附上源码,谢谢。
我一会把这两个例子的源码部分弄上来!

解决方案 »

  1.   

    HookAPI('ws2_32.dll','WSASend',@myWSASend,@oldWSASend);
            HookAPI('ws2_32.dll','WSARecv',@myWSARecv,@oldWSARecv);
    这是别的源代码中的例子,用这两个可以得到收回来的数据,但是HOOK不到发出去的数据
    而且wpe到的数据是send类型,用WPE在选项中如果不设置send就捕获不到数据
    所以是否可以用
            HookAPI('ws2_32.dll','Send',@mysend,@oldsend);??
    这里边的ws2_s2.dll 我见还有资料中介绍为wsocket.dll
    如果可以实现,请附上,mysend,oldsend函数源码,定义方式以及DLL文件的名字(ws2_32.dll??)
      

  2.   

    HookAPI?没有这个函数啊?
      

  3.   

    HookAPI('wsock32.dll','WSASocket',@WSASocketHook,@WSASocketOrigin);
    HookAPI('ws2_32.dll','WSASend',@WSASendHook,@WSASendOrigin);
    HookAPI('ws2_32.dll','Send',@mylogSend,@oldsend);
    HookAPI('wsock32.dll','Send',@mylogSend,@oldsend);
    HookAPI('ws2_32.dll','Recv',@mylogrecv,@oldrecv);
    HookAPI('ws2_32.dll','WSARecv',@WSARecvHook,@WSARecvOrigin);
    HookAPI('ws2_32.dll','Socket',@SocketHook,@SocketOrigin);
    这些是madcodehook中的函数
    我HOOK了这些函数。其中wsarecv可以获得,别的不能获得
    其中,wsarecv和send的函数定义及实现为以下,其中wsarecv可以捕获,send不能捕获
    var WSARecvOrigin:function(s:TSocket;lpBuffers:LPWSABUF;
              dwBufferCount:dword;lpNumberOfBytesRecvd:LPDWORD;
              dwFlags:DWORD;lpOverlapped:LPWSAOVERLAPPED;
              lpCompletionROUTINE:LPWSAOVERLAPPED_COMPLETION_ROUTINE):integer;stdcall;function WSARecvHook(s:TSocket;lpBuffers:LPWSABUF;
              dwBufferCount:dword;lpNumberOfBytesRecvd:LPDWORD;
              dwFlags:DWORD;lpOverlapped:LPWSAOVERLAPPED;
              lpCompletionROUTINE:LPWSAOVERLAPPED_COMPLETION_ROUTINE):integer;stdcall;
    begin
     WSARecvHook:=WSARecvOrigin(s,lpBuffers,dwBufferCount,
              lpNumberOfBytesRecvd,dwFlags,lpOverlapped,lpCompletionROUTINE);
     MyRecv(lpBuffers.buf,lpNumberOfBytesRecvd^); if GameSocket<>s then
      GameSocket:=s;
    end;
    这个可以获得
    var
     oldsend:function (s: TSocket; var Buf:pchar; len, flags: Integer): Integer; stdcall;
    function MylogSend(s: TSocket; var Buf:pchar; len, flags: Integer): Integer; stdcall;
    var
     dwSize: cardinal;
    begin
     MessageBeep(1000);           //简单的响一声
     //调用直正的Send函数
     mylogsend:=oldsend(s,buf,len,flags);
     if GameSocket<>s then
      GameSocket:=s;
    end;
    这个不能捕获
    为什么????????????
     ProcessHandle := GetCurrentProcess;
     DLLModule := LoadLibrary('ws2_32.dll');        
     AddSend := GetProcAddress(DLLModule, 'send');  //取得API地址
     AddRecv := GetProcAddress(DLLModule, 'recv');
     JmpCode.JmpCode := $B8;
     JmpCode.MovEAX[0] := $FF;
     JmpCode.MovEAX[1] := $E0;
     JmpCode.MovEAX[2] := 0;
     ReadProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize);
     JmpCode.Address := @MySend;
     WriteProcessMemory(ProcessHandle, AddSend, @JmpCode, 8, dwSize);   //修改Send入口
     ReadProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);
     JmpCode.Address := @MyRecv;
     WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);   //修改Recv入口
     OldSend := AddSend;
     OldRecv := AddRecv;
    end;
    {---------------------------------------}
    {函数功能:Send函数的HOOK
    {函数参数:同Send
    {函数返回值:integer
    {---------------------------------------}
    function MySend(s: TSocket; var Buf:pchar; len, flags: Integer): Integer; stdcall;
    var
     x1,dwSize: cardinal;
     text:array[0..128] of char;
    begin
    //hooksend(buf,len);
    copychar(@text[0],buf,len);
    prolog(@text[0],len);
     //这儿进行发送的数据处理
     MessageBeep(1000);           //简单的响一声
     //调用直正的Send函数
     WriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize);
     Result := OldSend(S, Buf, len, flags);
     JmpCode.Address := @MySend;
     WriteProcessMemory(ProcessHandle, AddSend, @JmpCode, 8, dwSize);
    end;
    这函数可以hook得,但是不能对BUF进行读操作,否则目标程序非法操作
    不喜欢用这种方法,因为目前没找到同时使用全局热键的方法各位大哥如果觉的资料还是不全可以说明,我可以贴出全部代码!
      

  4.   

    楼上的说得很对!也一定可以成功,但是,这个文章的作者范了一个逻辑错误!
    HOOK的回调函数中直接使用了Hook句柄还有,这个方法只能在NT系统中用,在NT系统中无法拦截到recv等函数
      

  5.   

    我用了,可是下边的这两个设置以后没反应呀
    HookAPI('ws2_32.dll','Send',@mylogSend,@oldsend);
    HookAPI('wsock32.dll','Send',@mylogSend1,@oldsend1);