良好的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,也无法拦截套接字连接.
你需要做的是 >让你自己的程序打印套接字号等.>让您的程序连接到另一个程序,该程序实际上将隧道连接到真实目的地.在那里你可以转储发送/接收的所有数据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |