最近实验室布置了一个作业:首先编写通信程序,后利用wireshark对我编写的通信程序中传递的数据包进行抓取并进行解析。

一、本地回环数据包的抓取

首先是通信程序的编写,编写了基于socket的通信程序,为了简便讲解,以下我选取了一个非常简单的socket通信程序:

import socket
import sys
HOST=''
PORT=6666
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

try:
    s.bind((HOST,PORT))
except socket.error:
    print('Bind failed.')
    sys.exit()
print('Socket bind complete')
s.listen(10)
print ('Socket now listening')
conn, addr = s.accept()
print( 'Connected with ' + addr[0] + ':' + str(addr[1]))
received_mes=conn.recv(4096)
print(received_mes.decode())
data='received successfully'
conn.sendall(data.encode())
import socket
import sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket Created')
host = '127.0.0.1'
port = 6666
try:
    remote_ip = socket.gethostbyname(host)
except socket.gaierror:
    print('Hostname could not be resolved. Exiting')
    sys.exit()
print('Ip address of ' + host + ' is ' + remote_ip)
s.connect((host, port))
print('Socket Connected to ' + host + ' on ip ' + remote_ip)
message= ("hello server")
try:
    s.send(message.encode())
except socket.error:
    print('Send failed')
    sys.exit()
print('Message send successfully')
reply = s.recv(4096)
print(reply.decode())

两代码分别代表服务端与客户端,首先为了方便,我将客户端的ip设置为127.0.0.1,读者可以发现,此程序即为在本机上进行通信,但是传统的Wireshark自带的Winpcap嗅探器,无法对本地回环的流量包进行抓取,而如今的新兴嗅探器:Npcap可以实现这一点。于是我在已经安装了Winpcap的电脑上,进行了Npcap的安装。方法如下:

1.首先将Winpcap卸载,可以利用Winpcap自带的卸载工具进行,卸载完毕后,进行Npcap的安装,如果成功安装,那真是太好了,重新启动Wireshark后,可以看到捕获器的一栏中多了一个Npcap的选项,点击后即可进行抓取。

https://github.com/nmap/npcap/releases:Npcap的安装链接。

2.但很多人在安装Npcap时,可能会遇到下述的问题:

遇到此类问题,有三种解决方式:

1.可能是由于Winpcap卸载不彻底导致的,可以手动找到Winpcap的残留文件,进行删除:

winpcap关键模块
32位系统:

C:\Windows\system32\wpcap.dll
C:\Windows\system32\Packet.dll
C:\Windows\system32\WanPacket.dll
C:\Windows\system32\pthreadVC.dll
C:\Windows\system32\drivers\npf.sys
64位系统:

C:\Windows\SysWOW64\wpcap.dll
C:\Windows\SysWOW64\Packet.dll
C:\Windows\SysWOW64\WanPacket.dll
C:\Windows\SysWOW64\pthreadVC.dll
C:\Windows\System32\drivers\npf.sys
删除完毕后,再进行Npcap的安装,看是否成功。

2.若方法1无法实现,则我们首先将Wireshark等软件全部卸载,按方法1,将系统内的残留文件一并删除后,先安装Npcap,再安装Wireshark,之后看能否成功。

3.可以访问Npcap官网,禁用组服务,https://nmap.org/npcap/,看能否解决问题

若三种方法均不能解决,那很遗憾,我也没有其他的解决方法(我就是这么的不幸)

于是我决定,不进行本地的回环数据包的抓取,而进行宿主机与虚拟机的通信

二、宿主机、虚拟机数据包的抓取

为了能够使宿主机与虚拟机进行通信,我们首先需要使虚拟机同宿主机连通,在这里我们选用NAT连接模式,对虚拟机与宿主机的ip进行设置,使其在同一个局域网内。

如图为虚拟机的ip设置:

如图为宿主机的ip设置:

通过ipv4和子网掩码将其设置到同一个局域网里,之后我们将socket通信程序中的ip地址稍作改动(例如我们将宿主机作为客户端,将其连接的IP地址设置为虚拟机的IP地址。

import socket
import sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket Created')
host = '192.168.236.190'
port = 6666
try:
    remote_ip = socket.gethostbyname(host)
except socket.gaierror:
    print('Hostname could not be resolved. Exiting')
    sys.exit()
print('Ip address of ' + host + ' is ' + remote_ip)
s.connect((host, port))
print('Socket Connected to ' + host + ' on ip ' + remote_ip)
message= ("hello server")
try:
    s.send(message.encode())
except socket.error:
    print('Send failed')
    sys.exit()
print('Message send successfully')
reply = s.recv(4096)
print(reply.decode())

之后进行通信,如上述公式,客户端像服务端发送了:hello server 服务器像客户端回复了一句话:message send successfully.

我们利用wireshark进行数据包的抓取:

可以看到宿主机向虚拟机发送的数据:hello server

通过上述流程,我们锻炼了最基本的网络编程能力、wireshark抓包、局域网的ip设置、虚拟机的使用以及上网查找资料等动手能力,希望对大家有所帮助。

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