Skip to content

Commit 171973f

Browse files
WillowSauceRWillowSauceR
authored andcommitted
add options, scan: --exec-cmd, send: --quiet
1 parent f77afad commit 171973f

File tree

4 files changed

+41
-26
lines changed

4 files changed

+41
-26
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22

33
## 直接在 [Releases](https://github.com/WillowSauceR/BedrockProtocolTools/releases/latest) 页面下载最新的版本,然后解压打开其中的exe文件进行使用
44

5-
## 或者使用 `git clone https://github.com/WillowSauceR/BedrockProtocolTools`将本项目克隆到本地或直接下载本项目,然后使用python3来运行
5+
## 或者使用 ``git clone https://github.com/WillowSauceR/BedrockProtocolTools``将本项目克隆到本地或直接下载本项目,然后使用python3来运
6+
7+
## 行每个工具都可以单独使用参数 ``-h``来获取英文帮助,如 ``python3 scan.py -h``
68

79
## scan.py
810

9-
### 使用方法: `python3 scan.py [目标地址] -i [可选:发包间隔] -p [可选:本地端口] -do [可选:只显示玩家在线数量大于或等于此数值的服务器]`
11+
### 使用方法: ``python3 scan.py [目标地址] -i [可选:发包间隔] -p [可选:本地端口] -do [可选:只显示玩家在线数量大于或等于此数值的服务器] -e [在扫描到服务器后立刻执行的cmd命令,需要用双引号包含,具体使用请使用 -h 参数获取帮助]``
1012

1113
#### 描述: 扫描IP上的所有BE协议服务器
1214

1315
#### 注意:目标地址可以填域名,IP或者IP段。如 mc.163.com,11.4.5.14,191.191.81-255.0-255
1416

1517
## send.py
1618

17-
### 使用方法: `python3 send.py [目标地址] [载体包文件] -p [可选:端口:默认19132] -l [可选:次数,默认1] -i [可选:间隔:秒,默认10] -d(自动显示MOTD) -pu(使用代理) -pc [代理的国家,如cn, ru, us]`
19+
### 使用方法: ``python3 send.py [目标地址] [载体包文件] -p [可选:端口:默认19132] -l [可选:次数,默认1] -i [可选:间隔:秒,默认10] -d(自动显示MOTD) -pu(使用代理) -pc [代理的国家,如cn, ru, us] -q [安静模式,不输出任何日志]``
1820

1921
#### 描述: 发包复现工具, 需要一个内含byte数据的文件,一般为.dmp后缀名
2022

@@ -24,6 +26,6 @@
2426

2527
## motd.py
2628

27-
### 使用方法: `python3 motd.py [目标地址] [端口] -t [可选:超时时间]`
29+
### 使用方法: ``python3 motd.py [目标地址] [端口] -t [可选:超时时间]``
2830

2931
#### 描述: motd一个BE服务器,支持自动解析返回的数据

api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
MOTD_PKT = b'\x01\x00\x00\x00\x00$\r\x12\xd3\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x124Vx\n'
77

88

9-
def getLocalHostIP():
10-
localHostIP = socket.gethostbyname(socket.gethostname())
9+
def get_local_host_ip():
10+
local_host_ip = socket.gethostbyname(socket.gethostname())
1111
try:
1212
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1313
s.connect(('8.8.8.8', 80))
14-
localHostIP = s.getsockname()[0]
14+
local_host_ip = s.getsockname()[0]
1515
finally:
1616
s.close()
17-
return localHostIP
17+
return local_host_ip
1818

1919

20-
def getTime():
20+
def get_time():
2121
return time.strftime('%H:%M:%S')
2222

2323

