Skip to content

Commit 332ce48

Browse files
WillowSauceRWillowSauceR
authored andcommitted
support scan ip seguments
1 parent b57050a commit 332ce48

File tree

3 files changed

+137
-47
lines changed

3 files changed

+137
-47
lines changed

.gitignore

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
socks5.txt
2-
__pycache__/motd.cpython-37.pyc
2+
__pycache__
33
.gitignore
4-
t.py
5-
__pycache__/api.cpython-37.pyc
4+
test.py
5+
result.txt
6+
targetList.txt
7+
targetListNmap.txt

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@
66

77
## scan.py
88

9-
### 使用方法: `python3 scan.py [IP]`
9+
### 使用方法: `python3 scan.py [目标地址] [是否启用详细输出] [可选:超时时间,单位为秒,默认无限] [可选:保存结果的文件名]`
1010

11-
#### 描述: 扫描一个IP上的所有BE协议服务器,使用前建议安装[Npcap](https://npcap.com/dist/npcap-1.60.exe),然后使用命令 `pip install scapy`来安装依赖,基于scapy,基本不漏服
11+
#### 描述: 扫描IP上的所有BE协议服务器,使用前建议安装[Npcap](https://npcap.com/dist/npcap-1.60.exe),然后使用命令 `pip install scapy`来安装依赖,基于scapy,基本不漏服
12+
13+
#### 注意:目标地址可以填域名,IP或者IP段。如 mc.163.com,11.4.5.14,191.191.81-255.0-255
1214

1315
## send.py
1416

15-
### 使用方法: `python3 send.py [IP] [端口] [载体包文件] [次数] [间隔:秒] [自动显示MOTD] [使用代理] [代理的国家,如cn, ru, us]`
17+
### 使用方法: `python3 send.py [目标地址] [端口] [载体包文件] [次数] [间隔:秒] [自动显示MOTD] [使用代理] [代理的国家,如cn, ru, us]`
1618

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

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

2123
## motd.py
2224

23-
### 使用方法: `python3 motd.py [IP] [端口]`
25+
### 使用方法: `python3 motd.py [目标地址] [端口]`
2426

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

scan.py

Lines changed: 126 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,151 @@
1-
from os import _exit
2-
from random import randint
31
import socket
4-
import threading
52
import sys
3+
import threading
64
import time
5+
from os import _exit
6+
from random import randint
7+
78
from scapy.all import *
9+
from scapy.layers.inet import IP, UDP
10+
811
from api import getLocalHostIP
912

1013
localHostIP = getLocalHostIP()
1114
localHostPort = randint(1024, 65535)
1215

1316
try:
1417
TargetAddr = str(sys.argv[1])
18+
verboseMode = str(sys.argv[2])
1519
except:
1620
TargetAddr = input("Target IP: ")
21+
verboseMode = input("Show verbose info(y/n): ")
22+
23+
try:
24+
timeout = int(sys.argv[3])
25+
except:
26+
timeout = None
27+
28+
try:
29+
fileName = str(sys.argv[4])
30+
except:
31+
fileName = ""
32+
1733
motdData = b'\x01\x00\x00\x00\x00$\r\x12\xd3\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x124Vx\n'
1834
serverCount = 0
1935

2036

