hook 别的进程的recv 取远程主机名咋取?可以有偿。

解决方案 »

  1.   

    你要拿到SOCKET值?然后在本进程进行一下处理吗?比如getsockname什么的。SOCKET不一定像是HWND这种值,是跨进程也OK的
      

  2.   


    拿到socket应该没有用吧
    socket就是一个int而已,和HWND的概念差不多吧看看能不能hook recv
    假如能的话
    就没有问题但是这样貌似有点复杂,假如有别的条件的话,可以简单点
    如果就是为了拿到远程主机名,可以这样
    1)获取当前的TCP连接表
    2)查询特定端口号对应的连接
    3’)看能不能根据这个连接获得对方的host信息
    或者
    3‘‘)拿到该连接另一端的ip:port有这些信息,再获得对方的主机信息应该不难了吧
      

  3.   

    在目标进程里注入个dll,去hook recv然后用getpeername获取对方地址,再用进程间通信传回来?
      

  4.   

    对方的sock就可获得相关信息. ip端口
      

  5.   

    看到有偿我才点进来的,HOOK很容易,就是不知道recv里面的结构是什么样的,应该是先要取数据包的ip地址,然后解析成机器名就另外调用函数了。
      

  6.   

    大概就是这个样子,Hook的其余代码我博客里面有,远程注入的就你自己写了。
    recv有两个动态库有,一个是Ws2_32.dll,一个是wsock32.dll,下面只注入了Ws2_32.dll,得到的远程IP,端口,机器名,写入C:\files.txt// HOOK_MessageBox.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "HOOK.h"
    #include <winsock.h>
    #pragma comment(lib,"Ws2_32.lib")
    Hook hook("Ws2_32.dll","recv");typedef int (PASCAL FAR *Message) (SOCKET s, char FAR * buf, int len, int flags);extern "C" int PASCAL FAR test (SOCKET s, char FAR * buf, int len, int flags)
    {
    TCHAR lbuf[1024];
    DWORD write;
    HANDLE file=CreateFile(TEXT("C:\\files.txt"),
    GENERIC_READ|GENERIC_WRITE,
    FILE_SHARE_READ,
    NULL,
    OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
    if (file != INVALID_HANDLE_VALUE)
    {
    SetFilePointer(file, 0, NULL, FILE_END);//文件指针指向文件尾 struct sockaddr_in  test;
    int dwsize = sizeof (test);
    ZeroMemory((void *)&test,dwsize);
    getpeername(s,(struct sockaddr*)&test,&dwsize);
    struct hostent *remoteHost = gethostbyaddr((char *) &test.sin_addr, 4, AF_INET);
    ZeroMemory((void*)buf,sizeof(buf));
    wsprintf(lbuf,"远程IP地址:%s ,端口号:%d, 远程主机名:%s\n",inet_ntoa(test.sin_addr),ntohs(test.sin_port),remoteHost->h_name);
    WriteFile(file, lbuf, strlen(buf), &write, NULL); CloseHandle(file);
    }
    //查询完远程机器名后,要调用真正的recv函数处理
    hook.UnHOOK();
    int tmp = recv(s, buf, len, flags);
    hook.HOOK((INT32)test);
    return tmp;
    }BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    HMODULE dll=LoadLibrary("Ws2_32.dll");
    // HMODULE dll=LoadLibrary("wsock32.dll");
    Message fun=(Message)GetProcAddress(dll,"recv");
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    if (!hook.HOOK((INT32)test))//hook the function !hook.HOOK((INT32)test)
    {
    printf("HOOK error\n");
    }
    FreeLibrary(dll);
    break;
    case DLL_PROCESS_DETACH:
    hook.UnHOOK(); //unhook the function
    break;
    default:
    break;
    }
        return TRUE;
    }
      

  7.   

    谢了。
    hook好象做不到。
    因为要过滤一个ip包。