@@ -112,7 +112,7 @@ def parse_raw_pkt(pkt):
112112
try:
113113
infos = {"motd": decode_unicode(infos[1]), "version_id": infos[2], "version": infos[3], "online": infos[4],
114114
"max_player": infos[5], "unique_id": infos[6], "map": decode_unicode(infos[7]), "gamemode": infos[8],
115-
"source_port_v4": infos[10], "source_port_v6": infos[11], "addr": f"{addr[0]}:{addr[1]}"}
115+
"source_port_v4": infos[10], "source_port_v6": infos[11], "ip": addr[0], "addr": f"{addr[0]}:{addr[1]}"}
116116
except IndexError:
117117
return None, addr
118118
if infos["source_port_v4"] != str(addr[1]):

scan.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44
import time
55
import traceback
66
import argparse
7+
import os
78
import multiprocessing as mp
89

910
from tqdm import tqdm
1011

11-
from api import MOTD_PKT, getTime, parse_raw_pkt, get_ip_list, get_udp_socket
12-
13-
scan_res = []
12+
from api import MOTD_PKT, get_time, parse_raw_pkt, get_ip_list, get_udp_socket
1413

1514

1615
def split_list(total: int, num_splits: int) -> list:
@@ -91,7 +90,7 @@ def recv_packets(udp_skt, pbar):
9190

9291
server_count += 1
9392

94-
values = [f"[Time ] {getTime()}",
93+
values = [f"[Time ] {get_time()}",
9594
f"[Address] {infos['addr']}",
9695
f"[MotdInf] {infos['motd']}",
9796
f"[Version] {infos['version']}/{infos['version_id']}",
@@ -101,7 +100,8 @@ def recv_packets(udp_skt, pbar):
101100
""]
102101
if int(infos['online']) >= display_online:
103102
pbar.write("\n".join(values))
104-
scan_res.append(values)
103+
if exec_cmd:
104+
threading.Thread(target=exec_cmd_async, args=(exec_cmd, infos), daemon=True).start()
105105
except socket.timeout:
106106
continue
107107
except ConnectionResetError:
@@ -116,6 +116,12 @@ def recv_packets(udp_skt, pbar):
116116
continue
117117

118118

119+
def exec_cmd_async(cmd: str, variables: dict = [None]) -> None:
120+
for key in variables:
121+
cmd = cmd.replace("{"+key+"}", variables[key])
122+
os.system(cmd)
123+
124+
119125
if __name__ == "__main__":
120126
mp.freeze_support()
121127
parser = argparse.ArgumentParser()
@@ -126,13 +132,18 @@ def recv_packets(udp_skt, pbar):
126132
help="local port for send packet")
127133
parser.add_argument("-do", "--display-online", default=0, type=int,
128134
help="only displayed when the number of online players is greater than or equal to this value")
135+
parser.add_argument("-e", "--exec-cmd", default="", type=str,
136+
help="the cmd command that is executed immediately after scanning the server can use {var} as a variable, "
137+
+ "the command needs to be enclosed in double quotes, the available variables are: motd, version_id, "
138+
+ "version, online, max_player, unique_id, map, gamemode, source_port_v4, source_port_v6, addr and ip")
129139

130140
args, unparsed = parser.parse_known_args()
131141

132142
addr = args.addr
133143
interval = args.interval
134144
local_port = args.port
135145
display_online = args.display_online
146+
exec_cmd = args.exec_cmd
136147

137148
udp_skt = get_udp_socket(local_port)
138149

send.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@
99
from api import get_udp_socket, log
1010

1111

12-
def getProxy() -> list:
12+
def get_proxy() -> list:
1313
try:
14-
log(f"Trying to get proxy data from api...")
14+
log(f"Trying to get proxy data from api...", quiet=quiet_mode)
1515
proxy_info = requests.get(
1616
f"https://www.proxyscan.io/api/proxy?last_check=3600&uptime=&ping=&limit=1&type=socks5&format=json&country={proxyCountry}").json()
1717
proxy_addr = proxy_info[0]['Ip']
1818
proxy_port = proxy_info[0]['Port']
1919
return proxy_addr, int(proxy_port)
2020
except:
2121
if not os.path.exists(r"socks5.txt"):
22-
log(f"Request api failed. Downloading proxy list...")
22+
log(f"Request api failed. Downloading proxy list...", quiet=quiet_mode)
2323
wget.download(
2424
"https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks5.txt")
2525
print()
26-
log(f"Proxy list downloaded!")
26+
log(f"Proxy list downloaded!", quiet=quiet_mode)
2727
with open("socks5.txt", "r") as file:
2828
socks_list = file.readlines()
2929
random_index = random.randint(0, len(socks_list) - 1)
@@ -32,12 +32,12 @@ def getProxy() -> list:
3232
return proxy_addr, int(proxy_port)
3333

