全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
查看: 5509|回复: 18
打印 上一主题 下一主题

[疑问] [原创]修改openssh源代码,添加流量统计并发送到远程功能

[复制链接]
跳转到指定楼层
1#
发表于 2012-12-21 14:43:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
前言:
上次调查像PT联盟那样搞一个科学上网联盟,得到大家积极响应,原帖子地址:http://hostloc.gdisk.cf/forum.php ... p;extra=#pid2486863

有兴趣的朋友可以加群:280364461 ,提供建议意见,共同讨论。

正题:
修改openssh源代码,添加流量统计并发送到远程功能


版本号: openssh-6.1p1

1:打开channels.h,在channel结构中增加2个字段,如下图:

openssh.1.jpg (63.25 KB, 下载次数: 2)


2: 打开auth.h,找到Authctxt结构,在里面增加2个字段,如下图:

openssh.2.jpg (43.26 KB, 下载次数: 2)



3:打开channels.c,找到channel_handle_rfd函数,如下图:

openssh.3.jpg (24.24 KB, 下载次数: 1)


4:打开channels.c,找到channel_handle_wfd函数,如下图:

openssh.4.jpg (18.33 KB, 下载次数: 2)


5:打开serverloop.c ,找到server_loop2函数,如下图:

openssh.5.jpg (50.2 KB, 下载次数: 1)

第一部分实现:流量超过1KB时发送给远程
第二部分实现:当用户结束连接时把流量纪录发送给远程


6:打开serverloop.c找到server_request_session函数,如下图:

openssh.6.jpg (39.07 KB, 下载次数: 1) openssh.6.jpg


7:打开serverloopc,加入把流量发送给远程的函数,如下:

  1. /* zazaar */
  2. static void
  3. submit_traffic_record(char * user,int * in,int * out){
  4.   
  5.         struct addrinfo *ailist,*aip;
  6.     struct addrinfo hint;
  7.     struct sockaddr_in addr_in;
  8.     int    sockfd,ret = -1;
  9.         char   buff;
  10.         int traffic_in  = *(in);
  11.         int traffic_out = *(out);

  12.     if ((traffic_in == 0) && (traffic_out == 0)){
  13.                 return;
  14.     }

  15.         *(in)  -= traffic_in;
  16.         *(out) -= traffic_out;

  17.         char *getbuff;
  18.         asprintf (&getbuff,"GET /traffic_record.php?user=%s&in=%i&out=%i HTTP/1.1\x0D\x0AHost: www.zazaar.com\x0D\x0A\x0D\x0A\x00",user,traffic_in,traffic_out);

  19.     hint.ai_flags = 0;
  20.     hint.ai_family =0;
  21.     hint.ai_socktype = SOCK_STREAM;
  22.     hint.ai_protocol = 0;
  23.     hint.ai_addrlen = 0;
  24.     hint.ai_canonname = NULL;
  25.     hint.ai_addr = NULL;
  26.     hint.ai_next = NULL;

  27.     if (getaddrinfo("www.xxx.com","http",&hint,&ailist) != 0){
  28.         debug("getaddrinfo error");
  29.                 return;
  30.     }
  31.     aip = ailist;
  32.     if ((sockfd = socket(aip->ai_family,SOCK_STREAM,0)) < 0){
  33.         debug("socket fail.");
  34.         return;
  35.     }

  36.         if (connect(sockfd,aip->ai_addr,aip->ai_addrlen) == 0){
  37.                 if (send(sockfd,getbuff,strlen(getbuff),0)){
  38.                          ret = recv(sockfd,&buff,1,0);
  39.                 }
  40.     }
  41.     close(sockfd);

  42.         free (getbuff);

  43.     return;
  44. }
复制代码
最后编译完成, 你会发现用户登录SSH后,流量(包括tunnel)被纪录,在用户退出或流量超过1KB时,自动发送纪录到远程,发送纪录以GET提交,例如: GET user=root&in=123&out=321
用户名为root,输入流量123byte,输出流量321byte

评分

参与人数 2威望 +45 收起 理由
cnx + 25 很给力!
lazyzhu + 20 不错,但没我的tsar模块方便

查看全部评分

19#
发表于 2012-12-22 11:36:40 | 只看该作者
支持技术贴.
18#
发表于 2012-12-22 09:49:36 来自手机 | 只看该作者
不错支持技术帖。不过网上有个更靠谱的
17#
发表于 2012-12-22 09:44:24 | 只看该作者
技术贴啊
16#
发表于 2012-12-21 16:50:12 来自手机 | 只看该作者
求patch。
15#
 楼主| 发表于 2012-12-21 16:36:52 | 只看该作者
lazyzhu 发表于 2012-12-21 15:10
http://blog.csdn.net/hannibal_why

蜘蛛爬的够快的
14#
发表于 2012-12-21 16:11:55 | 只看该作者
期待。。。!
13#
发表于 2012-12-21 15:47:14 | 只看该作者
高手啊
12#
发表于 2012-12-21 15:35:06 | 只看该作者
看明白的人加分吧。。。
11#
发表于 2012-12-21 15:30:13 | 只看该作者
Mark....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-12-23 15:20 , Processed in 0.173133 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表