wireshark代码解析1
wiresharkicmp、mac地址分析

wiresharkicmp、mac地址分析
ICMP
1表明源ip地址和⽬的ip地址 icmp 协议是icmp
2类型是0表明这是回显响应
3代码为0
4检验和为0x4d4e
5序列号为0x000d与请求包相同
6请求帧为126帧
mac帧格式分析
mac帧格式是有5部分组成,由⽬的mac和源mac以及类型组成、数据、fcs
1:⽬的mac f8:28:19:da:de:a7
2: 源 mac d8:9a:34:35:ef
3: 类型为IPv4
4、数据字段(46-1500):正式名称是MAC客户数据字段最⼩长度64 字节-18字节的⾸部和尾部 = 数据字段的最⼩长度
5、FCS字段(4 字节):当数据字段的长度⼩于 46 字节时,应在数据字段的后⾯加⼊整数字节的填充字段,以保证以太⽹的MAC帧长不⼩于64 字节
MAC地址分析
MAC地址的长度为48位(6个字节),通常表⽰为12个16进制数,d8:9a:34:35:ef就是⼀个MAC地址,其中前6位16进制数d8:9a_34代表⽹络硬件制造商的编号,它由IEEE(电⽓与电⼦⼯程师协会)分配,⽽后6位16进制数34:35:ef代表该制造商所制造的某个⽹络产品(如⽹卡)的系列号。
wireshark protobuf 解析 -回复

wireshark protobuf 解析-回复如何使用Wireshark解析Protobuf数据包Wireshark是一种流行的网络协议分析工具,它可以帮助我们深入了解网络通信过程中的数据包。
然而,当我们遇到使用Protobuf进行编码的数据包时,解析这些数据包可能会变得复杂起来。
在本文中,我将详细介绍如何使用Wireshark正确解析Protobuf数据包,帮助您更好地理解网络通信过程中的数据传输。
1. 确认Wireshark版本及配置首先,确保您已经安装了最新版本的Wireshark,并且已经正确配置好了相关选项。
打开Wireshark并进入“Edit”>“Preferences”菜单,确保“Protocols”选项卡中的“Protobuf”已经被选中。
如果没有选中,勾选该选项并保存更改。
2. 捕获数据包连接到需要分析的网络,并在Wireshark的主界面使用适当的过滤器来捕获相关的数据包。
如果您已经知道待解析的数据包是使用Protobuf编码的,您可以使用过滤器"protobuf"来捕获与Protobuf相关的数据包。
捕获数据包后,您将看到屏幕上显示的原始数据包列表。
3. 选择要解析的数据包在列表中选择一个使用Protobuf编码的数据包,右键点击该数据包并选择“Follow”>“Protobuf”>“Decode as”选项,然后选择与您的协议相对应的消息类型。
4. 解析Protobuf数据包在选择了正确的数据包和消息类型后,Wireshark将使用Protobuf解码器尝试解析该数据包。
在解析完成后,您将看到解析结果在Wireshark的主界面中以树状结构呈现。
5. 查看解析结果通过展开树状结构,您可以查看Protobuf数据包中的不同字段和值。
Wireshark将为您解析和展示每个字段的名称、类型和值。
您还可以查看嵌套的消息类型以及各字段的编码方式等细节。
攻防世界-Misc高手进阶区部分Writeup