3434

35-
def createSocket():
35+
def create_socket():
3636
local_port = random.randint(1024, 65535)
3737
proxy_addr, proxy_port = None, None
3838
if proxy_used:
3939
udp_skt = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM)
40-
proxy_addr, proxy_port = getProxy()
40+
proxy_addr, proxy_port = get_proxy()
4141
udp_skt.set_proxy(socks.SOCKS5, proxy_addr, proxy_port)
4242
if proxy_used:
4343
log(f"Used proxy: {proxy_addr}:{proxy_port}")
@@ -49,21 +49,21 @@ def createSocket():
4949
def send_pkt(target_addr: str, port: int, payload_file: str, loops: int, interval: float):
5050
for i in range(loops):
5151
try:
52-
local_port, udp_skt = createSocket()
52+
local_port, udp_skt = create_socket()
5353
except:
5454
continue
5555
payloads = None
5656
try:
5757
payloads = marshal.load(open(payload_file, "rb"))
5858
except:
59-
log(f"Payload file {payload_file} not found!")
59+
log(f"Payload file {payload_file} not found!", quiet=quiet_mode)
6060
os._exit(114514)
6161
try:
6262
if is_display_motd:
6363
send_motd_pkt(target_addr, port)
6464
except:
6565
if is_display_motd:
66-
log(f"Target server offline.")
66+
log(f"Target server offline.", quiet=quiet_mode)
6767
try:
6868
if port == "*":
6969
for port in range(65535):
@@ -72,9 +72,9 @@ def send_pkt(target_addr: str, port: int, payload_file: str, loops: int, interva
7272
else:
7373
for line in payloads:
7474
udp_skt.sendto(line, (target_addr, int(port)))
75-
log(f"Loop {i} done, used local port: {local_port} \n")
75+
log(f"Loop {i} done, used local port: {local_port} \n", quiet=quiet_mode)
7676
except:
77-
log(f"Loop {i} error! Skip...\n")
77+
log(f"Loop {i} error! Skip...\n", quiet=quiet_mode)
7878
pass
7979
if i+1 < loops:
8080
time.sleep(interval)
@@ -87,6 +87,7 @@ def send_pkt(target_addr: str, port: int, payload_file: str, loops: int, interva
8787
parser.add_argument("-p", "--port", type=int, default=19132, help="Port (Number)")
8888
parser.add_argument("-l", "--loops", type=int, default=1, help="Loops (Number)")
8989
parser.add_argument("-i", "--interval", type=float, default=10, help="Interval (sec)")
90+
parser.add_argument("-q", "--quiet", action="store_true", default=False, help="Quiet mode. no output")
9091
parser.add_argument("-d", "--display_motd", action="store_true", default=False, help="Display Motd")
9192
parser.add_argument("-pu", "--proxy_used", action="store_true", default=False, help="Use Proxy")
9293
parser.add_argument("-pc", "--proxy_country", type=str, default="us", help="ProxyCountry (like cn, ru, us or enter to use all)")
@@ -98,6 +99,7 @@ def send_pkt(target_addr: str, port: int, payload_file: str, loops: int, interva
9899
loops = args.loops
99100
interval = args.interval
100101
is_display_motd = args.display_motd
102+
quiet_mode = args.quiet
101103
proxy_used = args.proxy_used
102104
proxyCountry = args.proxy_country
103105

0 commit comments

Comments
 (0)