加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

良好的Linux TCP / IP监控工具,不需要root访问权限?

发布时间:2020-12-14 00:02:58 所属栏目:Linux 来源:网络整理
导读:我想为我正在增强的程序调试TCP / IP交互.我没有root访问权限(所以没有tcpdump等),但应用程序在我自己的id下运行.我可以使用例如strace拦截系统调用,但有没有值得推荐的替代方案?如果是这样,为什么 – 他们提供什么?命令行首选(我的电脑上没有安装X服务器:
我想为我正在增强的程序调试TCP / IP交互.我没有root访问权限(所以没有tcpdump等),但应用程序在我自己的id下运行.我可以使用例如strace拦截系统调用,但有没有值得推荐的替代方案?如果是这样,为什么 – 他们提供什么?命令行首选(我的电脑上没有安装X服务器:-()),但对GUI也很好奇.

理想情况下,它会说:

    app listening on port <portA>
    app listening on port <portB>
    client connection #1 accepted on listening port <portA> to local port <portC>
        from remote <hostX:portXA>
    app sent #1 <number> bytes "<data dump...>"
    app received from client #1 <number> bytes "<data dump...>"
    client #1 closed connection

会自己划伤一个,但是太多的车轮要重新发明……

提前致谢.

更新:paulrubel和ypnos都提出了非常有用的建议……(希望我能接受这两个答案,因为它们是独特的,同样好的).执行Paul建议的LD_PRELOAD拦截的代码如下:

// TCP comms trace library
//   as per http://www.jayconrod.com/cgi/view_post.py?23

#define _GNU_SOURCE

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <dlfcn.h>


typedef ssize_t (*Recv)(int s,void* buf,size_t len,int flags);

ssize_t recv(int s,int flags)
{
    static Recv real = NULL;

    if (!real)
        real = (Recv)dlsym(RTLD_NEXT,"recv");

    fprintf(stderr,"> recv(s '%d',buf %p,len %lld,flags %d)...n",s,buf,len,flags);
    ssize_t result = real(s,flags);
    fprintf(stderr,"< recv(s '%d',flags %d) return %lldn",flags,result);

    return result;
}

typedef ssize_t (*Send)(int s,const void* buf,int flags);

ssize_t send(int s,int flags)
{
    static Send real = NULL;

    if (!real)
        real = (Send)dlsym(RTLD_NEXT,"send");

    fprintf(stderr,"> send(s '%d',result);

    return result;
}

typedef int (*Connect)(int s,const struct sockaddr* serv_addr,socklen_t addrlen);

int connect(int s,socklen_t addrlen)
{
    static Connect real = NULL;

    if (!real)
        real = (Connect)dlsym(RTLD_NEXT,"connect");

    fprintf(stderr,"> connect(s %d,sockaddr %p,addrlen %d)n",(void*)serv_addr,addrlen);
    int result = real(s,serv_addr,addrlen);
    fprintf(stderr,"< connect(s %d,addrlen %d) return %dn",addrlen,result);

    return result;
}

typedef int (*Accept)(int s,socklen_t* addrlen);

int accept(int s,struct sockaddr* serv_addr,socklen_t* addrlen)
{
    static Accept real = NULL;

    if (!real)
        real = (Accept)dlsym(RTLD_NEXT,"accept");

    fprintf(stderr,"> accept(s %d,addrlen %p)n","< accept(s %d,addrlen %p -> %d) return %dn",*addrlen,result);

    return result;
}

解决方法

即使您使用与受害者程序相同的用户ID,也无法拦截套接字连接.

你需要做的是

>让你自己的程序打印套接字号等.>让您的程序连接到另一个程序,该程序实际上将隧道连接到真实目的地.在那里你可以转储发送/接收的所有数据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读