Skip to content

Commit 77353dc

Browse files
WillowSauceRWillowSauceR
authored andcommitted
Refector project
1 parent 473fb07 commit 77353dc

File tree

5 files changed

+289
-450
lines changed

5 files changed

+289
-450
lines changed

README.md

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
1-
# ***本工具包所有内容基于GPL3.0开源,请勿将本项目用于非法用途***
1+
# ***本工具包所有内容基于GPL3.0开源,请勿将本项目用于非法用途。由使用本工具包造成的任何问题,作者概不负责!***
22

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

5-
# 或者使用 `git clone https://github.com/WillowSauceR/tools`将本项目克隆到本地或直接下载本项目,然后使用python3来运行
5+
## 或者使用 `git clone https://github.com/WillowSauceR/tools`将本项目克隆到本地或直接下载本项目,然后使用python3来运行
66

77
## scan.py
88

9-
### 使用方法: `python3 scan.py [目标地址] [端口范围: 如1145-1919或all] [是否启用详细输出] [可选:超时时间,单位为秒,填0为不限] [可选:保存结果的文件名]`
9+
### 使用方法: `python3 scan.py [目标地址] -i [可选:发包间隔] -p [可选:本地端口]`
1010

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

13-
#### 注意:目标地址可以填域名,IP列表文件,IP或者IP段。如 mc.163.com,ipList.txt,11.4.5.14,191.191.81-255.0-255
14-
15-
#### 注意:如果目标地址与保存结果的文件名一致,便会进入更新模式。会自动更新具有相同数字motd的数据条目,并且将变动IP的服务器单独记录到updated.txt文件
13+
#### 注意:目标地址可以填域名,IP或者IP段。如 mc.163.com,11.4.5.14,191.191.81-255.0-255
1614

1715
## send.py
1816

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

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

2321
#### 注意:代理功能处于开发阶段,不建议使用。默认使用[GitHub上的代理](https://github.com/ShiftyTR/Proxy-List),如果需要使用其他代理,请将socks5.txt文件填充为你的代理IP端口
2422

25-
#### 注意:目标地址可以填IP,域名,或 文件名:motd。如11.4.5.14,114514.com,ipList.txt:motd
26-
27-
#### 注意:如果同时填写文件名和端口8,那么在对方服务器不在线时自动使用扫描来更新文件
23+
#### 注意:目标地址可以填IP或域名。如11.4.5.14,sex.homo.com
2824

2925
## motd.py
3026

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

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

api.py

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
import socket
22
import time
3+
import sys
4+
import random
5+
6+
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'
7+
38

49
def getLocalHostIP():
510
localHostIP = socket.gethostbyname(socket.gethostname())
6-
try:
7-
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
8-
s.connect(('8.8.8.8', 80))
9-
localHostIP = s.getsockname()[0]
11+
try:
12+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
13+
s.connect(('8.8.8.8', 80))
14+
localHostIP = s.getsockname()[0]
1015
finally:
1116
s.close()
1217
return localHostIP
1318

19+
1420
def getTime():
1521
return time.strftime('%H:%M:%S')
1622

23+
1724
def log(*content, level: str = "INFO", info: str = "", quiet: bool = False):
1825
if quiet:
1926
return
@@ -25,4 +32,86 @@ def log(*content, level: str = "INFO", info: str = "", quiet: bool = False):
2532
if info != "":
2633
print(f"[{date} {info}] {content}")
2734
else:
28-
print(f"[{date}] {content}")
35+
print(f"[{date}] {content}")
36+
37+
38+
def get_ip_list(ip: str):
39+
# ip = "42.186.0-255.0-255" -> len(ip_list) == 65536
40+
ip_list = []
41+
processed_ip_segs = [[], [], [], []]
42+
ip_seg_index = 0
43+
ip_segs = ip.split(".") # 42.186.0-255.0-255 -> [42, 186, 0-255, 0-255]
44+
for ip_seg in ip_segs:
45+
if "-" in ip_seg:
46+
seg_list = ip_seg.split("-") # 0-255 -> [0, 255]
47+
for i in range(int(seg_list[0]), int(seg_list[1])+1): # range(0, 255+1)
48+
processed_ip_segs[ip_seg_index].append(str(i))
49+
else:
50+
processed_ip_segs[ip_seg_index].append(
51+
ip_seg) # append("42") & append("186")
52+
ip_seg_index += 1
53+
54+
for processed_ip_seg_a in processed_ip_segs[0]: # 42
55+
for processed_ip_seg_b in processed_ip_segs[1]: # 186
56+
for processed_ip_seg_c in processed_ip_segs[2]: # range(0, 256)
57+
# range(0, 256)
58+
for processed_ip_seg_d in processed_ip_segs[3]:
59+
ip_list.append(
60+
f"{processed_ip_seg_a}.{processed_ip_seg_b}.{processed_ip_seg_c}.{processed_ip_seg_d}")
61+
return ip_list
62+
63+
64+
def decode_unicode(string: str):
65+
is_special_unicode = False
66+
for index in range(0, len(string), 5):
67+
if string[index] != "u":
68+
is_special_unicode = False
69+
break
70+
else:
71+
is_special_unicode = True
72+
73+
if is_special_unicode:
74+
string = string.replace("u", "\\u")
75+
76+
try:
77+
string.encode('ascii')
78+
except UnicodeEncodeError:
79+
return string
80+
else:
81+
return string.encode("utf-8").decode("unicode-escape")
82+
83+
84+
def get_udp_socket(port=random.randint(1024, 65535)):
85+
if not port:
86+
port = random.randint(1024, 65535)
87+
sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
88+
sockets.settimeout(1)
89+
if sys.platform.startswith('win32'):
90+
sockets.bind(("", port))
91+
return sockets
92+
93+
94+
def parse_raw_pkt(pkt):
95+
server_data, addr = pkt
96+
# motd packet must contain b"MCPE"
97+
if b"MCPE" not in server_data or len(server_data) <= 30:
98+
return None, addr
99+
infos = []
100+
prefix, motd_info = server_data.split(b"MCPE")
101+
infos_byte = motd_info.split(b";")
102+
for info in infos_byte:
103+
try:
104+
context = info.decode()
105+
except UnicodeDecodeError:
106+
context = str(info)[2:-1]
107+
infos.append(context)
108+
try:
109+
infos = {"motd": decode_unicode(infos[1]), "version_id": infos[2], "version": infos[3], "online": infos[4],
110+
"max_player": infos[5], "unique_id": infos[6], "map": decode_unicode(infos[7]), "gamemode": infos[8],
111+
"source_port_v4": infos[10], "source_port_v6": infos[11], "addr": f"{addr[0]}:{addr[1]}"}
112+
except IndexError:
113+
return None, addr
114+
if infos["source_port_v4"] != str(addr[1]):
115+
# return None, addr
116+
pass
117+
return infos, addr