攻防世界-Misc⾼⼿进阶区部分Writeup 1.Training-Stegano-1WinHex打开,得到flag2.wireshark-1⽤Wireshark打开之后,先查找其中的HTTP在⼀处HTTP中找到了⽹站的信息在keyword⼀⾏追踪TCP流,发现flag3.János-the-Ripper⽤WinHex打开,发现前缀是zip⽂件前缀把⽂件后缀名改成.zip⽂件,打开之后发现是加密⽂件爆破得到密码:fish输⼊密码,解压,得到flag4.Test-flag-please-ignore记事本打开,发现⼀串16进制字符16进制转⽂本字符串,得到flag5.Banmabanma⼀看就是条形码,打开⽹站,扫描,得到flag,⽹站地址6.Hear-with-your-Eyes下载好⽂件之后解压,发现⾥⾯有个没有后缀的⽂件,放到winhex⾥观察,⽂件头是1f8b0800,百度搜了搜发现是个zip⽂件的⽂件头,于是把后缀改为zip 解压,有⼀个wav后缀的⾳频⽂件,⽤audacity打开这个⾳频⽂件,然后调⾄频谱图,出现flag7.pure_color⽤Stegsolve打开,发现flag8.What-is-this⽤WinHex打开,发现是两个⽂件,改成压缩包.zip的格式,解压,发现两张图⽚,⽤Stegsolve打开,图⽚合并得到flag9.base64÷4题⽬告诉是base16解码得到flag10.embarrassWireshark找了半天没找到,百度⼀下才发现是⽤HxD打开⽤WinHex打开,Ctrl+F,直接获得flag11.神奇的ModbusWireshark打开,追踪tcp流,得到flag(虽然在wireshark中显⽰的是Easy_Mdbus,但得写成Easy_Modbus才能提交成功)12.快乐游戏题还真是⼀个游戏,赢了就得到flag了quipqiup词频分析,得到flag14.肥宅快乐题这个题⽬下载到⼿是⼀个.swf后缀的⽂件,⽤到⼀个特殊的⼯具,叫做potplayer把这个.swf⽂件使⽤这个⼯具打开在放到57帧的时候,出现了下⾯的对话有⼀段base64:提取出来:U1lDe0YzaVpoYWlfa3U0aWxlX1QxMTF9base64解码得flag:SYC{F3iZhai_ku4ile_T111}15.easycap打开⽂件,追踪tcp流,得到flag16.签到题给了⼀串字符串:Z2dRQGdRMWZxaDBvaHRqcHRfc3d7Z2ZoZ3MjfQ==base64解密:ggQ@gQ1fqh0ohtjpt_sw{gfhgs#}栅栏密码7字⼀栏:ggqht{ggQht_gsQ10jsf#@fopwh}凯撒密码位移14:ssctf{ssCtf_seC10ver#@rabit}17.Excaliflag⽤Stegsolve打开,得到flag:3DS{Gr4b_Only_th1s_B1ts}(看flag是真费眼睛)18.Get-the-key.txt⽤WinHex打开,发现是个压缩包,⽂件后缀改成.zip打开key.txt,得到flag:SECCON{@]NL7n+-s75FrET]vU=7Z}19.misc1给出⼀串16进制字符串,ASCII码只有0-127,⽽发现这⼀串16进制字符串化成⼗进制后都⼤于128所以转化成⼗进制之后再减去128,再转成ASCII码,代码如下:char = "d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd" for i in range(0,len(char),2):print(chr(int(char[i:i+2],16)-128),end="")运⾏得到flag:20.2017_Dating_in_Singapore题⽬描述给出了⼀串字符串,复制到txt⽂本上,“-”肯定是分隔,每段字符通过观察⼜都是2的倍数,所以↓这样两两分隔开来然后题⽬附件给出了⼀个⽇历,通过观察txt⽂本上的数字,发现都不超过31,⽽且是12⾏对应12个⽉份,于是猜测在⽇历上找到对应⽇期:得到flag:HITB{CTFFUN}21.can_has_stdio?记事本打开,发现是Brainfuck编码,去解码,得到flag22.Erik-Baleog-and-Olaf⽤WinHex打开,发现是png头,后缀改为.png⽤Stegsolve打开发现有⼀个很⼩的⼆维码,直接扫,扫不出来,不断切换找到⼀张最清的⼆维码:⽤截图⼯具截个图:再把这张图放进 stegsolve中,找到⼀张更清的图⽚,保存下来扫描得到flag:flag{#justdiffit}23.适合作为桌⾯⽤Stegsolve打开,发现⼀张⼆维码扫码之后得到⼀串字符串WinHex新建⽂件观察可知通过保存为pyc⽂件,反编译,得到python代码,运⾏,得到flag24.⼼仪的公司⽤Wireshark打开,http筛选,追踪tcp流,得到fl ag25.stage1和“适合作为桌⾯”⼀个解法,前⾯有说,python代码如下:str = [65,108, 112,104,97,76,97,98]flag = ''for i in str:flag += chr(i)print flag运⾏,得到flag:AlphaLab26.很普通的数独下载发现是⼀堆数独图⽚,把有数字的记为1,没有数字的记为0,结果保存在txt⽂本中(这个是真的折磨⼈,直接上⽹上找⼤佬弄完的看了) 111111101010101000101000001111110000101111111100000101100111101010011101100011001001000001101110101110011111010011111101000101001011101101110101101100010001010000011110001101011101101110100011100100001111101111111011101011101100000101100100000011000100001110100001000001111111101010101010101010101010101011101111111000000000011001101001000110100110011100000000110011100100100001111111100100101000000101111101001001011111111101110101011110101101001100100000111100100100000110001101001101010001010001100010011010001010011000100000010110010000010110101010001111110100011101001110101101111100011000100011100111011101101100101101110001001100110100000000010010000111100101101011010101000001011010111110011011111101001110100011110111110111011001101100010100001110000100000110101000010101000011101101101110101101001100010011111110001011111010001000011011101101100011001011001010101100011110101001100001010010010111111111101011111111101101101111111111100011110001100000100001000101000100100100011110111110101110011100111010110100110100101010010110010001011101011101000111100000011100010000101011111011100111101111111100001010111110010110100011000111000100111101101111101000100010111101111110001001000011010110001111110111110011001010101000110010100010001000101101010001011101110101101101100100001101101000111101001110110001001101100010101101111110100101100110000011100111000000000100001010101111100010010111010010011110011101110010100001011111010010101001100010111111110100000100001010101010100000010011001001101110101001111100101111101101000010111101110001101011000001000101110100110011110011010100010100000011011000001110010000100110100100001101111111101100101110111110011000000001111110101101000101011100100100011010111111100011111011011010101101110011101011110100000101110101101101000111110010001100010001101110101011100001111111101101001000111111011101110100110111101101000001001101100011101101101110100000011101100001101010110010010010001100000101011001011111011001011000011010110000111111101010101001111011110101101110000101101通过python代码将01进制转换为图⽚,得到⼀张⼆维码from PIL import Imagex = 45y = 45im = Image.new('RGB', (x, y))white = (255, 255, 255)black = (0, 0, 0)with open('file.txt') as f:for i in range(x):ff = f.readline()for j in range(y):if ff[j] == '1':im.putpixel((i, j), black)else:im.putpixel((i, j), white)im.save("1.jpg")扫描得到⼀串字符串:Vm0xd1NtUXlWa1pPVldoVFlUSlNjRlJVVGtOamJGWnlWMjFHVlUxV1ZqTldNakZIWVcxS1IxTnNhRmhoTVZweVdWUkdXbVZHWkhOWGJGcHBWa1paZWxaclpEUmhNVXBYVW14V2FHVnFRVGs base64多次解码得到flag:flag{y0ud1any1s1}27.很普通的Disco是wav⾳频⽂件,⽤audacity打开,在开头部分发现⼀段诡异的⾳乐,放⼤上⾯是1,下⾯是0,得到:110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101,总共105个01字符,每15个⼀组,共7组,先转化为⼗进制,再把⼗进制转换为ASCII码,python代码如下a='110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101'flag=''for i in range(15):b=a[i*7:i*7+7]c=int(b,2)flag+=chr(c)print(flag)运⾏,得到flag:flag{W0W*funny}28.miscmisc⽤Winhex打开,发现是个压缩包,⽂件后缀改成.zip,解压,得到⼀个压缩包和⼀个图⽚,图⽚看了⼀眼,没什么⽤,压缩包是加密的,于是⽤Ziperello暴⼒破解密码:解压得到:flag.txt是假的...解压flag.zip得到⼀个加密压缩包,⼀个doc⽂档和⼀张图⽚先看图⽚,告诉密码在world.doc⾥⾯⽤Stegsolve打开图⽚,在LSB BGR条件下发现pass,所以这是LSB信息隐写得到pass:z^ea,然后打开world.doc,发现只有下⾯这样⼀段⽂字Ctrl+A全选,右键——字体——隐藏⽂字发现了隐藏字符pass内容+world⾥每⾏字符串的最后⼀个字符,就是密码:z^ea4zaa3azf8解压得到flag29.隐藏的信息给出了⼀堆⼋进制数,转成⼗进制再转成字符,得到⼀串base64编码char = "126062126163142103102153142062065154111121157113111105132163131127143066111105154124121060116067124152102146115107065154130062116150142154071172144104102167130063153167144130060113" for i in range(0,len(char),3):print(chr(int(char[i:i+3],8)),end="")base64解码,得到flag30.2-1⽤Winhex打开,发现⽂件头出错,改为89 50,然后宽度改为02 C5,图⽚就可以打开了31.Aesop_secret打开是⼀张GIF图⽚,发现每⼀帧位置都不⼀样,⽤PS把每⼀帧都显⽰出来,然后⽤WinHex打开这张GIF发现⼀串字符串,试了⼀下不是Base64,根据题⽬名字猜测是AES加密,解密两次得到flag32.a_good_idea打开是⼀张图⽚,⽤WinHex打开发现PK,猜测是压缩包,后缀改为.zip,解压得到⼀个提⽰和两张图⽚,⽤Stegsolve将两张图⽚结合在⼀起,得到⼀张图⽚,保存之后再⽤Stegsolve打开,发现⼀张⼆维码,扫描得到flag:NCTF{m1sc_1s_very_funny}33.reverseMe打开图⽚是⼀张翻转倒⽴的图⽚,直接翻转,得到flag34.Reverse-it打开⽂件,⽤WinHex打开,发现是JPG⽂件倒序,修改后缀为JPG⽂件复制16进制⽂件,倒序输出得到正确的16进制⽂件,新建WinHex⽂件,粘贴16进制⽂件得到⼀张倒转的图⽚,翻转再调整位置,得到flag35.something_in_image_下载附件之后,改为txt⽂件,搜索得到flag36.打野使⽤zsteg查看路径,得到flag37.倒⽴屋lsb隐写,⽤Stegsolve打开,发现ISCC2019,根据题⽬名字,猜测倒着输⼊就是flag:flag{9102_cCsI}38.再见李华⽤WinHex打开,在最下⾯发现.txt⽂件和压缩包⽂件头,后缀改为.zip,发现⼀个加密的.txt⽂件,根据题⽬描述,不少于1000字→8的⼆进制,所以密码不少于9位数;记得署名→密码后⼏位是LiHua,AZRP爆破,得到密码:15CCLiHua,打开之后得到flag。
Wireshark教程,看完这个,你也是大神!!!

抓取报文:下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包。
例如,如果想要在无线网络上抓取流量,点击无线接口。
点击Capture Options 可以配置高级属性,但现在无此必要。
点击接口名称之后,就可以看到实时接收的报文。
Wireshark会捕捉系统发送和接收的每一个报文。
如果抓取的接口是无线并且选项选取的是混合模式,那么也会看到网络上其他报文。
上端面板每一行对应一个网络报文,默认显示报文接收时间(相对开始抓取的时间点),源和目标IP地址,使用协议和报文相关信息。
点击某一行可以在下面两个窗口看到更多信息。
“+”图标显示报文里面每一层的详细信息。
底端窗口同时以十六进制和ASCII码的方式列出报文内容。
需要停止抓取报文的时候,点击左上角的停止按键。
色彩标识:进行到这里已经看到报文以绿色,蓝色,黑色显示出来。
Wireshark通过颜色让各种流量的报文一目了然。
比如默认绿色是TCP报文,深蓝色是DNS,浅蓝是UDP,黑色标识出有问题的TCP报文——比如乱序报文。
报文样本:比如说你在家安装了Wireshark,但家用LAN环境下没有感兴趣的报文可供观察,那么可以去Wireshark wiki下载报文样本文件。
打开一个抓取文件相当简单,在主界面上点击Open并浏览文件即可。
也可以在Wireshark里保存自己的抓包文件并稍后打开。
过滤报文:如果正在尝试分析问题,比如打电话的时候某一程序发送的报文,可以关闭所有其他使用网络的应用来减少流量。
但还是可能有大批报文需要筛选,这时要用到Wireshark过滤器。
最基本的方式就是在窗口顶端过滤栏输入并点击Apply(或按下回车)。
例如,输入“dns”就会只看到DNS报文。
输入的时候,Wireshark会帮助自动完成过滤条件。
也可以点击Analyze菜单并选择Display Filters来创建新的过滤条件。
winshark教程1

一、Wireshark简介Wireshark是一个有名的网络端口探测器,是可以在Windows、Unix等各种平台运行的网络监听软件,它主要是针对TCP/IP协议的不安全性对运行该协议的机器进行监听。
其功能相当于Windows下的Sniffer,都是在一个共享的网络环境下对数据包进行捕捉和分析,而且还能够自由地为其增加某些插件以实现额外功能。
Ethernet网络监测工具可在实时模式或离线模式中用来捕获和分析网络通信。
下面是使用Wireshark 可以完成的几个工作:l 网络管理员使用它去帮助解决网络问题l 网络安全工程师用它去测试安全问题l 开发人员用它是调试协议的实现过程l 用它还可以帮助人员深入的学习网络协议l 支持UNIX 平台和Windows 平台。
l 从网络接口上捕获实时数据包l 以非常详细的协议方式显示数据包l 可以打开或者存贮捕获的数据包l 导入/导出数据包,从/到其它的捕获程序l 按多种方式过滤数据包l 按多种方式查找数据包l 根据过滤条件,以不同的颜色显示数据包l 可以建立多种统计数据其最常用的功能是被攻击者用来检测被攻击电脑通过23(telnet)和110(pop3)端口进行的一些明文传输数据,以轻松得到用户的登录口令和邮件账号密码。
对于网络管理员来说,也可以通过抓包分析,来确定一些异常的流量和局域网内部的非正常用户与外界的通信,比如说对于现在比较占用网络带宽的诸如Bit T orrent等P2P应用软件流量,通过使用该软件确定这些流量,网络管理员就可以使用流量控制(T C)的方法来规范、合理的分配带宽资源,提高网络的利用率。
二、下载安装WiresharkWireshark可以在/download/上下载,该软件有极其方便和友好的图形用户界面,并且能够使得用户通过图形界面的配置和选择,针对多块网卡、多个协议进行显示,效果非常好。
目前最新版本为:Wireshark 0.99。
Wireshark安装后自动安装winpcap 4.0 ,Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个GPL项目。
01-Wireshark抓包工具介绍

Wireshark 可以捕捉多种网络接口类型的包,包括是无线局域网接口。 Wireshark可以支持许多协议的解码,如IP,TCP,RTP,H.264等。 Wireshark可以用来检测网络安全隐患、解决网络问题,用来学习网络协议、测试协议 运行情况等。
Wireshark不处理网络数据,仅是监测网络。Wireshark不会发送网络包或做其它 数据处理。界面如下:
"File"(文件) ——打开或保存捕获的信息。 "Edit" (编辑)——查找或标记封包。进行全局设置。
"View"(查看) ——设置Wireshark的视图。
"Go" (转到)——跳转到捕获的数据。 "Capture"(捕获)——设置捕捉过滤器并开始捕捉。
"Analyze"(分析)——设置分析选项。
HUAWEI TECHNOLOGIES CO., LTD.
华为保密信息,未经授权禁止扩散
Page 14
2.1 Wireshark抓包环境准备
2. 在通过利用hub集线器将被检测端口的数据复制多路进行捕获;
HUAWEI TECHNOLOGIES CO., LTD.
华为保密信息,未经授权禁止扩散
Page 15
HUAWEI TECHNOLOGIES CO., LTD.
华为保密信息,未经授权禁止扩散
Page 29
Thank you
华为保密信息,未经授权禁止扩散
Page 22
h225||h245||q931 说明:协议h.225或h.245或q.931的所有报文
HUAWEI TECHNOLOGIES CO., LTD.
wireshark数据包分析实战第一章

wireshark数据包分析实战第⼀章1,数据包分析⼯具:tcpdump、wireshark。
前者是命令⾏的,后者是图形界⾯的。
分析过程:收集数据、转换数据(⼆进制数据转换为可读形式)、分析数据。
tcpdump不提供分析数据,只将最原始的数据展现给分析⼈员。
⼤⽜使⽤tcpdump较多。
⽽wireshark可以根据数据包的内容进⾏分析,划分出不同类型的协议数据包等。
2,可以将⽹卡设置成混杂模式,⽹卡将抓取⼀个⽹段的所有⽹络通信流量,⽽不仅是发往它的数据包。
3,集中⽹络硬件:集线器、交换机、路由器。
集线器:物理层上的转发设备A计算机通过集线器发往计算机B,计算机C、D都会收到数据包,只是通过MAC地址⽐较发现不是传给⾃⼰的⽽将其丢弃。
B收到发现是传给⾃⼰的,⽽将其传递给上层。
集线器⽬前不怎么流⾏。
因为会产⽣不必要的⽹络流量。
如C、D都会收到数据包并丢弃。
交换机:交换机可以将数据包发送到指定的计算机。
⽐如这⾥的A计算机发给B计算机的数据包,并不会发送到C、D计算机上。
因为,交换机维护⼀张CAM(内容寻址寄存器),存放着每个设备的MAC地址。
从⽽⼤⼤降低⽹络流量。
路由器:路由器⼯作在第三层,负责在⽹络间转发数据包。
路由器在⽹络间引导数据包流向叫做路由。
通过路由表实现。
4,⼴播:⼴播数据包会被发送到⼀个⽹段的所有端⼝,⽽⽆论这个端⼝是连接在集线器还是交换机上。
⼴播域,任意计算机可以不通过路由器即可进⾏直接传输的⽹段范围。
5,多播:将单⼀来源数据包同时传输给多个⽬标的通信⽅式。
D类IP地址都是多播地址。
Wireshark抓包分析TCP.IP.UDP.ICMP报文格式(移动互联网方向)

Wireshark抓包分析TCP.IP.UDP.ICMP报⽂格式(移动互联⽹⽅向)TCP 报⽂格式分析:TCP 报⽂段的报头有 10 个必需的字段和 1 个可选字段。
报头⾄少为 20 字节。
1)源端⼝(16位):标识发送报⽂的计算机端⼝或进程。
⼀个 TCP 报⽂段必须包括源端⼝号,使⽬的主机知道应该向何处发送确认报⽂。
2)⽬的端⼝(16位):标识接收报⽂的⽬的主机的端⼝或进程。
由抓包数据可得源端⼝号为12762,⽬的端⼝号为803)序号(也叫序列号)(32位):⽤于标识每个报⽂段,使⽬的主机可确认已收到指定报⽂段中的数据。
当源主机⽤于多个报⽂段发送⼀个报⽂时,即使这些报⽂到达⽬的主机的顺序不⼀样,序列号也可以使⽬的主机按顺序排列它们。
在建⽴连接时发送的第⼀个报⽂段中,双⽅都提供⼀个初始序列号。
TCP 标准推荐使⽤以 4ms 间隔递增 1 的计数器值作为这个初始序列号的值。
使⽤计数器可以防⽌连接关闭再重新连接时出现相同的序列号。
序列号表达达到2^32 - 1后⼜从0开始,当建⽴⼀个新的连接时,SYN标志为1,系列号将由主机随机选择⼀个顺序号由图可得现序列号为25e4d8a84)确认号(32位):⽬的主机返回确认号,使源主机知道某个或⼏个报⽂段已被接收。
如果 ACK 控制位被设置为 1,则该字段有效。
确认号等于顺序接收到的最后⼀个报⽂段的序号加 1,这也是⽬的主机希望下次接收的报⽂段的序号值。
返回确认号后,计算机认为已接收到⼩于该确认号的所有数据。
由图可得现确认号为59eafa0c5)数据偏移(⾸部长度)(4位)TCP 报⽂段的数据起始处距离 TCP 报⽂段的起始处有多远,即⾸部长度。
由于 TCP 报头的长度随 TCP 选项字段内容的不同⽽变化,因此报头中包含⼀个指定报头字段的字段。
该字段以 32 ⽐特为单位,所以报头长度⼀定是 32 ⽐特的整数倍,有时需要在报头末尾补 0 。
由抓包图有偏移量在0x50中,占4bit,0x50转化为⼆进制数0101 0000 所以偏移量是 0101=5,所以TCP报⽂⾸部长度为5* 4 = 20字节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Wireshark学习笔记1.简介2.Wireshark功能模块下图给出了wireshark功能模块:a)GTK1/2处理用户的输入输出显示,源码在gtk目录.b)Core核心模块,通过函数调用将其他模块连接在一起,源码在根目录c)Epanwireshark Packetage Analyzing,包分析引擎,源码在epan目录●Protocol-Tree:保存数据包的协议信息,wireshark的协议结构采用树形结构,解析协议报文时只需要从根节点通过函数句柄依次调用各层解析函数即可。
●Dissectors:在epan/dissector目录下,各种协议解码器,支持700+种协议解析,对于每种协议,解码器都能识别出协议字段(field),并显示出字段值(field value)由于网络协议种类很多,为了使协议和协议间层次关系明显,对数据流里的各个层次的协议能够逐层处理,wireshark系统采用了协议树的方式。
●Plugins:一些协议解码器以插件形式实现,源码在plugins目录●Display-Filters:显示过滤引擎,源码在epan/dfilter目录d)Capture捕包引擎,利用libpcap/WinPcap从底层抓取网络数据包,libpcap/WinPcap提供了通用的抓包接口,能从不同类型的网络接口(包括以太网,令牌环网,ATM网等)获取数据包。
e)Wiretap从文件中读取数据包,支持多种文件格式,源码在wiretap目录f)Win-/libpcapWireshark抓包时依赖的库文件wireshark功能模块3.wireshark流程分析1)初始化Wireshark的初始化包括一些全局变量的初始化、协议分析引擎的初始化和Gtk相关初始化,显示Ethereal主窗口,等待用户进一步操作。
重点就是Epan模块的初始化。
Epan初始化:⏹tvbuff初始化:全局变量tvbuff_mem_chunk指向用memchunk分配的固定大小的空闲内存块,每个内存块是tvbuff_t结构,从空闲内存块中取出后,用来保存原始数据包。
⏹协议初始化:◆全局变量:●proto_names●proto_short_names●proto_filter_names以上三个全局变量主要用来判断新注册的协议名是否重复,如果重复,给出提示信息,在协议解析过程中并没有使用。
◆协议注册:●注册协议:将三个参数分别注册给proto_names、proto_short_names、proto_filter_names三个全局变量中,●注册字段,需要在wireshark协议树显示的报文内容字段。
●协议解析表◆Handoff注册●将协议与父协议节点关联起来⏹Packet(包)初始化◆全局变量:●frame_handle:协议解析从frame开始,层层解析,直到所有的协议都解析完为止。
frame_handle保存了frame协议的handle。
●data_handle:有的协议无法从frame开始,那么就从data开始。
原理同frame。
⏹读配置文件preference⏹读capture filter和display filter文件,分别保存在全局变量capture_filter和display_filter中。
⏹读disabled protocols文件,保存全局变量global_disabled_protos和disabled_protos中⏹初始化全局变量cfile◆Cfile是个重要的变量,数据类型为capture file,它保存了数据包的所有信息,⏹取得命令行启动时,参数列表,并进行相应的处理2)处理流程Wireshark初始化完成以后进入实际处理阶段,主程序创建抓包进程,捕包进程和主程序是通过PIPE进行传递数据的,主程序把抓取的数据写入临时文件,通过函数add_packet_to_packet_list将数据包加入包列表。
处理时,主程序从列表中选取一个数据包,提取该数据包中的数据填写在数据结构中,最后调用协议解析函数epan_dissect_run进行处理,从epan_dissect_run开始,是实际的协议解析过程,下面以HTTP协议报文为例,流程如下:a)解析frame层调用函数dissect_frame对frame层进行解析,并在协议树上填充相应字段信息。
函数最后会判断是否有上层协议封装,如果有则调用函数dissector_try_port在协议树上查找对应的解析函数,这里函数dissector_try_port根据pinfo->fd->lnk_t查找对应的上层协议处理函数,pinfo->fd->lnk_t值为1,上层封装协议为以太网协议,全局结构体指针变量dissector_handle 当前的协议解析引擎句柄置为dissect_eth_maybefcs,至此,frame层解析结束。
b)解析以太网层函数call_dissector_work根据dissector_handle调用frame上层协议解析函数dissect_eth_maybefcs对以太网层进行解析,并在协议树上填充相应字段,包括目的MAC地址和以太网上层协议类型等信息。
函数最后会判断是否有上层协议封装,如果有则调用函数dissector_try_port在协议树上查找对应的解析函数,这里函数dissector_try_port根据etype 查找对应的上层协议处理函数,以太网字段etype为0800的报文是ip报文,上层封装协议为IP协议,全局结构体指针变量dissector_handle当前的协议解析引擎句柄置为dissect_ip,至此,以太网层解析结束。
c)解析IP层函数call_dissector_work根据dissector_handle调用以太网上层协议解析函数dissect_ip对以太网层进行解析,并在协议树上填充相应字段,包括版本号,源地址,目的地址等信息。
函数最后会判断是否有上层协议封装,如果有则调用函数dissector_try_port在协议树上查找对应的解析函数,这里函数dissector_try_port根据nxt (nxt = iph->ip_p)查找对应的上层协议处理函数,以太网字段nxt为06的报文是TCP报文,上层封装协议为TCP协议,全局结构体指针变量dissector_handle当前的协议解析引擎句柄置为dissect_tcp,至此,IP层解析结束。
d)解析TCP层函数call_dissector_work根据dissector_handle调用以太网上层协议解析函数dissect_tcp对TCP层进行解析,包括对TCP头的解析和选项字段的解析,并在协议树上填充相应字段,包括源端口,目的端口,标志位等信息。
函数最后会判断是否有上层协议封装,如果有则调用函数dissector_try_port在协议树上查找对应的解析函数,这里函数dissector_try_port根据port查找对应的上层协议处理函数,将源端口和目的端口分别赋值给low_port和high_port,根据low_port和high_port分别匹配上层协议解析函数,port为80的报文是HTTP报文,上层封装协议为HTTP协议,全局结构体指针变量dissector_handle当前的协议解析引擎句柄置为dissect_http,至此,TCP层解析结束。
e)解析HTTP层至此wireshark进入应用层协议检测阶段,wireshark解析dissect_http函数中注册的字段,并提取相应的字段值添加到协议树中,应用层的具体解析流程将在下面介绍。
HTTP协议具体函数调用过程参见:重要的数据结构struct _epan_dissect_t {tvbuff_t *tvb;//用来保存原始数据包proto_tree *tree;//协议树结构packet_info pi;//包括各种关于数据包和协议显示的相关信息};/** Each proto_tree, proto_item is one of these. */typedef struct _proto_node {struct _proto_node *first_child;//协议树节点的第一个子节点指针struct _proto_node *last_child; //协议树节点的最后一个子节点指针struct _proto_node *next; //协议树节点的下一个节点指针struct _proto_node *parent;//父节点指针field_info *finfo;//保存当前协议要显示的地段tree_data_t *tree_data;//协议树信息} proto_node;typedef struct _packet_info {const char *current_proto; //当前正在解析的协议名称column_info *cinfo; //wireshark显示的信息frame_data *fd;//现在分析的原始数据指针union wtap_pseudo_header *pseudo_header;//frame类型信息GSList *data_src; /*frame层信息*/address dl_src; /* 源MAC */address dl_dst; /*目的MAC */address net_src; /* 源IP */address net_dst; /*目的IP */address src; /*源IP */address dst; /*目的IP */guint32 ethertype; /*以太网类型字段*/guint32 ipproto; /* IP协议类型*/guint32 ipxptype; /* IPX 包类型*/guint32 mpls_label; /* MPLS包标签*/circuit_type ctype;guint32 circuit_id; /*环路ID */const char *noreassembly_reason; /* 重组失败原因*/gboolean fragmented; /*为真表示未分片*/gboolean in_error_pkt; /*错误包标志*/port_type ptype; /*端口类型*/guint32 srcport; /*源端口*/guint32 destport; /*目的端口*/guint32 match_port; /*进行解析函数匹配时的匹配端口*/ const char *match_string; /*调用子解析引擎时匹配的协议字段指针*/ guint16 can_desegment; /* 能否分段标志*/guint16 saved_can_desegment;int desegment_offset; /*分段大小*/#define DESEGMENT_ONE_MORE_SEGMENT 0x0fffffff#define DESEGMENT_UNTIL_FIN 0x0ffffffeguint32 desegment_len;guint16 want_pdu_tracking;guint32 bytes_until_next_pdu;int iplen; /*IP包总长*/int iphdrlen; /*IP头长度*/int p2p_dir;guint16 oxid; /* next 2 fields reqd to identify fibre */guint16 rxid; /* channel conversations */guint8 r_ctl; /* R_CTL field in Fibre Channel Protocol */guint8 sof_eof;guint16 src_idx; /* Source port index (Cisco MDS-specific) */guint16 dst_idx; /* Dest port index (Cisco MDS-specific) */guint16 vsan; /* Fibre channel/Cisco MDS-specific *//* Extra data for DCERPC handling and tracking of context ids */guint16 dcectxid; /* Context ID (DCERPC-specific) */int dcetransporttype;guint16 dcetransportsalt; /* fid: if transporttype==DCE_CN_TRANSPORT_SMBPIPE */#define DECRYPT_GSSAPI_NORMAL 1#define DECRYPT_GSSAPI_DCE 2guint16 decrypt_gssapi_tvb;tvbuff_t *gssapi_wrap_tvb;tvbuff_t *gssapi_encrypted_tvb;tvbuff_t *gssapi_decrypted_tvb;gboolean gssapi_data_encrypted;guint32 ppid; /* SCTP PPI of current DATA chunk */guint32 ppids[MAX_NUMBER_OF_PPIDS]; /* The first NUMBER_OF_PPIDS PPIDS which are present * in the SCTP packet*/void *private_data; /* pointer to data passed from one dissector to another *//* TODO: Use emem_strbuf_t instead */GString *layer_names; /* layers of each protocol */guint16 link_number;guint8 annex_a_used;guint16 profinet_type; /* the type of PROFINET packet (0: not a PROFINET packet) */void *profinet_conv; /* the PROFINET conversation data (NULL: not a PROFINET packet) */ void *usb_conv_info;void *tcp_tree; /* proto_tree for the tcp layer */const char *dcerpc_procedure_name; /* Used by PIDL to store the name of the current dcerpc procedure */struct _sccp_msg_info_t* sccp_info;guint16 clnp_srcref; /* clnp/cotp source reference (can't use srcport, this would confuse tpkt) */guint16 clnp_dstref; /* clnp/cotp destination reference (can't use dstport, this would confuse tpkt) */guint16 zbee_cluster_id; /* ZigBee cluster ID, an application-specific message identifier that* happens to be included in the transport (APS) layer header.*/guint8 zbee_stack_vers; int link_dir;/* 3GPP messages are sometime different UP link(UL)。