再次*2修改了一些内容,修改了README.md
This commit is contained in:
14
README.md
14
README.md
@@ -3,14 +3,14 @@
|
|||||||
得益于rust高效~~(且折磨人)~~的内存管理,新版本可以以更低的内存占用达到更高的效果
|
得益于rust高效~~(且折磨人)~~的内存管理,新版本可以以更低的内存占用达到更高的效果
|
||||||
目前的版本仅支持Minecraft 1.20.1,且暂无配置文件等功能(目标ip什么的写死在代码里了)
|
目前的版本仅支持Minecraft 1.20.1,且暂无配置文件等功能(目标ip什么的写死在代码里了)
|
||||||
## 使用方法
|
## 使用方法
|
||||||
1. 我相信通过百度,你有安装rust的能力,因此跳过此步骤
|
1. 我相信通过百度,你有安装rust的能力,因此跳过此步骤
|
||||||
2. 将项目克隆到本地
|
2. 将项目克隆到本地
|
||||||
3. 命令行里跑一跑
|
3. 命令行里跑一跑
|
||||||
```shell
|
```shell
|
||||||
cd ServerCrasherRust
|
cd ServerCrasherRust
|
||||||
cargo run
|
cargo run
|
||||||
```
|
```
|
||||||
## TODO List
|
## TODO List
|
||||||
1. 实现配置文件&更加灵活的代理设置
|
1. 实现配置文件&更加灵活的代理设置 [已完成]
|
||||||
2. 实现spammer,tab completion crash等实用的~~熊服~~(划掉)功能
|
2. 实现spammer,tab completion crash等实用的~~熊服~~(划掉)功能 [部分完成]
|
||||||
3. 适配多版本(flag先立着,什么时候实现不一定)
|
3. 适配多版本(flag先立着,什么时候实现不一定)[Waiting...]
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ pub struct BotVariable {
|
|||||||
pub spam_cursor: Arc<Mutex<u64>>
|
pub spam_cursor: Arc<Mutex<u64>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bot主线程和worker线程间的通信
|
||||||
|
pub struct BotMessage {
|
||||||
|
pub state: i32,
|
||||||
|
pub last_keepalive_sec: u64,
|
||||||
|
}
|
||||||
|
|
||||||
// impl Clone for BotVariable {
|
// impl Clone for BotVariable {
|
||||||
// fn clone(&self) -> Self {
|
// fn clone(&self) -> Self {
|
||||||
// Self { spam_file: self.spam_file.clone() }
|
// Self { spam_file: self.spam_file.clone() }
|
||||||
@@ -48,6 +54,7 @@ pub struct Bot<T: StreamType> {
|
|||||||
config: Arc<Configuration>,
|
config: Arc<Configuration>,
|
||||||
status: i32,
|
status: i32,
|
||||||
var: Arc<BotVariable>,
|
var: Arc<BotVariable>,
|
||||||
|
alive: Arc<Mutex<bool>>
|
||||||
}
|
}
|
||||||
|
|
||||||
// 然后用一个Stream枚举来包装TcpStream和Socks5Stream(trait不能拿来创建bot)
|
// 然后用一个Stream枚举来包装TcpStream和Socks5Stream(trait不能拿来创建bot)
|
||||||
@@ -103,7 +110,8 @@ impl Clone for Bot<Stream> {
|
|||||||
should_restart: self.should_restart.clone(),
|
should_restart: self.should_restart.clone(),
|
||||||
config: self.config.clone(),
|
config: self.config.clone(),
|
||||||
status: self.status.clone(),
|
status: self.status.clone(),
|
||||||
var: self.var.clone()}
|
var: self.var.clone(),
|
||||||
|
alive: self.alive.clone()}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +129,8 @@ impl<T: StreamType> Bot<T> {
|
|||||||
should_restart,
|
should_restart,
|
||||||
config,
|
config,
|
||||||
status: 0,
|
status: 0,
|
||||||
var: var}),
|
var: var,
|
||||||
|
alive: Arc::new(Mutex::new(true))}),
|
||||||
Err(e) => Err(e),
|
Err(e) => Err(e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -214,15 +223,21 @@ impl<T: StreamType> Bot<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理网络数据包
|
// 处理网络数据包
|
||||||
pub async fn handle_packets(&mut self, status_tx: tokio::sync::mpsc::UnboundedSender<u8>) -> Result<(), ProtocolError> {
|
pub async fn handle_packets(&mut self, status_tx: tokio::sync::mpsc::UnboundedSender<BotMessage>) -> Result<(), ProtocolError> {
|
||||||
while self.conn.lock().await.is_alive() {
|
while self.conn.lock().await.is_alive() && *self.alive.lock().await {
|
||||||
let mut packet = self.conn.lock().await.read_packet()?;
|
let mut packet = self.conn.lock().await.read_packet()?;
|
||||||
|
let mut message = BotMessage {
|
||||||
|
state: 0,
|
||||||
|
last_keepalive_sec: 0
|
||||||
|
};
|
||||||
match packet.id() {
|
match packet.id() {
|
||||||
0x02 => { // 成功登录
|
0x02 => { // 成功登录
|
||||||
// login success
|
// login success
|
||||||
println!("[{}] Successfully logged in!",self.username);
|
println!("[{}] Successfully logged in!",self.username);
|
||||||
self.status = 1;
|
self.status = 1;
|
||||||
status_tx.send(1).unwrap();
|
message.state = 1;
|
||||||
|
message.last_keepalive_sec = time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_secs();
|
||||||
|
status_tx.send(message).unwrap();
|
||||||
}
|
}
|
||||||
0x03 => {// 设置压缩CompressionThreshold
|
0x03 => {// 设置压缩CompressionThreshold
|
||||||
// set compression
|
// set compression
|
||||||
@@ -234,19 +249,23 @@ impl<T: StreamType> Bot<T> {
|
|||||||
}
|
}
|
||||||
0x23 => { // KeepAlive包
|
0x23 => { // KeepAlive包
|
||||||
self.handle_keepalive(&mut packet).await?;
|
self.handle_keepalive(&mut packet).await?;
|
||||||
|
message.last_keepalive_sec = time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_secs();
|
||||||
|
status_tx.send(message).unwrap();
|
||||||
// println!("{}",self.status);
|
// println!("{}",self.status);
|
||||||
}
|
}
|
||||||
0x1A => {// 断连包
|
0x1A => {// 断连包
|
||||||
// disconnect
|
// disconnect
|
||||||
self.handle_disconnect(&mut packet).await?;
|
self.handle_disconnect(&mut packet).await?;
|
||||||
status_tx.send(2).unwrap();
|
message.state = 2;
|
||||||
|
status_tx.send(message).unwrap();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
0x00 => {// 版本不匹配啥的就会走这
|
0x00 => {// 版本不匹配啥的就会走这
|
||||||
if self.status == 0{
|
if self.status == 0{
|
||||||
let text = packet.read_string()?;
|
let text = packet.read_string()?;
|
||||||
println!("[{}] Failed to login: {}", self.username, utils::parse_json_component(text.as_str()));
|
println!("[{}] Failed to login: {}", self.username, utils::parse_json_component(text.as_str()));
|
||||||
status_tx.send(2);
|
message.state = 2;
|
||||||
|
status_tx.send(message).unwrap();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -266,20 +285,23 @@ impl<T: StreamType> Bot<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// !这里的self不与主线程的self相同
|
// !这里的self不与主线程的self相同
|
||||||
pub async fn update_worker(&mut self, mut status_rx: tokio::sync::mpsc::UnboundedReceiver<u8>){
|
pub async fn update_worker(&mut self, mut status_rx: tokio::sync::mpsc::UnboundedReceiver<BotMessage>){
|
||||||
let mut login_timestamp = 0;
|
let mut login_timestamp = 0;
|
||||||
let mut login_command_flag = false;
|
let mut login_command_flag = false;
|
||||||
let mut status = 0;
|
let mut message = BotMessage {
|
||||||
|
state: 0,
|
||||||
|
last_keepalive_sec: 0
|
||||||
|
};
|
||||||
let mut iter = 0;
|
let mut iter = 0;
|
||||||
let mut flag = true;
|
let mut flag = true;
|
||||||
println!("[{}/WORKER] Worker started!", self.username);
|
println!("[{}/WORKER] Worker started!", self.username);
|
||||||
while flag {
|
while flag {
|
||||||
if !status_rx.is_empty() {
|
if !status_rx.is_empty() {
|
||||||
status = status_rx.recv().await.unwrap();
|
message = status_rx.recv().await.unwrap();
|
||||||
}
|
}
|
||||||
if status == 1 && login_timestamp == 0 { // 刚刚登录完毕
|
if message.state == 1 && login_timestamp == 0 { // 刚刚登录完毕
|
||||||
login_timestamp = time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_millis() as i64;
|
login_timestamp = time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_millis() as i64;
|
||||||
}else if status == 1 { // 已登录
|
}else if message.state == 1 { // 已登录
|
||||||
if login_timestamp + 3000 <= time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_millis() as i64
|
if login_timestamp + 3000 <= time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_millis() as i64
|
||||||
&& !login_command_flag { // 登录3s后且未执行过登录命令
|
&& !login_command_flag { // 登录3s后且未执行过登录命令
|
||||||
let commands = self.config.login_commands().clone();
|
let commands = self.config.login_commands().clone();
|
||||||
@@ -320,16 +342,22 @@ impl<T: StreamType> Bot<T> {
|
|||||||
}
|
}
|
||||||
self.send_message(msg).await.unwrap_or(());
|
self.send_message(msg).await.unwrap_or(());
|
||||||
}
|
}
|
||||||
|
let timestamp = time::SystemTime::now().duration_since(time::SystemTime::UNIX_EPOCH).unwrap().as_secs();
|
||||||
|
if message.last_keepalive_sec + 60 < timestamp { // 连接超时
|
||||||
|
(*self.alive.lock().await) = false;
|
||||||
|
println!("[{}/WORKER] Bot timed out", self.username);
|
||||||
|
break;
|
||||||
|
}
|
||||||
iter += 1;
|
iter += 1;
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(1));
|
sleep(Duration::from_millis(1));
|
||||||
flag = self.conn.lock().await.is_alive() && status!=2;
|
flag = self.conn.lock().await.is_alive() && message.state!=2;
|
||||||
}
|
}
|
||||||
println!("[{}/WORKER] Worker stopped.", self.username);
|
println!("[{}/WORKER] Worker stopped.", self.username);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 运行bot
|
// 运行bot
|
||||||
pub async fn run(&mut self, status_tx: tokio::sync::mpsc::UnboundedSender<u8>) -> Result<(), ProtocolError> {
|
pub async fn run(&mut self, status_tx: tokio::sync::mpsc::UnboundedSender<BotMessage>) -> Result<(), ProtocolError> {
|
||||||
println!("[{}] Connecting to {} with proxy {}", self.username, self.server_addr, self.proxy_addr);
|
println!("[{}] Connecting to {} with proxy {}", self.username, self.server_addr, self.proxy_addr);
|
||||||
self.login().await.unwrap();
|
self.login().await.unwrap();
|
||||||
self.handle_packets(status_tx).await.unwrap_or(());
|
self.handle_packets(status_tx).await.unwrap_or(());
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ async fn attack_thread(lock: Arc<Mutex<()>>, config: Arc<Configuration>, variabl
|
|||||||
//println!("[{}] Connecting to {} with proxy {}", bot.username, bot.server_addr, bot.proxy_addr);
|
//println!("[{}] Connecting to {} with proxy {}", bot.username, bot.server_addr, bot.proxy_addr);
|
||||||
// 插入生成update_worker线程的代码
|
// 插入生成update_worker线程的代码
|
||||||
let mut bot_clone = bot.clone();
|
let mut bot_clone = bot.clone();
|
||||||
let (tx, rx) = tokio::sync::mpsc::unbounded_channel::<u8>();
|
let (tx, rx) = tokio::sync::mpsc::unbounded_channel::<bot_socks5::BotMessage>();
|
||||||
rt_update.spawn(async move {
|
rt_update.spawn(async move {
|
||||||
bot_clone.update_worker(rx).await;
|
bot_clone.update_worker(rx).await;
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user