• Linux中tshark(wireshark)抓包工具使用方法详解


    在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析。
    最近才发现,原来wireshark也提供有Linux命令行工具-tshark。tshark不仅有抓包的功能,还带了解析各种协议的能力。下面我们以两个实例来介绍tshark工具。

    1、安装方法

     代码如下 复制代码
    CentOS: yum install -y wireshark
    Ubuntu: apt-get install -y tshark

    2、实时打印当前http请求的url(包括域名)

     代码如下 复制代码

    tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -R 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t'

    下面介绍参数含义:

    -s 512 :只抓取前512个字节数据
    -i eth0 :捕获eth0网卡
    -n :禁止网络对象名称解析
    -f 'tcp dst port 80' :只捕捉协议为tcp,目的端口为80的数据包
    -R 'http.host and http.request.uri' :过滤出http.host和http.request.uri
    -T fields -e http.host -e http.request.uri :打印http.host和http.request.uri
    -l :输出到标准输出
    3、实时打印当前mysql查询语句
    tshark -s 512 -i eth0 -n -f 'tcp dst port 3306' -R 'mysql.query' -T fields -e mysql.query
    下面介绍参数含义:
    -s 512 :只抓取前512个字节数据
    -i eth0 :捕获eth0网卡
    -n :禁止网络对象名称解析
    -f 'tcp dst port 3306' :只捕捉协议为tcp,目的端口为3306的数据包
    -R 'mysql.query' :过滤出mysql.query
    -T fields -e mysql.query :打印mysql查询语句
    tshark使用-f来指定捕捉包过滤规则,规则与tcpdump一样,可以通过命令man pcap-filter来查得。
    tshark使用-R来过滤已捕捉到的包,与界面板wireshark的左上角Filter一致。

    例子

     代码如下 复制代码

    std::string decodeHex(const std::string& strHex)
    {
        int nLen = strHex.length() / 2;
        std::string strRet(nLen, 0);
        for (int i = 0; i != nLen; ++i)
        {
            strRet[i] = ((strHex[2*i]>='a') ? (strHex[2*i]-'a'+10) : (strHex[2*i]-'0')) * 16;
            strRet[i] += (strHex[2*i+1]>='a') ? (strHex[2*i+1]-'a'+10) : (strHex[2*i+1]-'0');
        }
        return strRet;
    }

    void cswuyg_test_tshark()
    {
        std::wstring strParam =  L"\"C:\\Program Files\\Wireshark\\tshark.exe\" -i 1 -p -l -T pdml -f \"dst port 80\" -R \"ip.addr==172.17.195.56\"";
        FILE* stream = NULL;
        errno_t err = _wfreopen_s(&stream, L"c:\\temp\\cswuyt_test.xml", L"w", stdout);
        if (err != 0)
        {
            std::cout << "error" << std::endl;
        }

        HANDLE hStd = ::GetStdHandle(STD_OUTPUT_HANDLE);
        //BOOL bSet = ::SetHandleInformation(hStd, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
        STARTUPINFO stStartInfo;
        ZeroMemory(&stStartInfo, sizeof(STARTUPINFO));
        stStartInfo.cb = sizeof(STARTUPINFO); 
        stStartInfo.hStdError = hStd;
        stStartInfo.hStdOutput = hStd;
        PROCESS_INFORMATION stProcInfo; 
        ZeroMemory(&stProcInfo, sizeof(PROCESS_INFORMATION));
        BOOL bSuccess = ::CreateProcess(NULL, const_cast<wchar_t*>(strParam.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &stStartInfo, &stProcInfo); 
        ::CloseHandle(stProcInfo.hProcess);
        ::CloseHandle(stProcInfo.hThread);
        ::fclose(stream);
    }

    上边的demo为抓取跟ip地址为172.17.195.56,端口为80(http默认端口)的机器的通信,tshark会提供包解析之后的xml数据,程序将其存储到文件。注意部分数据是需要由hex字符串转换为真实字符串的,另外还可能会有需要gzip解压。

  • 相关阅读:
    .Net 控制台动态刷新使用
    VS 将!=转换成 ≠
    C# 自定义Html分页
    .NET MVC ModelBinder基本使用
    C# 重启电脑 程序自启动
    ASP.NET JsonResult返回日期格式及首字母大写解决
    java快速排序代码实现
    系统高可靠的设计需要考虑哪些方面
    sentinel源码学习--transport模块
    TiDB学习笔记分享--存储篇
  • 原文地址:https://www.cnblogs.com/jukan/p/5455642.html
Copyright © 2020-2023  润新知