一个分析Linux ARP日志的源代码程序

转载 2007年09月13日 15:09:00

#include <iostream>
#include <string>
#include <fstream>
#include <list>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
typedef list<string> ListStr;
typedef set<string> SetStr;
typedef ListStr::iterator Iter;
typedef SetStr::iterator s_iter;
typedef basic_string<char>::size_type S_T;
static S_T npos = -1;
string CONFIG_FILE;
string LOG_FILE;
const string DEFAULT_CONFIG_FILE="/root/config.txt";
const string DEFAULT_LOG_FILE="/root/log.log";
////////////////////////////////////////////////////////
//Func Define
////////////////////////////////////////////////////////
void splitstr(const string& _source,const string& _split,ListStr& _ls);

vector<string> split(const string& src, string delimit, string null_subst);

bool IsInMACAndIP(const ListStr& _ls,const string& _s);

int ParseArg(int argc,char *argv[]);

string getip(const string& _s);

string getmac(const string& _s);

int main(int argc,char *argv[]){
/////////////////////////////////////////////////////////////
//Define Data
/////////////////////////////////////////////////////////////
  ListStr IPAndMac;
  ListStr LogStr;
  ListStr ExecLogStrCount;
  SetStr ExecLogStr;
  Iter i_im;
  Iter i_ls;
  s_iter s_i;
//////////////////////////////////////////////////////////////
//Initial Data
//////////////////////////////////////////////////////////////
//
  int i_r = ParseArg(argc,argv);
  if(i_r <= 0){
    cout << "Error Params" << endl;
    exit(0);
  }else{
 
    fstream fs_config(CONFIG_FILE.c_str());
    //cout << CONFIG_FILE << endl;
    fstream fs_log(LOG_FILE.c_str());
    //cout << LOG_FILE << endl;
    IPAndMac.clear();
    LogStr.clear();
    ExecLogStr.clear();
    ExecLogStr.clear();
///////////////////////////////////////////////////////////////
//Exception
///////////////////////////////////////////////////////////////
    if(!fs_config ){
      cout <<"Can not Open Config File " <<CONFIG_FILE <<  endl;
      exit(0);
    }
    if(!fs_log){
      cout <<" Can not Open Log File " << LOG_FILE << endl;
      exit(0);
    }
    else{
////////////////////////////////////////////////////////////
//Read Config
///////////////////////////////////////////////////////////
      string s_config_line;
      while(getline(fs_config,s_config_line)){
        IPAndMac.push_back(s_config_line);
      }
//////////////////////////////////////////////////////////
//Read Log
////////////////////////////////////////////////////////////
      string s_log_line;
      while(getline(fs_log,s_log_line)){
        LogStr.push_back(s_log_line);
      }
//////////////////////////////////////////////////////////
//Do Test Data
/////////////////////////////////////////////////////////
    // NOw Get All Default Mac And Data
    //For LogStr
      //Get ARP IP And Mac
      //Is In IP And Mac
        //if In
        //else not  >>>>>> Arp Attack Cout IP And Address
      for(i_ls = LogStr.begin(); i_ls != LogStr.end() ; ++ i_ls){
        vector<string> v = split(*i_ls," ","");
        string s_IP = v[9];
        string s_MAC = v[1];
        string s_temp = s_MAC + "=" + s_IP;
        ExecLogStr.insert(s_temp);
        ExecLogStrCount.push_back(s_temp);
      }

      for(s_i = ExecLogStr.begin(); s_i != ExecLogStr.end(); ++ s_i){
        if(!IsInMACAndIP(IPAndMac,*s_i)){
          int i_num = count(ExecLogStrCount.begin(),ExecLogStrCount.end(),*s_i);
          cout << "The Computer@@@" << *s_i <<"@@@Attack@@@" <<i_num <<"@@@Times!"<< endl;
        }

      }

    }
    return 0;
  }
}
string getip(const string& _s){
  return "";
}

string getmac(const string& _s){
  return "";
}
void splitstr(const string& _source,const string& _split,ListStr& _ls){
  //todo:
  _ls.clear();
  string strtemp;
  strtemp = _source;
  string::size_type len = _source.length();
  string::size_type itmp = strtemp.find(_split);
  do{
    _ls.push_back(strtemp.substr(0,itmp));
    //cout << strtemp.substr(0,itmp) << endl;
   
    if(len-itmp-1 > 0){
      //cout << strtemp << endl;
      strtemp = strtemp.substr(itmp+1,len-itmp-1);
      //cout << strtemp << endl;
      itmp = strtemp.find(_split);
      len = strtemp.length();
    }
    else{
      cout << 2 << endl;
      break;
    }
  }while( itmp>0 );
  //ListStr.push_back(_source.substr(0,i1));
  //cout << _source.substr(0,i1) << endl;
  //cout << _source.substr(i1+1,len-i1-2)<< endl;
  //cout << il << endl;
}
bool IsInMACAndIP(const ListStr& _ls,const string& _s){
  ListStr::const_iterator i = find(_ls.begin(),_ls.end(),_s);
  if(i == _ls.end()){
    return false;
  }
  else{
    return true;
  }
}
vector<string> split(const string& src, string delimit, string null_subst="")
{
  if( src.empty() || delimit.empty() ) throw "split: empty string/0";

  vector<string> v;
  S_T deli_len = delimit.size();
  long index = npos, last_search_position = 0;
  while( (index=src.find(delimit, last_search_position))!=npos )
  {
    if(index==last_search_position)
      v.push_back(null_subst);
    else
      v.push_back( src.substr(last_search_position, index-last_search_position) );
    last_search_position = index + deli_len;
  }
  string last_one = src.substr(last_search_position);
  v.push_back( last_one.empty()? null_subst:last_one );
  return v;
}

