Python网络包拦截并修改response

博客介绍了将站点指向本地的方法,可借助https://github.com/oldj/SwitchHosts 实现,还提及了使用脚本,但未详细说明脚本相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:https://blog.youkuaiyun.com/wang471003247/article/details/52632599

1.首先将站点指向本地 使用https://github.com/oldj/SwitchHosts

2.使用脚本

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

HOST = "127.0.0.1"
PORT = 80

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "text/html")
        self.end_headers()
        self.wfile.write("<html>hello</html>")

def run_server():
    server = HTTPServer((HOST, PORT), RequestHandler)
    server.serve_forever()

if __name__ == "__main__":
    # redirect www.x.x.x to 127.0.0.1 in hosts
    run_server()


原理:
修改host文件后访问原始网站变成了访问本地,因此本地需要一台服务器。工具1干的就是这个事情,用ApateDNS 修改的是全局的,没这个必要。
工具2做的就是充当服务器的事情。目前只处理了http的请求,当然也可以加上post等handler。果然python大法好,这个server模块也是自带的。

这种方式对于突破网络验证来说,在知道请求应该返回什么样的数据达到目的时,非常好用。

但是工具1太重了。其实完全可以通过python的方式修改host文件。等到测试结束之后,将host文件再copy过去,用管理员运行即可。有时间的话完善下吧。

