当前位置: 首页 > news >正文

Python渗透测试——一、数据包的编辑工具——Scapy

Python渗透测试

  • 一、Scapy简介
  • 二、Scapy中的分层结构
  • 三、Scapy中的常用函数
  • 四、在Scapy 中发送和接收数据包
  • 五、Scapy 中的抓包函数

一、Scapy简介

提到数据包(这里泛指帧、段和报文等)的构造,我们首先需要了解协议和分层这两个概念。在“互联世界的规则一协议”中,我们提到了协议的概念,简单来说协议就是通信时所有参与者必须遵守的规则集合。这些协议各司其职、各尽其能,它们的不同主要体现在产生的数据包的顺序与格式上。

个在网络中的数据包往往会包含多个协议,例如我们所使用的 QQ,它在登录时就会产生数据包。这个数据包的目标地址是腾讯服务器(假设为 1.1.1.1),目标端口是 8000,传输的信息为“我要登录”,那么这个过程产生的数据包就需要包含 IP 部分(用来指明目标地址等信息)UDP 部分(用来指明端口等信息 、QQ 自有协议部分(用来保存传输内容等)。实际情况远比这要复杂,互联网上存在的协议数量已经成千上万了,当多个协议存在于同一个数据包时,为了解析方便,就有必要将它们分成不同的层次。
目前通用的分层方式有两种,我们以相对简单的 TCP/IP 协议族为例,它是一个4层协议模型、自底而上分别是链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。
在这里插入图片描述
TCP/IP 协议族常见协议所属层次
这样分层之后来构造数据包就会很简单。但是需要注意,一个数据包并不是必须同时包含这 4层的协议,也不是同一层只能包含1个协议。在后面的具体实现中,我们就会对此有深入的了解。
在这里插入图片描述
前面提到 Scapy 是一个可以直接操作到数据包层次的工具。在 Windows 中,我们可以在Python 环境中将Scapy 当作一个库使用;如果是在 Linux中则可以将 Scapy 当作一个独立的工具来使用,它提供了一个和Python相同的交互式命令行环境。在Kali Linux2.0中已经集成了 Scapy 环境,只需要启动一个终端,输入命令“scapy”,就可以启动 Scapy编程环境。
Scapy 提供了和 Python 一样的交互式命令行。这里需要特别强调的是,虽然将 Scapy 模块作为 Python 的一个库,但是 Scapy 本身就是一个可以独立运行的工具,它具备一个独立的运行环境,因而可以不依赖Python。

二、Scapy中的分层结构

首先我们先用几个实例来演示 Scapy 的用法。Scapy 使用了“类+属性”的方法来构造数据包,在 Scapy 中每一个网络协议就是一个类,协议中的字段就对应着属性。只需要实例化一个协议类,就可以创建一个该协议类型的数据包。例如我们要构造一个 IP 数据包,可以使用如下方式。

IP()

如果要使用 IP 的话,那么首先需要导人 Scapy 库。考虑到目标模块中的属性非常多,反复输人 Scapy 很不方便,这里我们选择“from 模块 import 类”的形式导人,下面给出了一个使用Scapy构造IP 数据包的演示程序

from scapy.all import IP
pkt=IP()
print(pkt)

在这里插入图片描述

这个程序执行之后,可以输出中看到的结果:
在这里插入图片描述
对于 IP 来说,最重要的属性就是源地址和目标地址,这两个属性在 Scapy中使用参数 src和 dst来设置。例如我们要构造一个发往“192.168.217.150”的IP 数据包,就可以使用以下语句。

ip=IP(dst="192.168.217.150")

对于 Scapy 的使用者来说,比较困难的一点就是协议类型众多。现在使用IPO来构造数据包的时候,都需要设置哪些参数,这些参数都有什么意义呢?由于网络中协议数量众多,因此Scapy 在内部实现了大量的网络协议 (DNS、ARP、IP、TCP、UDP 等)。人类靠记忆来完成这个工作是很难的。
要想熟练地使用 Scapy,大家需要掌握协议的一些基础知识。另外 Scapy 也提供了一个可以便捷查看数据包格式的函数ls(),当你不了解如何为一个 IP 数据指定目标地址的时候、就可以使用下面的程序。

from scapy.all import IP,ls
pkt=IP()
ls (pkt)

执行该程序,可以看到结果。
在这里插入图片描述
在这里插入图片描述
Scapy 采用分层的方式来构造数据包,通常最底层的协议为 Ether,然后是 IP,再之后是TCP 或者 UDP。例如我们使用 Ether0,这个类可以设置发送方和接收方的 MAC 地址。那么我们现在来产生一个广播数据包,执行的命令如下。

Ether(dst="ff:ff:ff:ff:ff:ff")

分层是通过符号“/”实现的。如果一个数据包是由多层协议组合而成的,那么这些协议之间就可以使用“/”分开,并按照协议由底而上的顺序从左向右排列。例如我们可以使用Ether()/IP()/TCP()来构造一个TCP数据包。

from scapy.all import
pkt=Ether()/IP()/TCP()
ls(pkt)

在这里插入图片描述
在这里插入图片描述
这个程序由于需要导入的模块比较多,因此使用了“import *”。在执行这个程序之后,可以看到我们构造了一个包含 Ether、IP 和TCP 这3 种协议的数据包。
如果要构造一个HTTP 数据包,也可以使用以下这种方法。
在这里插入图片描述

三、Scapy中的常用函数

Scapy中使用频率最高的类要数 Ether IPTCP和UDP了,这些类都具有哪些属性呢?Eth类中显然具有源地址、目标地址和类型。IP类的属性则复杂了许多,除了最重要的源地址和目地址之外,还有版本、长度、协议类型、校验和等。TCP 类中具有源端口和目标端口。这里我可以使用ls()函数来查看一个类所拥有的属性。前面我们已经提过了,这个函数使用属性列表的式来显示一个数据包的详细信息,例如使用ls(Ether0)来查看 Ether 类的属性。
在这里插入图片描述
也可以使用同样的方法用ls(IP())来查看 IP 类的属性,可以对属性列表里对应的属性进行设置,例如我们将 ttl 的值设置为 32,就可以使用如下方式。

pkt=IP(src="192.168.1.1",dst="192.168.1.101",ttl=32)

在这里插入图片描述
刚开始不熟悉 Scapy 有哪些功能的时候,大家可以使用 lsc()函数列出所有可以使用的函数,下面给出了一些经常使用的函数及其使用方法。首先我们使用 pkt=IP()来构造一个数据包然后利用这个 pkt 来演示各种函数。

  • raw()函数表示以字节格式来显示数据包内容。例如我们如果要查看 pkt,就可以使用 print(raw(pkt))。
  • hexdump()函数表示以十六进制数据表示的数据包内容给出了print(hexdump(pkt))的执行结果。
  • summary()函数使用不超过一行的摘要内容来简单描述数据包,pkt.summary()让使用者可以简单明了地知晓数据包的内容。
  • show()函数使用展开视图的方式显示数据包的详细信息,是一种比较常用的方法,使用者可以快速看到每一个属性的值,给出了 pkt,show()的执行结果。
  • show2()函数的作用与 show()的基本相同,区别在于使用 pkt.show2()时会显示数据包的校验和。

如果我们看到了一个数据包,但是不知道如何使用命令来产生相同的数据包时,就可以使用command()函数,它可以显示出构造该数据包的命令。例的就是用 pkt.command()还原 pkt 的构造命令。

有时使用 Scapy 会捕获到大量的数据包,这些数据包需要保存起来,例如在网络取证时就会经常这么做,这时 wrpcap()函数就可以完成这个工作。例如我们在程序中将很多数据包都临时存储在 pkts 中,使用wrpcap("temp.cap",pkts)就可以将pkts 中的数据包写入文件 temp.cap。

同样 Scapy 也提供了读取数据包文件的功能,rdpcap()函数就可以实现这个功能,例如使用pkts =rdpcap("temp.cap")读取 temp.cap文件中的数据包。

四、在Scapy 中发送和接收数据包

除了这些对应着协议的类和它们的属性之外,我们还需要一些可以实现各种功能的函数需要注意的一点是,刚才我们使用 IP()的作用是产生了一个 IP 数据包,但是并没有将其发送出去,因此现在首先需要将产生的数据包发送出去。Scapy 提供了多个用来发送数据包的函数先来看其中的 send()函数和 sendp()函数。这两个函数的区别在于 send()数是用来发送IP数据包的,而sendp()函数是用来发送 Ether 数据包的。我们先来构造一个目标地址为 192.168.1.1的ICMP 数据包,并将其发送出去,可以使用如下程序。

from scapy.all import *
pkt=IP(dst="192.168.217.150")/ICMP()
send(pkt)

在这里插入图片描述
在这里插入图片描述
注意,如果这个数据包发送成功,那么下方会有一个“Sent 1 packets”的显示。sendp()函数的使用方法是相同的,下面给出了一个实例。

sendp(Ether(dst="ff:ff:ff:ff:ff:ff"))

简单来说,当你需要将 MAC 地址作为目标时,就使用 sendp()函数;而当你需要将IP 地址作为目标时,就使用 send()函数。这两个函数的特点是只发不收,也就是说只会将数据包发送出去,但是不会处理该数据包的应答数据包。

在网络的各种应用中,我们需要做的不仅要将创建好的数据包发送出去,也要接收这些数据包的应答数据包,这一点在网络扫描中尤为重要。Scapy 提供了 3 个用来发送和接收数据包的丽数,分别是 sr()函数、sr1()函数和 srp()函数,其中 sr()函数和 sr1()函数主要用于 IP 地址,而srp()丽数用于MAC地址。

这里我们仍然向192.168.217.150发送一个ICMP 数据来了解 sr()函数的使用方法需要注意的是,这里 192.168.217.150 应该是一个可以 ping通的地址。

当产生的数据包被发送出去之后,Scapy 就会监听接收到的数据包,将其中对应的应答数据包筛选出来并显示。为 Reveived 表示收到的数据包个数,answers 表示对应此次发送数据包的应答数据包。

sr()函数是 Scapy 的核心,它的返回值是两个列表,第一个列表包含收到了应答的数据包和对应的应答数据包,第二个列表包含未收到应答的数据包。所以可以使用两个列表来保存sr()函数的返回值。

from scapy.all import *
pkt=IP(dst="192.168.217.150")/ICMP()
ans,uans=sr(pkt)
ans.summary()

在这里插入图片描述
在这里插入图片描述
这里我们使用ans列表和 uans列表来保存sr()函数的返回值。因为发送出去的是一个ICMP数据包,而且收到了一个应答数据包,所以这个发送的数据包和收到的应答数据包都被保存到了ans列表中使用ans.summary0可以查看两个数据包的内容。unans列表为空。为ans中保存的应答数据包。

srl()雨数跟 sr()丽数作用基本一样,但是只返回一个应答数据包,只需要使用一个列表可以保存这个雨数的返回值。srp()丽数与 srl()函数和 sr()函数的区别在于发送时要使用 MAC地址。

五、Scapy 中的抓包函数

另外,一个十分重要的函数是 snim0。如果你使用过 Tcpdump,那么对这个函数就不会感到陌生。使用这个函数就可以在自己的程序中捕获经过本机网卡的数据包了。

sniff()

这个函数完整的格式为sniff(filter="",iface="any”,prn=function,count=N)。第1个参数是filter,可以用来对数据包进行过滤。例如我们指定只捕获与 192.168.217.150有关的数据包,就可以使用host 192.168.217.150"

sniff(filter="host 192.168.1.1")

但是这种仅依靠IP地址来过滤的方法有很大的局限性,下面我们介绍一种功能更加完善的方法。1993年史蒂文·麦卡内(Steven McCanne)与范·雅各布森( Van Jacobson)在USENIX93会议上提出了一种机制一伯克利包过滤(Berkeley Packet Filter,BPF)它采用了一种与自然语言很接近的语法,利用这种语法构成的字符串可以确定保留哪些数据包以及忽略哪些数据包。

这种语法很容易理解。例如最简单的空字符串,表示的就是匹配所有数据包,也就是保留所有的数据包。如果这个字符串不为空,那么只有那些使字符串表达式值为“真”的数据包才会被保留。这种字符串通常由一个或者多个原语所组成,每个原语又由一个标识符(名称或者数字)组成,后面跟着一个或者多个限定符。

伯克利包过滤中的限定符有下面3种:

  • Type:这种限定符表示指代的对象,例如 IP 地址子网或者端口等。常见的有 host(用来表示主机名和 IP 地址)、net(用来表示子网)、port(用来表示端口)。如果没有指定,默认为 host。
  • Dir:这种限定符表示数据包传输的方向,常见的有 src(源地址)和 dst(目的地)如果没有指定,则默认为“src or dst”。例如 192.168.217.151表示的就是匹配源地址或者目标地址为 192.168.217.150的数据包。
  • Proto:这种限定符表示与数据包匹配的协议类型,常见的就是 Ether、IP、TCP、ARP这些协议。

伯克利包过滤中的标识符指的就是那些进行测试的实际内容,例如一个 IP 地址 192.168.217.151,一个子网192.168.217.0/24 或者一个端口号 8080,这些都是常见的标识符。host 192.168.217.151和 port 8080 是两个比较常见的原语,我们还可以用 and、or 和 not 把多个原语组成一个更复杂的过滤语句。例如host 192.168.217.151 and port 8080 就是一个符合规则的过滤语句。
下面给出了一些常见的原语实例。

  • host 192.168.1.1:当数据包的目标地址或者源地址为 192.168.1.1 时,过滤语句为真。
  • dst host 192.168.1.1:当数据包的目标地址为 192.168.1.1时,过滤语句为真
  • src host 192.168.1.1:当数据包的源地址为 192.168.1.1 时,过滤语句为真。
  • ether host 11:22:33:44:55:66:当数据包的以太网源地址或者目标地址为 11:22:33:44:55:66时,过滤语句为真。
  • ether dst 11:22:33:44:55:66:当数据包的以太网目标地址为 11:22:33:44:55:66 时,过语句为真。
  • ether src 11:22:33:44:55:66:当数据的以太网源地址为11:22:33:44:55:66 时过滤语句为真
  • dst net 192.168.1.0/24:当数据包的IP4/IPv6 的目标地址的网络号为192.168.1.0/24时过滤语句为真。
  • src net 192.168.1.0/24:当数据包的IPV4/IPv6 的源地址的网络号为19216810/24时过滤语句为真。
  • net 192.168.1.0/24:当数据包的IPV4/IPV6 的源地址或目标地址的网络号为192.168.1.0/24时,过滤语句为真。
  • dst port 8080:当数据是TCP 或者UDP 数据包且目标端口号为8080时过滤语为真。
  • src port 8080:当数据包是TCP 或者UDP 数据包且源端口号为 8080 时,过滤语句为真。
  • port 8080:当数据包的源端口或者目标端口为 8080 时,过滤语句为真。所有的 port前面都可以加上关键字TCP或者UDP。

第2个参数 iface 用来指定要使用的网卡,默认为第一块网卡。
第3个参数 prn表示对捕获到的数据包进行处理的函数,可以使用 Lambda 表达式。例如我们要将获取到的数据包输出,就可以使用以下函数。

sniff(filter="icmp", prn=lambda x:x.summary())

如果这个函数比较长,也可以定义成回调函数。这个回调函数以接收到的数据包对象作为唯一的参数,最后再调用 sniff()函数。

def packet_callback(pkt):print (pkt,summary)
sniff(prn=packet.callback)

第4个参数 count 用来指定监听到数据包的数量,达到指定的数量就会停止监听。例如我们只希望监听到 10 个数据包就停止。

sniff(count=10)

我们来设计一个综合性的监听器,它会在网卡 eth0 上监听源地址或者目标地址为 192.168.1.1 的1CMP 数据包并输出,当收到了3个这样的数据包之后,就会停止监听。建的监听器如下:

sniff(filter="icmp and host 192,168,1,1",prn=lambda x:x,summary(),count=3)

相关文章:

Python渗透测试——一、数据包的编辑工具——Scapy

Python渗透测试 一、Scapy简介二、Scapy中的分层结构三、Scapy中的常用函数四、在Scapy 中发送和接收数据包五、Scapy 中的抓包函数 一、Scapy简介 提到数据包(这里泛指帧、段和报文等)的构造,我们首先需要了解协议和分层这两个概念。在“互联世界的规则一协议”中…...

使用webstrom编写vue开启提示

1.语言服务器选择 2.文件类型–忽略的文件和文件夹,删去,node_modules,就可以点进去库了 3.禁用JSLint、TSLint 4.开启node辅助 5.如果是vite,开启自动读取,或手动指定 6.如果是Webpack,开启自动读取&#…...

linux远程桌面管理工具(xrdp)、向日葵

Windows远程桌面 linux远程桌面 使用向日葵远程桌面(手机端同理) Windows远程桌面 微软自带Remote Desktop Connection Manager (RDCMan)远程控制管理软件介绍 远程桌面连接管理器 v2.93 linux远程桌面 Windows远程桌面Ubunt…...

【力扣100】8.找到字符串中所有字母异位词

添加链接描述 class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:sildingstrresult[]p.join(sorted(p))for i in range(len(s)):if len(sildingstr)<len(p):sildingstrsildingstrs[i]# print(sildingstr)if len(sildingstr)len(p):sort_sildingstr.j…...

圆通速递查询,圆通速递单号查询,用表格导出查询好的物流信息

批量查询圆通速递单号的物流信息&#xff0c;以表格的形式导出查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界…...

FLStudio中文2024中文最新汉化安装包下载

FLStudio中文21最新版本以其使用速度而闻名&#xff0c;是一个高度复杂的音乐制作环境。FL Studio免费&#xff0c;联合国音序器音频和MIDI每个复合编辑都是音乐。现代的DAW是一种非凡的野兽。首先&#xff0c;它在很大程度上把自己放在了(几乎)每个人记录过程的核心。其次&…...

AI:大语言模型训练方法 - 机器学习

Transformer Transformer是一种深度学习的模型架构&#xff0c;特别适用于自然语言处理任务。Transformer 模型的核心创新在于其 "自注意力"&#xff08;Self-Attention&#xff09;机制&#xff0c;这种机制使得模型可以有效地捕捉输入数据中的长距离依赖关系。 T…...

Linux(17):认识与分析登录档

什么是登录档 【详细而确实的分析以及备份系统的登录文件】是一个系统管理员应该要进行的任务之一。 登录档 就是记录系统活动信息的几个文件&#xff0c;例如&#xff1a;何时、何地(来源IP)、何人(什么服务名称)、做了什么动作(讯息登录啰)。 换句话说就是&#xff1a;记录系…...

STM32上模拟CH340芯片的功能 (一)

#虚拟串口模拟CH340# 代码gitee地址&#xff1a;STM32F103_CH340: 用STM32模拟ch340USB串口的功能 一、思路 1. 确定通信接口&#xff1a;CH340是一款USB转串口芯片&#xff0c;因此您需要选择STM32上的某个USB接口来实现USB通信。通常情况下&#xff0c;STM32系列芯片都有内…...

图论——最小生成树

图论——最小生成树 A wise man changes his mind, a fool never will 生成树 一个连通图的生成树是一个极小的连通子图&#xff0c;它包含图中全部的n个顶点&#xff0c;但只有构成一棵树的n-1条边。 最小生成树 在这些边中选择N-1条出来&#xff0c;连接所有的N个点。这N-1…...

C++基础 -42- STL库之list链表

———————STL库之list链表——————— &#x1f384; list链表的格式(需要定义头文件) list<int> data1(4, 100);list<int> data2(4, 500);&#x1f384;list链表的合并接口 &#x1f384;举例使用合并接口并且验证 data2.merge(data1);list<int>::…...

Backend - Python 序列化

目录 一、作用1&#xff1a;代码块存入数据库 二、作用2&#xff1a;前后端传递数据 &#xff08;一&#xff09;前端 1. JSON.stringify() 2. JSON.parse() &#xff08;二&#xff09;后端 1. json.dumps() &#xff08;1&#xff09;作用 &#xff08;2&#xff09…...

初级数据结构(一)——顺序表

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 NULL | 初级数据结构&#xff08;二&#xff09;——链表 下一篇-> 1、顺序表的特点 1.1、数组 现实中数据记录一般都记录在表格中&#xff0c;如进货单、菜单等&#xff0c;它们的最大特点就是…...

实现:切换页面切换标题,扩展 vue-router 的类型

布局容器-页面标题 网址&#xff1a;https://router.vuejs.org/zh/guide/advanced/meta 给每一个路由添加 元信息 数据 router/index.ts const router createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{ path: /login, component: () > im…...

已通过考试和认证注册以及后续计划表

已通过考试和认证注册以及后续计划表 软考 - 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试信息系统集成及服务项目管理人员工程类考试计划你关注的证书样子 软考 - 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 高级 信息系统项目管理师&…...

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、关于Lena图片 7、…...

使用pytorch查看中间层特征矩阵以及卷积核参数

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 1和4是之前讲过的alexnet和resnet模型 2是分析中间层特征矩阵的脚本 3是查看卷积核参数的脚本 1设置预处理方法 和图像训练的时候用的预处理方法保持一致 2实例化模型 3载入之前的模型参数 4载入…...

HarmonyOS4.0从零开始的开发教程09页签切换

HarmonyOS&#xff08;七&#xff09;页签切换 List组件和Grid组件的使用 Tabs组件的使用 概述 在我们常用的应用中&#xff0c;经常会有视图内容切换的场景&#xff0c;来展示更加丰富的内容。比如下面这个页面&#xff0c;点击底部的页签的选项&#xff0c;可以实现“首页…...

大电流H桥电机驱动电路的设计与解析(包括自举电路的讲解,以IR2104+LR7843为例)

大电流H桥电机驱动电路的设计与解析&#xff08;包括自举电路的讲解&#xff0c;以IR2104LR7843为例&#xff09; 电机驱动板主要采用两种驱动芯片&#xff0c;一种是全桥驱动&#xff08;如&#xff1a;HIP4082&#xff09;&#xff0c;一种是半桥驱动&#xff08;如&#xff…...

windows11 windows 11 (win11 win 11) 怎么安装 Python3 ? numpy? sounddevice? 声音信号处理库?

首先确认要安装的 sounddevice 库&#xff0c;链接&#xff1a;https://python-sounddevice.readthedocs.io/en/0.4.6/ 根据文档&#xff0c;可知最新的 sounddevice 版本是 0.4.6 进入安装页面查看&#xff0c;发现 Newest sounddevice 可以使用 pip 安装&#xff0c;如下图…...

git如何配置多个远程仓库,并且进行切换

一、配置多个远程仓库并进行切换&#xff0c;请按照以下步骤进行操作&#xff1a; 打开命令行终端&#xff0c;并进入您的 Git 仓库所在的目录。添加第一个远程仓库&#xff0c;使用以下命令&#xff1a;git remote add origin <第一个远程仓库的 URL>这里将远程仓库命名…...

计算机存储单位 + 程序编译过程

C语言的编译过程 计算机存储单位 头文件包含的两种方式 使用 C/C 程序常用的IDE 常用的C语言编译器&#xff1a; 在选择编译器时&#xff0c;需考虑平台兼容性、性能优化、调试工具和开发人员的个人偏好等因素。 详细教程可转 爱编程的大丙...

vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)

目录 一、什么是Vue路由导航守卫&#xff1f; 二、全局守卫 1、beforeEach 下面是一个beforeEach的示例代码&#xff1a; 2、beforeResolve 下面是一个beforeResolve的示例代码&#xff1a; 3、afterEach 下面是一个afterEach的示例代码&#xff1a; 三、路由独享守卫…...

单片机双机通信控制跑马灯

实验要求 两个单片机各驱动8个LED灯&#xff0c;构成两个跑马灯&#xff0c;要求甲单片机LED的点亮方式是从上至下&#xff0c;首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮&#xff0c;8个灯全部灭&#xff0c;重复这个过程&#xff0c…...

微信小程序:button微信开放能力打开客服会话分享到聊天框

文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html 打开客服会话 按钮关键属性 open-type"contact"功能按钮 <button class"mo-open-type"open-type"contact"> </button>分享 <button class&q…...

【数据结构】——队列实现二叉树的功能

前言&#xff1a;二叉树的实现方式多种多样&#xff0c;有数组实现满二叉树&#xff0c;有链表实现完全二叉树&#xff0c;今天我们就用队列来实现二叉树。 创建二叉树&#xff1a; typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…...

【已解决】Win7虚拟机安装VMtools报错

在做以前的实验的时候发现要用到Win7虚拟机&#xff0c;于是就安装了一个Win7的虚拟机&#xff0c;但是发现屏幕太小&#xff0c;而且来回复制文本、复制文件太不方便了&#xff0c;索性就安装了VMtools&#xff0c;发现还安装不成– 情况1 报错&#xff1a;本程序需要您将此…...

华为OD机试真题-小明找位置-2023年OD统一考试(C卷)

题目描述&#xff1a; 小朋友出操&#xff0c;按学号从小到大排成一列&#xff1b;小明来迟了&#xff0c;请你给小明出个主意&#xff0c;让他尽快找到他应该排的位置。 算法复杂度要求不高于nLog(n)&#xff1b;学号为整数类型&#xff0c;队列规模<10000&#xff1b; 输…...

2023.2版idea安装教程,现在jdk8已经过去式了,不同idea支持的jdk不同。升级jdk后idea也要随之升级

下载idea2023.2版本&#xff0c;下载之前需要删除之前的版本&#xff0c;一定要删除干净&#xff0c;删除程序要勾选那两个delete 下载路径&#xff1a;其他版本 - IntelliJ IDEA (jetbrains.com.cn) 选择2023.2版本 下载后进入安装程序&#xff0c;选择安装目录&#xff0c;然…...

CSS3技巧36:让内容垂直居中的三种方式

让内容垂直居中&#xff0c;是一个很重要的应用情景&#xff0c;在很多场合都会需要。这也是面试的时候&#xff0c;一些考官喜欢拿来初面的小题目。 这里&#xff0c;小结下让内容垂直居中的三种方式。 当然&#xff0c;读者如果有更好的方法&#xff0c;也可以提出来。 基本…...

空间运算设备-Apple Vision Pro

苹果以其在科技领域的创新而闻名&#xff0c;他们致力于推动技术的边界&#xff0c;这在他们的产品中表现得非常明显。他们尝试开发一项的新型突破性显示技术。在 2023 年 6 月 5 日官网宣布将发布 Apple Vision Pro 头戴空间设备&#xff0c;我们一起来了解一下 Apple Vision …...

cocos creator “TypeError: Cannot set property ‘string‘ of null

背景&#xff1a; 学习cocos creator时遇到"TypeError: Cannot set property string of null" 错误。具体代码如下&#xff1a;property({ type: Label })public stepsLabel: Label | null null;update(deltaTime: number) {this.stepsLabel.string Math.floor(…...

简谈MySQL的binlog模式

一、MySQL的binlog模式介绍 MySQL的binlog模式是一种日志模式&#xff0c;用于记录对MySQL数据库进行的更改操作。通过启用binlog模式&#xff0c;可以将数据库的更改操作记录到二进制日志文件中&#xff0c;以便在后续需要时进行恢复和复制。 要启用binlog模式&#xff0c;请…...

Linux 环境部署RabbitMQ

1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management 方式二&#xff1a;从本地加载&#xff08;本文章带有mq安装包&#xff09; docker load -i mq.tar 1.2.安装MQ 执行下面的命令来运行…...

【1day】泛微e-office OA系统xml.php 文件 SORT_ID 参数 SQL 注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

智能无人零售:革新零售消费体验的未来

智能无人零售&#xff1a;革新零售消费体验的未来 在当今数字化时代&#xff0c;智能无人零售正以惊人的速度改变着我们的购物方式和消费体验。这一新兴领域的发展&#xff0c;为消费者带来了前所未有的便利和个性化选择。 智能无人零售是指利用先进的智能技术和自动化系统&…...

代币化对网约车区块链平台的影响

The effects of tokenization on ride-hailing blockchain platforms 再一次分析一下一篇关于区块链的文章&#xff0c;这篇文章比较新&#xff0c;2023年发表在POMS上。 由于这篇文章跟之前那几篇关注假货的文章的重点不一样&#xff0c;所以需要仔细读一下他的INTRODUCTION…...

YOLOv7 学习笔记

文章目录 前言一、YOLOv7贡献和改进二、YOLOv7核心概念三、YOLOv7架构改进总结 前言 在深度学习和计算机视觉领域&#xff0c;目标检测一直是一个极具挑战性和实用性的研究领域。特别是在实时目标检测方面&#xff0c;准确率和速度之间的平衡成为了关键考量因素。YOLO&#xf…...

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…...

Canal笔记:安装与整合Springboot模式Mysql同步Redis

官方文档 https://github.com/alibaba/canal 使用场景 学习一件东西前&#xff0c;要知道为什么使用它。 1、同步mysql数据到redis 常规情况下&#xff0c;产生数据的方法可能有很多地方&#xff0c;那么就需要在多个地方中&#xff0c;都去做mysql数据同步到redis的处理&…...

C++的继承语法

在面向对象编程中&#xff0c;继承是一种强大的机制&#xff0c;允许一个类&#xff08;子类&#xff09;从另一个类&#xff08;父类&#xff09;继承属性和方法。C是一种支持面向对象编程的编程语言&#xff0c;通过其灵活而强大的继承语法&#xff0c;开发者可以构建更加模块…...

C# .NET平台提取PDF表格数据,并转换为txt、CSV和Excel表格文件

处理PDF文件中的内容是比较麻烦的事情&#xff0c;特别是以表格形式呈现的各种数据。为了充分利用这些宝贵的数据资源&#xff0c;我们可以通过程序提取PDF文件中的表格&#xff0c;并将其保存为更易于处理和分析的格式&#xff0c;如txt、csv、xlsx&#xff0c;从而更方便地对…...

spring boot学习第五篇:spring boot与JPA结合

1、准备表&#xff0c;创建表语句如下 CREATE TABLE girl (id int(11) NOT NULL AUTO_INCREMENT,cup_Size varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4…...

代理IP怎么使用?Mac苹果系统设置http代理IP教程

代理IP是一种通过将请求转发到另一个服务器&#xff0c;以隐藏自己的真实IP地址的服务器。使用代理IP可以保护您的隐私和安全&#xff0c;防止被跟踪或被攻击。在本文中&#xff0c;我们将介绍如何在Mac苹果系统上设置http代理IP教程。 一、了解代理IP 代理IP地址是一种可以用来…...

postgresql_conf中常用配置项

在 PostgreSQL 的 postgresql.conf 配置文件中&#xff0c;有许多常用的配置项&#xff0c;这些配置项可以根据特定需求和性能优化进行调整。以下是一些常用的配置项及其作用&#xff1a; 1. shared_buffers 用于设置 PostgreSQL 实例使用的共享内存缓冲区大小。增加此值可以…...

使用MfgTool烧写前需准备的文件

一. 简介 本文我们就来学习&#xff0c;如何将我们编译的 uboot&#xff0c;zImage&#xff08;内核镜像&#xff09;&#xff0c;xxx.dtb设备树文件&#xff0c;还有制作的根文件系统&#xff0c;这四个文件烧写到开发板中&#xff0c;最后 开发板能正常启动。 本文这里使用…...

SAP UI5 walkthrough step4 XML Views

SAPUI5 指出多种VIEW类型&#xff0c;包括XML,HTML,JavaScript 推荐使用XML&#xff0c;因为可读性更高 我们提前介绍一下MVC架构。 MVC是一种软件架构模式&#xff0c;它包括三个主要组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;…...

Java 1对1

文章目录 前言 客户端 服务器端 输出线程端 End 前言 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的网络传输协议&#xff0c;它提供了端到端的数据传输和可靠性保证。 本程序就是基于tcp协议编写而成的。 利用 TCP 协议进行通信的…...

云服务器Centos中安装Docker

云服务器Centos中安装Docker 1 简介DockerCentosCentos和Ubuntu区别 2 安装3 测试hello-world的镜像测试 1 简介 Docker Docker是一个开源的应用容器引擎&#xff0c;利用操作系统本身已有的机制和特性&#xff0c;可以实现远超传统虚拟机的轻量级虚拟化。它支持将软件编译成…...

人工智能教程(三):更多有用的 Python 库

目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在本系列的上一篇人工智能教程&#xff08;二&#xff09;&#xff1a;人工智能的历史以及再探矩阵中&#xff0c;我们回顾了人工智能的历史&#xff0c;然后详细地讨论了矩阵。在…...