int ParseArg(int argc,char *argv[]){
  /*
  for(int i = 0 ; i < argc ; i++)
  {
    //cout << argc << endl;
    cout << argv[i] << endl;
  }
  */
  if(argc == 1){
    CONFIG_FILE = DEFAULT_CONFIG_FILE;
    LOG_FILE = DEFAULT_LOG_FILE;
    return argc;
  }
  else if(argc == 3){
    //cout << 3333 << endl;
    char tbuf[256];
    strcpy(tbuf,argv[1]);
    string s_temp = (string)(tbuf);
    if(s_temp == "-c"){
      //cout << 1111 << endl;
      char buf[256];
      strcpy(buf,argv[2]);
      CONFIG_FILE = (string)(buf);
      LOG_FILE = DEFAULT_LOG_FILE;
      //cout << CONFIG_FILE << endl;
      return argc;
    }
    if(argv[1] == "-l"){
      char buf[256];
      strcpy(buf,argv[2]);
      LOG_FILE = (string)(buf);
      CONFIG_FILE = DEFAULT_CONFIG_FILE;
      //cout << LOG_FILE << endl;
      return argc;
    }
  }
  else if(argc == 5){
    char tbuf1[256];
    strcpy(tbuf1,argv[1]);
    string s_temp1 = (string)(tbuf1);

    char tbuf2[256];
    strcpy(tbuf2,argv[3]);
    string s_temp2 = (string)(tbuf2);
    if(s_temp1 == "-c" || s_temp1 == "-C")
      CONFIG_FILE = (string)argv[2];
    if(s_temp2 == "-l" || s_temp2 == "-L")
      LOG_FILE = (string)argv[4];
    //cout << CONFIG_FILE << "@@@@@" << LOG_FILE << endl;
    return argc;
  }
  else{
    return -1;
  }
}

 

LINUX -ARP欺骗

介绍: 由于局域网的网络流通不是根据IP地址进行,而是根据MAC地址进行传输。所以,MAC地址在A上被伪造成一个不存在的MAC地址,这样就会导致网络不通,A不能Ping通C!这就是一个简单的ARP欺骗...
  • qiumei1101381170
  • qiumei1101381170
  • 2015年11月26日 15:29
  • 833

Wireshark实战分析之ARP协议(二)

本节学习如何获取ARP协议包,以及分析ARP数据。 分析之前,先看看ARP的报文格式...
  • longwang155069
  • longwang155069
  • 2015年11月23日 17:41
  • 3548

ARP协议格式和实例分析

ARP协议是一个网络层协议,它的出现是为了完成网络层的ip和数据链路层的MAC地址之间的对应关系。 一、ARP协议的报文格式 arp的报文格式如下: 1.硬件地址类型:该字段表示物理网络...
  • deramer1
  • deramer1
  • 2017年06月19日 14:14
  • 654

LINUX常用的日志分析命令

对于已经在线的系统来说,常常会遇到各种恶意攻击行为,其中比较常见的便是HTTP flood,也称之为CC攻击。如何快速的定位到攻击,并迅速响应,便成为开发运维人员必备的技能。定位问题最快的方法就是登陆...
  • risingsun001
  • risingsun001
  • 2015年10月12日 17:36
  • 7731

地址解析协议(ARP)的学习(通过wireshark抓包分析)

看看维基百科的解释 地址解析协议(Address Resolution Protocol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必...
  • u010442328
  • u010442328
  • 2015年05月01日 13:43
  • 5375

Linux日志分析常用命令

1.查看文件内容 cat -n 显示行号 2.分页显示 more Enter 显示下一行 空格 显示下一页 F 显示下一屏 B 显示上一屏 les...
  • u010854543
  • u010854543
  • 2015年08月17日 13:56
  • 2015

Wireshark实战分析之ARP协议(一)

ARP(Address Resolution Protocol)协议,地址解析协议。该协议的功能是将IP地址转化为物理地址。 可能有人就会问了? 为什么ARP的功能是将IP地址转化为物理地址? 对...
  • longwang155069
  • longwang155069
  • 2015年11月23日 09:37
  • 4330

学习用wireshark分析arp

启动wireshark后抓包得到上图信息,用arp过滤出arp协议的包看显示包的窗口,分别显示了编号,捕获的包相对时间(从开始抓算为0.000秒),源地址,目标地址,协议,数据包信息选中第一个包,看中...
  • zhuozhuo_jiao
  • zhuozhuo_jiao
  • 2006年12月09日 10:26
  • 5335

【计算机网络】网络协议分析工具Wireshark的使用、用Wireshark观察ARP协议以及ping命令的工作过程分析以太网报文格式

计算机网络网络协议分析工具Wireshark的使用
  • LX18792732127
  • LX18792732127
  • 2016年10月09日 23:22
  • 6741

Linux命令学习手册-arp命令

[功能] 管理系统的arp缓存。   [描述] 用来管理系统的arp缓存,常用的命令包括: arp: 显示所有的表项。 arp  -d  address: 删除一个arp表项...
  • yjh314
  • yjh314
  • 2016年03月10日 17:07
  • 579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个分析Linux ARP日志的源代码程序
举报原因:
原因补充:

(最多只允许输入30个字)