| 
 | 
 
前言: 
上次调查像PT联盟那样搞一个科学上网联盟,得到大家积极响应,原帖子地址:http://443502.xyz/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,加入把流量发送给远程的函数,如下: 
- /* zazaar */
 
 - static void 
 
 - submit_traffic_record(char * user,int * in,int * out){
 
 -   
 
 -         struct addrinfo *ailist,*aip;
 
 -     struct addrinfo hint;
 
 -     struct sockaddr_in addr_in;
 
 -     int    sockfd,ret = -1;
 
 -         char   buff;
 
 -         int traffic_in  = *(in);
 
 -         int traffic_out = *(out);
 
  
-     if ((traffic_in == 0) && (traffic_out == 0)){
 
 -                 return;
 
 -     }
 
  
-         *(in)  -= traffic_in;
 
 -         *(out) -= traffic_out;
 
  
-         char *getbuff;
 
 -         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);
 
  
-     hint.ai_flags = 0;
 
 -     hint.ai_family =0;
 
 -     hint.ai_socktype = SOCK_STREAM;
 
 -     hint.ai_protocol = 0;
 
 -     hint.ai_addrlen = 0;
 
 -     hint.ai_canonname = NULL;
 
 -     hint.ai_addr = NULL;
 
 -     hint.ai_next = NULL;
 
  
-     if (getaddrinfo("www.xxx.com","http",&hint,&ailist) != 0){
 
 -         debug("getaddrinfo error");
 
 -                 return;
 
 -     }
 
 -     aip = ailist;
 
 -     if ((sockfd = socket(aip->ai_family,SOCK_STREAM,0)) < 0){
 
 -         debug("socket fail.");
 
 -         return;
 
 -     }
 
  
-         if (connect(sockfd,aip->ai_addr,aip->ai_addrlen) == 0){
 
 -                 if (send(sockfd,getbuff,strlen(getbuff),0)){
 
 -                          ret = recv(sockfd,&buff,1,0);
 
 -                 }
 
 -     }
 
 -     close(sockfd);
 
  
-         free (getbuff);
 
  
-     return;
 
 - }
 
 
  复制代码 最后编译完成, 你会发现用户登录SSH后,流量(包括tunnel)被纪录,在用户退出或流量超过1KB时,自动发送纪录到远程,发送纪录以GET提交,例如: GET user=root&in=123&out=321 
用户名为root,输入流量123byte,输出流量321byte |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |