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