motd.py

Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,49 @@
1-
from random import randint
2-
import socket
3-
import sys
4-
from api import getLocalHostIP, getTime, log
5-
localHostIP = getLocalHostIP()
6-
7-
8-
def sendPacket(ip, port):
9-
sk_send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
10-
sk_send.settimeout(3)
11-
sk_send.bind((localHostIP, randint(1024, 65535)))
12-
sk_send.sendto(
13-
b'\x01\x00\x00\x00\x00$\r\x12\xd3\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x124Vx\n',
14-
(str(ip), int(port)))
15-
recvPacket(sk_send)
16-
17-
18-
def recvPacket(sk_send):
19-
data, addr = sk_send.recvfrom(10240)
20-
infos = []
21-
prefix, motd_info = data.split(b"MCPE")
22-
infos_byte = motd_info.split(b";")
23-
for info in infos_byte:
24-
try:
25-
context = info.decode()
26-
except:
27-
context = str(info)[2:-1]
28-
infos.append(context)
29-
log(f"Motd: {infos[1]}")
30-
log(f"Versin: {infos[3]}/{infos[2]}")
31-
log(f"Online: {infos[4]}/{infos[5]}")
1+
import argparse
2+
from api import get_udp_socket, log, parse_raw_pkt, MOTD_PKT
3+
4+
5+
def send_pkt(addr, port, timeout):
6+
udp_skt = get_udp_socket(port)
7+
udp_skt.settimeout(timeout)
8+
udp_skt.sendto(
9+
MOTD_PKT,
10+
(addr, port))
11+
recv_pkt(udp_skt)
12+
13+
14+
def recv_pkt(sk_send):
15+
infos, addr = parse_raw_pkt(sk_send.recvfrom(10240))
16+
log(f"Motd: {infos['motd']}")
17+
log(f"Versin: {infos['version']}/{infos['version_id']}")
18+
log(f"Online: {infos['online']}/{infos['max_player']}")
3219
try:
33-
log(f"Map: {infos[7]}/{infos[8]}")
20+
log(f"Map: {infos['map']}/{infos['gamemode']}")
3421
except:
3522
log(f"Map info is unavailable.")
3623
try:
37-
log(f"Port(v4/v6): {infos[10]}/{infos[11]}")
24+
log(f"Port(v4/v6): {infos['source_port_v4']}/{infos['source_port_v6']}")
3825
except:
3926
log(f"Port info is unavailable.")
40-
log(f"Source: {addr[0]}:{addr[1]}")
41-
#infos = {"motd": infos[1], "version_id": infos[2], "version": infos[3], "online": infos[4], "max_player": infos[5],
42-
# "unique_id": infos[6], "map": infos[7], "gamemode": infos[8], "source_port_v4": infos[10], "source_port_v6": infos[11]}
27+
log(f"Source: {infos['addr']}")
4328

4429
sk_send.close()
4530

4631

4732
if __name__ == "__main__":
33+
parser = argparse.ArgumentParser()
34+
parser.add_argument("addr", help="target server address, can be domain or ip")
35+
parser.add_argument("port", type=int, default=19132,
36+
help="target server port")
37+
parser.add_argument("-t", "--timeout", default=3.0, type=float,
38+
help="timeout")
39+
40+
args = parser.parse_args()
41+
42+
addr = args.addr
43+
port = args.port
44+
timeout = args.timeout
45+
4846
try:
49-
ip = sys.argv[1]
50-
port = sys.argv[2]
51-
except:
52-
ip = input("Target: ")
53-
port = input("Port: ")
54-
try:
55-
sendPacket(ip, port)
47+
send_pkt(addr, port, timeout)
5648
except:
5749
log(f"Timeout! Server may be offline or blocked motd request.")

0 commit comments

Comments
 (0)