21-
def sendPacket(startNum, count):
37+
def getIpList(ip: str):
38+
ipList = []
39+
if os.path.exists(TargetAddr):
40+
with open(TargetAddr, "r") as file:
41+
for ip in file.readlines():
42+
ipList.append(ip[:-1])
43+
return ipList
44+
try:
45+
int(ip[-1])
46+
# ip = "8.8.1-5.8-11"
47+
processedIpSegs = [[], [], [], []]
48+
ipSegIndex = 0
49+
ipSegs = ip.split(".") # 8.8.0-255.0-5 -> [8, 8, 0-255, 0-5]
50+
for ipSeg in ipSegs:
51+
if "-" in ipSeg:
52+
segList = ipSeg.split("-") # 0-5 -> [0, 5]
53+
# range(0, 5) -> [0, 1, 2, 3, 4]
54+
for i in range(int(segList[0]), int(segList[1])+1):
55+
processedIpSegs[ipSegIndex].append(str(i))
56+
else:
57+
processedIpSegs[ipSegIndex].append(ipSeg)
58+
ipSegIndex += 1
59+
60+
# [['8'], ['8'], ['1', '2', '3', '4'], ['8', '9', '10']]
61+
for processedIpSegA in processedIpSegs[0]:
62+
for processedIpSegB in processedIpSegs[1]:
63+
for processedIpSegC in processedIpSegs[2]:
64+
for processedIpSegD in processedIpSegs[3]:
65+
ipList.append(
66+
f"{processedIpSegA}.{processedIpSegB}.{processedIpSegC}.{processedIpSegD}")
67+
return ipList
68+
except:
69+
return [ip]
70+
71+
72+
def sendPacket(startNum, count, ip):
2273
port = startNum
2374
while True:
75+
if stopThread:
76+
break
2477
Time = time.strftime('%H:%M:%S')
25-
if port % 1000 == 0:
78+
if port % 1000 == 0 and verboseMode == "y":
2679
print(f"[{Time} I] Scaning port: {str(port)} ~ {str(port + 1000)}")
27-
send(IP(src=localHostIP, dst=TargetAddr) / UDP(sport=localHostPort, dport=port) /
80+
send(IP(src=localHostIP, dst=ip) / UDP(sport=localHostPort, dport=port) /
2881
motdData,
2982
verbose=False)
3083
if port == 65535:
31-
print(f"[{Time} I] Port {startNum} ~ 65535 Done")
84+
if verboseMode == "y":
85+
print(f"[{Time} I] Port {startNum} ~ 65535 Done")
3286
while True:
87+
if threading.enumerate().__len__() == 2:
88+
break
3389
time.sleep(1)
3490
elif port == startNum + count - 1:
35-
print(f"[{Time} I] Port {startNum} ~ {startNum + count} Done")
36-
time.sleep(10)
37-
print("BE Server Count: " + str(serverCount))
38-
print("BDS Count: " + str(bdsCount))
39-
print("NK Count: " + str(nkCount))
40-
print("Geyser Count: " + str(geyserCount))
41-
print("Skipped Count: " + str(skipped))
42-
print("Error Count: " + str(error))
43-
print("Total Player Count: " + str(totalPlayerCount))
44-
_exit(0)
91+
if verboseMode == "y":
92+
print(f"[{Time} I] Port {startNum} ~ {startNum + count} Done")
93+
break
4594
port += 1
4695

4796

48-
t1 = threading.Thread(target=sendPacket, args=(0, 10000))
49-
t2 = threading.Thread(target=sendPacket, args=(10000, 10000))
50-
t3 = threading.Thread(target=sendPacket, args=(20000, 10000))
51-
t4 = threading.Thread(target=sendPacket, args=(30000, 10000))
52-
t5 = threading.Thread(target=sendPacket, args=(40000, 10000))
53-
t6 = threading.Thread(target=sendPacket, args=(50000, 10000))
54-
t7 = threading.Thread(target=sendPacket, args=(60000, 5535))
55-
t1.setDaemon(True)
56-
t2.setDaemon(True)
57-
t3.setDaemon(True)
58-
t4.setDaemon(True)
59-
t5.setDaemon(True)
60-
t6.setDaemon(True)
61-
t7.setDaemon(True)
62-
t1.start()
63-
t2.start()
64-
t3.start()
65-
t4.start()
66-
t5.start()
67-
t6.start()
68-
t7.start()
97+
def startThreads():
98+
global stopThread
99+
ipList = getIpList(TargetAddr)
100+
for ip in ipList:
101+
time.sleep(1)
102+
stopThread = False
103+
print()
104+
print(
105+
f"[{time.strftime('%H:%M:%S')} I] Scaning target: {ip}")
106+
print()
107+
t1 = threading.Thread(target=sendPacket, args=(0, 10000, ip))
108+
t2 = threading.Thread(target=sendPacket, args=(10000, 10000, ip))
109+
t3 = threading.Thread(target=sendPacket, args=(20000, 10000, ip))
110+
t4 = threading.Thread(target=sendPacket, args=(30000, 10000, ip))
111+
t5 = threading.Thread(target=sendPacket, args=(40000, 10000, ip))
112+
t6 = threading.Thread(target=sendPacket, args=(50000, 10000, ip))
113+
t7 = threading.Thread(target=sendPacket, args=(60000, 5535, ip))
114+
t1.setDaemon(True)
115+
t2.setDaemon(True)
116+
t3.setDaemon(True)
117+
t4.setDaemon(True)
118+
t5.setDaemon(True)
119+
t6.setDaemon(True)
120+
t7.setDaemon(True)
121+
t1.start()
122+
t2.start()
123+
t3.start()
124+
t4.start()
125+
t5.start()
126+
t6.start()
127+
t7.start()
128+
tmpServerCount = serverCount
129+
if timeout:
130+
time.sleep(timeout)
131+
if tmpServerCount == serverCount:
132+
stopThread = True
133+
while threading.enumerate().__len__() != 2: # main and itself
134+
time.sleep(1)
135+
136+
print("BE Server Count: " + str(serverCount))
137+
print("BDS Count: " + str(bdsCount))
138+
print("NK Count: " + str(nkCount))
139+
print("Geyser Count: " + str(geyserCount))
140+
print("Skipped Count: " + str(skipped))
141+
print("Error Count: " + str(error))
142+
print("Total Player Count: " + str(totalPlayerCount))
143+
_exit(0)
144+
145+
146+
t = threading.Thread(target=startThreads)
147+
t.setDaemon(True)
148+
t.start()
69149

70150
bdsCount = 0
71151
nkCount = 0
@@ -127,6 +207,10 @@ def sendPacket(startNum, count):
127207
totalPlayerCount += int(infos[4])
128208
print(f"[{date} C] {str(serverCount)}")
129209
print(f"[{date} P] {totalPlayerCount}")
210+
if fileName:
211+
with open(fileName, "a+") as file:
212+
file.write(
213+
f"{date} | {serverCount} | {addr[0]} | {addr[1]} | {infos[1]} | {infos[3]} | {infos[4]}\n")
130214
if len(infos) == 10 or len(infos) == 6:
131215
nkCount += 1
132216
elif re.search(b"edicated", data):
@@ -136,7 +220,9 @@ def sendPacket(startNum, count):
136220
elif re.search(b"eyser", data):
137221
geyserCount += 1
138222
sk_rec.close()
139-
except:
140-
print(f"[{time.strftime('%H:%M:%S')} R] An error occurred, skipped.")
223+
except OSError:
224+
pass
225+
except Exception as info:
226+
print(f"[{time.strftime('%H:%M:%S')} R] {info}, skipped.")
141227
error += 1
142228
pass

0 commit comments

Comments
 (0)