<think>我们正在使用Windows7系统和Python3.8进行网络抓包。根据引用[3]和引用[4],我们可以使用类似Fiddler的工具或者直接使用Python编写原始套接字来捕获数据包。但是,由于用户明确要求使用Python,我们将重点放在Python实现上。引用[4]提供了一个使用原始套接字捕获IP数据包的示例代码。然而,需要注意的是,在Windows系统中,原始套接字的使用受到限制。特别是,普通用户程序可能无法直接使用原始套接字(需要管理员权限),且Windows对原始套接字的支持与Unix-like系统有所不同。 在Windows中,我们可以使用WinPcap(或Npcap,其兼容WinPcap提供了更多功能)来捕获数据包,而Python中常用的库是scapy或者使用ctypes调用WinPcap的API。但是,引用[4]中的代码使用的是原始套接字,这在Windows中可能无法捕获所有类型的数据包(例如,只能捕获到发送到本机的数据包,且可能无法捕获非IP协议的数据包)。因此,我们考虑两种方法:1.使用原始套接字(如引用[4]所示),但注意其在Windows中的局限性。2.使用第三方库,如scapy,它封装了WinPcap/Npcap,可以跨平台使用。由于用户环境是Windows7和Python3.8,我们首先需要确保安装必要的驱动和库。 步骤: 1.安装Npcap(或WinPcap)驱动程序,因为scapy需要它来捕获数据包。 2.安装scapy库。但是,用户可能没有安装scapy,所以我们先介绍如何安装scapy。根据引用[1]和引用[2],我们可以使用pip安装Python包。但引用[2]提到在mac上安装scrapy时遇到SSL模块不可用的问题,在Windows上我们也需要注意类似问题,确保Python安装时选择了安装SSL(一般安装包会包含)。 安装scapy:```pip installscapy```如果遇到权限问题,可能需要以管理员身份运行命令提示符。如果使用原始套接字方法,我们可以参考引用[4]的代码,但需要调整以适应Windows环境。在Windows中,原始套接字只能捕获发送到本机的IP数据包,且需要设置套接字选项。引用[4]的代码实际上是在Windows环境下编写的(因为使用了`SIO_RCVALL`等选项),所以我们可以尝试使用。 但是,原始套接字方法在Windows中只能捕获IP层的数据包,且需要管理员权限运行脚本。因此,我们提供两种方法: 方法一:使用scapy(推荐) ```pythonfrom scapy.allimport *#定义一个回调函数来处理捕获的数据包def packet_callback(packet):if packet.haslayer(IP):ip_src =packet[IP].srcip_dst= packet[IP].dstprint(f"IPPacket: {ip_src}-> {ip_dst}") #开始抓包,这里使用混杂模式(需要管理员权限),count=0表示持续捕获sniff(prn=packet_callback, store=0, count=0) ```方法二:使用原始套接字(基于引用[4]修改,适用于Windows) ```pythonimport socketimportstructclassSniffer:def __init__(self):#在Windows中,使用gethostname获取本机名,然后获取IPself.host= socket.gethostbyname(socket.gethostname())#创建原始套接字,绑定到所有接口self.s= socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)self.s.bind((self.host,0))#设置包含IP头self.s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL,1)#设置混杂模式self.s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)defcapture_packet(self):#接收一个数据包packet =self.s.recvfrom(65565)#解析IP头,前20字节是IP头ip_header= packet[0][0:20]#使用struct解析IP头iph= struct.unpack('!BBHHHBBH4s4s',ip_header)version_ihl= iph[0]version= version_ihl >>4ihl= version_ihl &0xFiph_length= ihl *4ttl= iph[5]protocol= iph[6]s_addr =socket.inet_ntoa(iph[8])d_addr= socket.inet_ntoa(iph[9])print(f"IP Packet: {s_addr} ->{d_addr},Protocol:{protocol}, TTL:{ttl}")def close(self):#关闭混杂模式self.s.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)self.s.close()#使用示例sniffer =Sniffer() try:sniffer.capture_packet()#捕获一个数据包,可以循环捕获finally:sniffer.close()``` 注意事项: 1.两种方法都需要以管理员权限运行脚本,因为普通用户无法进行网络抓包。 2.原始套接字方法只能捕获IP数据包,而scapy可以捕获各种数据包(如ARP等)提供了更友好的解析。3.在Windows7中,确保关闭了防火墙或设置了允许规则,否则可能无法捕获数据包。问题:用户可能没有安装scapy,所以需要先安装。安装步骤:1.确保已安装Python3.8,且pip可用。 2.打开命令提示符(管理员)。3.运行:pip installscapy如果安装过程中遇到问题,如缺少VisualC++编译工具,可能需要安装MicrosoftVisual C++ BuildTools。或者,如果遇到SSL问题,可以尝试更新pip和setuptools,或者重新安装Python确保在安装时勾选了安装SSL。另外,引用[3]提到了使用Fiddler进行抓包,但用户要求使用Python,所以我们不展开。 §§相关问题§§1.如何在Windows7中安装Python3.8的scapy库? 2.使用原始套接字抓包时,为什么只能捕获到本机的数据包? 3.如何解析捕获到的TCP/UDP数据包?</think>### Windows 7 下 Python 3.8 网络抓包方法 在 Windows 7 系统中使用 Python 3.8 进行网络抓包,主要有两种实现方式: #### 方法一:使用原始套接字(需管理员权限) 参考引用[4]的原始套接字实现,但需针对 Windows 系统调整: ```python import socket import struct class WinSniffer: def __init__(self): # 获取本机IP self.host = socket.gethostbyname(socket.gethostname()) # 创建原始套接字 self.s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) self.s.bind((self.host, 0)) # 设置包含IP头 self.s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # 启用混杂模式 self.s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) def capture_packet(self): data = self.s.recvfrom(65565)[0] # 解析IP头(前20字节) ip_header = data[0:20] iph = struct.unpack('!BBHHHBBH4s4s', ip_header) # 提取源IP和目标IP src_ip = socket.inet_ntoa(iph[8]) dst_ip = socket.inet_ntoa(iph[9]) return f"Source: {src_ip}, Destination: {dst_ip}" def close(self): self.s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF) self.s.close() # 使用示例 sniffer = WinSniffer() try: print(sniffer.capture_packet()) # 捕获第一个数据包 finally: sniffer.close() ``` **注意事项**: 1. 必须以**管理员身份**运行 Python 脚本 2. 只能捕获发送到本机的 IP 数据包 3. Windows 防火墙可能阻止原始套接字操作 #### 方法二:使用 Scapy 库(推荐) Scapy 提供更强大的抓包能力,需先安装: ```powershell # 安装 Scapy(以管理员身份运行CMD) pip install scapy ``` 抓包脚本示例: ```python from scapy.all import * def packet_handler(pkt): if IP in pkt: print(f"Source: {pkt[IP].src} -> Destination: {pkt[IP].dst}") # 开始抓包(需管理员权限) sniff(prn=packet_handler, filter="ip", count=5) # 捕获5个IP包 ``` **环境配置要点**: 1. 安装 WinPcap/Npcap 驱动([官网下载](https://nmap.org/npcap/)) 2. Python 3.8 需确保 OpenSSL 可用(安装时勾选 SSL 模块) 3. 若遇 SSL 错误,参考引用[2]重装 Python 勾选 SSL/TLS #### 方法三:结合 Fiddler(可视化分析) 参考引用[3]配置 Fiddler: 1. 下载安装 [Fiddler Classic](https://www.telerik.com/fiddler/fiddler-classic) 2. 在 Tools > Options > HTTPS 中启用解密 HTTPS 流量 3. 使用 Python 获取 Fiddler 捕获的数据: ```python import requests # 设置代理为 Fiddler proxies = {'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888'} response = requests.get('https://example.com', proxies=proxies, verify=False) print(response.content) ``` ### 常见问题解决 1. **权限问题**:所有抓包操作都需要管理员权限 2. **缺少 WinPcap**:安装 Npcap 时勾选 "WinPcap Compatible Mode" 3. **SSL 错误**:重新安装 Python 3.8 时勾选 "Install launcher" 和 "Add to PATH",确保安装过程中 SSL 组件完整[^2] 4. **防火墙拦截**:在 Windows 防火墙中添加 Python 的入站规则 > **选择建议**:开发调试用 Fiddler+Python,自动化抓包用 Scapy,底层学习用原始套接字。所有方法均需管理员权限运行[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值