dunno where its at

This commit is contained in:
rooba 2022-04-14 06:53:36 +00:00
parent 1779b47daf
commit c02054ad1b
10 changed files with 12833 additions and 145 deletions

8969
clb.log Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,10 @@
from .character import Character, Traits
from .client import Client
from .client_base import ClientBase, JUNK
from .client_base import ClientBase
from .packet import Packet, iPacket, oPacket
from .packet_helper import Helpers
from .client import NAMES
# from .client import NAMES
from .proxies import private, public
__all__ = (
"Character",
@ -13,7 +14,10 @@ __all__ = (
"Packet",
"iPacket",
"oPacket",
"NAMES",
# "NAMES",
"Traits",
"JUNK"
# "JUNK",
# "proxies",
"public",
"private"
)

View File

@ -11,14 +11,14 @@ from .packet_helper import Helpers
from .tools import big_fuckin_mac
NAMES = []
# NAMES = []
class Client(ClientBase):
def __init__(
self,
loop=None,
# names=None,
names=None,
username=None,
password=None,
proxy=None,
@ -36,13 +36,12 @@ class Client(ClientBase):
self._characters = []
self._character_id = 0
self._char_selected = None
self._NAMES = NAMES
self._NAMES = names
self._char_name = ""
async def process_events(self):
while self._loop.is_running():
action = await self._action_queue.get()
match action:
case SendOps.LOGIN_PASSWORD:

View File

@ -2,9 +2,12 @@ from asyncio import (Event, Lock, Queue, Task, TimeoutError, create_task,
get_event_loop, sleep)
from datetime import datetime
from socket import AF_INET, IPPROTO_TCP, SOCK_STREAM, TCP_NODELAY, socket
from logging import log, basicConfig
basicConfig(filename="clb.log", filemode="a", level=10)
# from socks import socksocket, SOCKS5, create_connection
from socks import socksocket, SOCKS5, create_connection
from random import choice
try:
from python_socks import ProxyConnectionError
from python_socks.async_.asyncio._connect import connect_tcp
@ -22,6 +25,7 @@ from re import compile
from .crypto import MapleAes, MapleIV, decrypt_transform, encrypt_transform
from .opcodes import RecvOps, SendOps
from .packet import PacketHandler, iPacket
from .proxies import public, private
PROXY_RE = compile(r"(?=^(?:([^:]+):([^@]+)@)?([^:]+):([^$]+)$)")
JUNK = set()
@ -35,22 +39,23 @@ class ClientBase:
self._proxy_url = proxy or ""
match = PROXY_RE.match(self._proxy_url)
if match:
if len(match.groups()) > 2:
self._prox_user, self._prox_pass, self._prox_ip, self._prox_port = match.groups()
self._prox_port = int(self._prox_port)
else:
self._proxy_ip, self._proxy_port = match.groups()
self._proxy_port = int(self._proxy_port)
self._proxy_user = None
self._proxy_pass = None
# if match:
if len(match.groups()) > 2:
self._prox_user, self._prox_pass, self._prox_ip, self._prox_port = match.groups()
self._prox_port = int(self._prox_port)
else:
...
self._prox_ip, self._prox_port = match.groups()
self._prox_port = int(self._prox_port)
self._prox_user = None
self._prox_pass = None
print(f"User: {self._prox_user} | Password: {self._prox_pass} | IP: {self._prox_ip} | Port: {self._prox_port}")
self._tasks = []
self._packet_handlers = []
self._can_login: Event = Event()
self._migrating: Event = Event()
self._change_channel: Event = Event()
self._migrated: Event = Event()
self._wait_sock_connect = Event()
self._lock: Lock = Lock()
@ -73,38 +78,61 @@ class ClientBase:
self.add_packet_handlers()
async def _connect_sock(self):
# self._sock = socket(family=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP)
# self._sock = socksocket(family=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP)
# self._sock.setblocking(False)
# self._sock.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
# self._sock.setproxy(proxy_type=SOCKS5, addr=self._prox_ip, port=self._prox_port, username=self._prox_user, password=self._prox_pass)
# await self._loop.sock_connect(self._sock, (self._host, self._conn_port))
self._conn = Socks5Proxy(proxy_host=self._prox_ip, proxy_port=self._prox_port, username=self._prox_user, password=self._prox_pass)
# if hasattr(self, "_sock"):
# self._sock.close()
# del self._sock
# while not hasattr(self, "_sock"):
if hasattr(self, "_prox_user"):
self._conn = Socks5Proxy(proxy_host=self._prox_ip, proxy_port=self._prox_port, username=self._prox_user, password=self._prox_pass, loop=self._loop)
# print(self._conn_port)
else:
self._conn = Socks5Proxy(proxy_host=self._prox_ip, proxy_port=self._prox_port, loop=self._loop)
try:
self._sock = await self._conn.connect(self._host, self._conn_port)
except ProxyConnectionError:
print(f"{ProxyConnectionError.__name__} | Unable connect to proxy socket")
JUNK.add(self._proxy_url)
del self._events_task
return
except TimeoutError:
print(f"{TimeoutError.__name__} | Unable to connect to proxy")
JUNK.add(self._proxy_url)
del self._events_task
return
self._sock = await self._conn.connect(self._host, self._conn_port, timeout=10.0)
except Exception as e:
print(f"Unhandled Exception | {e.__class__.__name__}")
del self._events_task
print(f"{e} eaaaaaaaaaaaaaa")
# try:
# self._sock = await self._conn.connect(self._host, self._conn_port)
# except ProxyConnectionError:
# print(f"{ProxyConnectionError.__name__} | Unable connect to proxy socket")
# JUNK.add(self._proxy_url)
# # del self._events_task
# # return False
# except TimeoutError:
# print(f"{TimeoutError.__name__} | Unable to connect to proxy")
# JUNK.add(self._proxy_url)
# # del self._events_task
# # return False
# except Exception as e:
# print(f"Unhandled Exception | {e.__class__.__name__}")
# # continue
# # del self._events_task
# if not self._migrating.is_set():
# if not hasattr(self, "_sock"):
# prox = choice(public).split(":")
# self._prox_ip = prox[0]
# self._prox_port = prox[1]
# continue
self._wait_sock_connect.set()
async def start(self):
self._events_task = create_task(self.process_events())
self._loop.create_task(self.process_events())
self._host = "51.222.56.169"
self._conn_port = LOGIN_PORT
await self._sock_recv()
self._loop.create_task(self._sock_recv())
async def send_packet(self, opacket, raw=False):
async with self._lock:
@ -117,10 +145,12 @@ class ClientBase:
MapleAes.transform(opkt, self._send_iv)
buf[4 : length + 4] = opkt
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [SEND] : {SendOps(opacket.op_code).name} | {opacket.to_string()}")
# print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [SEND] : {SendOps(opacket.op_code).name} | {opacket.to_string()}")
if not self._sock:
return
await self._wait_sock_connect.wait()
# if not self._sock:
# return
await self._loop.sock_sendall(self._sock, buf)
@ -131,88 +161,103 @@ class ClientBase:
await self._action_queue.put(op_code)
self._tasks.append(create_task(schd()))
self._loop.create_task(schd())
async def _sock_recv(self):
await self._connect_sock()
while self._loop.is_running():
await self._wait_sock_connect.wait()
try:
await self._wait_sock_connect.wait()
while self._sock:
while hasattr(self, "_sock"):
await sleep(1)
self._buff.extend(bytearray((await self._loop.sock_recv(self._sock, 8192))))
try:
self._buff.extend(bytearray((await self._loop.sock_recv(self._sock, 8192))))
if self._buff == bytearray(b"\x00\x00\x00\x00\x00\x00") and len(self._buff) == 6:
break
if self._buff == bytearray(b"\x00\x00\x00\x00\x00\x00"):
self._wait_sock_connect.clear()
self._recv_iv.reset()
self._send_iv.reset()
self._buff = bytearray()
self._prev_buff = bytearray()
break
if not self._send_iv and self._buff:
begin_packet = iPacket(self._buff)
op_code = 0x0E
# print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [Client Hello]")
if not self._send_iv and self._buff:
begin_packet = iPacket(self._buff)
op_code = 0x0E
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [Client Hello]")
self._version = begin_packet.decode_short()
self._sub_version = int(begin_packet.decode_string())
self._send_iv(begin_packet.decode_int())
self._recv_iv(begin_packet.decode_int())
self._locale = begin_packet.decode_byte()
self._version = begin_packet.decode_short()
self._sub_version = int(begin_packet.decode_string())
self._send_iv(begin_packet.decode_int())
self._recv_iv(begin_packet.decode_int())
self._locale = begin_packet.decode_byte()
self._buff = bytearray()
if self._conn_port != LOGIN_PORT and self._migrating.is_set():
self.schedule_action(SendOps.PLAYER_LOGGEDIN, 2.0)
self._migrated.set()
self._migrating.clear()
else:
self.schedule_action(SendOps.LOGIN_PASSWORD, 2.0)
else:
while len(self._buff) > 0:
try:
length = MapleAes.get_length(self._buff[0:4])
buf = bytearray(bytearray(self._buff)[4 : length + 4])
buf = bytearray(MapleAes.transform(buf, self._recv_iv))
buf = decrypt_transform(buf)
packet = iPacket(buf)
await self.handle_packet(packet)
if len(self._buff) - (length + 4) > 0:
self._buff = self._buff[length + 4 :]
else:
self._buff = bytearray()
self._prev_buff = self._buff
except:
...
except ConnectionResetError as e:
self._recv_iv.reset()
self._send_iv.reset()
self._buff = bytearray()
self._prev_buff = bytearray()
self._wait_sock_connect.clear()
await self._connect_sock()
except Exception as e:
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] error in sock_recv: {e}")
if self._conn_port != LOGIN_PORT and self._migrating.is_set():
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [Client Hello] [Player Logged In]")
log(20, msg=f"IP - {self._prox_ip} Port - {self._prox_port} LoginPort - {self._conn_port}")
# await sleep(2.0)
# self._loop.create_task(self.migrate_in())
self.schedule_action(SendOps.PLAYER_LOGGEDIN, 2.0)
self._migrated.set()
self._migrating.clear()
else:
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [Client Hello] [Client Begin]")
# await sleep(2.0)
# self._loop.create_task(self.do_login())
self.schedule_action(SendOps.LOGIN_PASSWORD, 2.0)
else:
migrate = False
while len(self._buff) > 0:
try:
length = MapleAes.get_length(self._buff[0:4])
buf = bytearray(bytearray(self._buff)[4 : length + 4])
buf = bytearray(MapleAes.transform(buf, self._recv_iv))
buf = decrypt_transform(buf)
packet = iPacket(buf)
migrate = await self.handle_packet(packet)
if migrate:
break
if len(self._buff) - (length + 4) > 0:
self._buff = self._buff[length + 4 :]
else:
self._buff = bytearray()
self._prev_buff = self._buff
except Exception as e:
print(f"buffer error: {e}")
break
if migrate:
break
else:
print(f"Sock got terminated")
break
except Exception as e:
print(f"Unhandled Exception line 215: {e}")
print(f"Exception within sock_recv | {e}")
finally:
# self._sock.close()
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] closing socket")
print(self._conn_port)
if self._conn_port != LOGIN_PORT:
if not self._migrating.is_set() and self._change_channel.is_set():
self._migrating.set()
self._change_channel.clear()
elif self._migrated.is_set() and not self._change_channel.is_set() and self._migrating.is_set():
self._migrating.clear()
self._migrated.clear()
self._recv_iv.reset()
self._send_iv.reset()
self._buff = bytearray()
self._prev_buff = bytearray()
self._wait_sock_connect.clear()
await self._connect_sock()
async def handle_packet(self, packet):
coro = None
@ -222,17 +267,16 @@ class ClientBase:
coro = pkt_hndl.callback
break
else:
print(
f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [RECV] [UNHANDLED] : {RecvOps(packet.op_code).name} | {packet.to_string()}"
)
return
# print(
# f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [RECV] [UNHANDLED] : {RecvOps(packet.op_code).name} | {packet.to_string()}"
# )
return False
if not coro:
return
# raise AttributeError
return False
print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [RECV] : {RecvOps(packet.op_code).name} | {packet.to_string()}")
# print(f"[{datetime.now().strftime('%d %H:%M:%S.%f')}] [RECV] : {RecvOps(packet.op_code).name}")# | {packet.to_string()}")
if packet.op_code == RecvOps.SERVER_IP:
self._migrating.set()
@ -240,18 +284,11 @@ class ClientBase:
packet.decode_int()
self._conn_port = packet.decode_short()
self._client_id = packet.decode_int()
self._sock.close()
del self._sock
self._send_iv.reset()
self._recv_iv.reset()
self._buff = bytearray()
self._prev_buff = bytearray()
self._wait_sock_connect.clear()
await self._connect_sock()
return False
# await self._connect_sock()
return True
else:
create_task(coro(self, packet))
return False
def add_packet_handlers(self):
@ -268,3 +305,9 @@ class ClientBase:
async def process_events(self):
raise NotImplementedError
async def migrate_in(self):
raise NotImplementedError
async def do_login(self):
raise NotImplementedError

3525
clb/proxies.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -3,9 +3,7 @@ from random import randint, choice
def big_fuckin_mac() -> str:
hexchars = "ABCDEF0123456789"
return f'''{', '.join([
choice(["FF-AA-66-66-00-77", "NN-II-GG-GG-EE-RR"]) for _ in range(40)
])}, {'-'.join([f"{choice(hexchars)}{choice(hexchars)}" for _ in range(6)])}'''
return f'''{'-'.join([f"{choice(hexchars)}{choice(hexchars)}" for _ in range(6)])}'''
class TagPoint:

100
proxies.txt Normal file
View File

@ -0,0 +1,100 @@
tinydowser:b57d4879@89.39.255.5:61336
tinydowser:b57d4879@89.39.255.8:61336
tinydowser:b57d4879@89.39.255.10:61336
tinydowser:b57d4879@89.39.255.11:61336
tinydowser:b57d4879@89.39.255.14:61336
tinydowser:b57d4879@89.39.255.16:61336
tinydowser:b57d4879@89.39.255.18:61336
tinydowser:b57d4879@89.39.255.23:61336
tinydowser:b57d4879@89.39.255.24:61336
tinydowser:b57d4879@89.39.255.25:61336
tinydowser:b57d4879@89.39.255.26:61336
tinydowser:b57d4879@89.39.255.28:61336
tinydowser:b57d4879@89.39.255.30:61336
tinydowser:b57d4879@89.39.255.31:61336
tinydowser:b57d4879@89.39.255.32:61336
tinydowser:b57d4879@89.39.255.33:61336
tinydowser:b57d4879@89.39.255.35:61336
tinydowser:b57d4879@89.39.255.37:61336
tinydowser:b57d4879@89.39.255.39:61336
tinydowser:b57d4879@89.39.255.40:61336
tinydowser:b57d4879@89.39.255.41:61336
tinydowser:b57d4879@89.39.255.44:61336
tinydowser:b57d4879@89.39.255.46:61336
tinydowser:b57d4879@89.39.255.48:61336
tinydowser:b57d4879@89.39.255.50:61336
tinydowser:b57d4879@89.39.255.51:61336
tinydowser:b57d4879@89.39.255.55:61336
tinydowser:b57d4879@89.39.255.60:61336
tinydowser:b57d4879@89.39.255.61:61336
tinydowser:b57d4879@89.39.255.62:61336
tinydowser:b57d4879@89.39.255.69:61336
tinydowser:b57d4879@89.39.255.73:61336
tinydowser:b57d4879@89.39.255.74:61336
tinydowser:b57d4879@89.39.255.76:61336
tinydowser:b57d4879@89.39.255.85:61336
tinydowser:b57d4879@89.39.255.87:61336
tinydowser:b57d4879@89.39.255.88:61336
tinydowser:b57d4879@89.39.255.89:61336
tinydowser:b57d4879@89.39.255.92:61336
tinydowser:b57d4879@89.39.255.93:61336
tinydowser:b57d4879@89.39.255.94:61336
tinydowser:b57d4879@89.39.255.97:61336
tinydowser:b57d4879@89.39.255.99:61336
tinydowser:b57d4879@89.39.255.100:61336
tinydowser:b57d4879@89.39.255.102:61336
tinydowser:b57d4879@89.39.255.104:61336
tinydowser:b57d4879@89.39.255.105:61336
tinydowser:b57d4879@89.39.255.108:61336
tinydowser:b57d4879@89.39.255.111:61336
tinydowser:b57d4879@89.39.255.114:61336
tinydowser:b57d4879@89.39.255.115:61336
tinydowser:b57d4879@89.39.255.116:61336
tinydowser:b57d4879@89.39.255.118:61336
tinydowser:b57d4879@89.39.255.119:61336
tinydowser:b57d4879@89.39.255.123:61336
tinydowser:b57d4879@89.39.255.125:61336
tinydowser:b57d4879@89.39.255.128:61336
tinydowser:b57d4879@89.39.255.132:61336
tinydowser:b57d4879@89.39.255.135:61336
tinydowser:b57d4879@89.39.255.141:61336
tinydowser:b57d4879@89.39.255.143:61336
tinydowser:b57d4879@89.39.255.146:61336
tinydowser:b57d4879@89.39.255.147:61336
tinydowser:b57d4879@89.39.255.149:61336
tinydowser:b57d4879@89.39.255.153:61336
tinydowser:b57d4879@89.39.255.157:61336
tinydowser:b57d4879@89.39.255.159:61336
tinydowser:b57d4879@89.39.255.161:61336
tinydowser:b57d4879@89.39.255.166:61336
tinydowser:b57d4879@89.39.255.168:61336
tinydowser:b57d4879@89.39.255.171:61336
tinydowser:b57d4879@89.39.255.172:61336
tinydowser:b57d4879@89.39.255.174:61336
tinydowser:b57d4879@89.39.255.179:61336
tinydowser:b57d4879@89.39.255.180:61336
tinydowser:b57d4879@89.39.255.183:61336
tinydowser:b57d4879@89.39.255.184:61336
tinydowser:b57d4879@89.39.255.185:61336
tinydowser:b57d4879@89.39.255.186:61336
tinydowser:b57d4879@89.39.255.189:61336
tinydowser:b57d4879@89.39.255.190:61336
tinydowser:b57d4879@89.39.255.196:61336
tinydowser:b57d4879@89.39.255.197:61336
tinydowser:b57d4879@89.39.255.200:61336
tinydowser:b57d4879@89.39.255.203:61336
tinydowser:b57d4879@89.39.255.207:61336
tinydowser:b57d4879@89.39.255.210:61336
tinydowser:b57d4879@89.39.255.215:61336
tinydowser:b57d4879@89.39.255.216:61336
tinydowser:b57d4879@89.39.255.220:61336
tinydowser:b57d4879@89.39.255.231:61336
tinydowser:b57d4879@89.39.255.237:61336
tinydowser:b57d4879@89.39.255.240:61336
tinydowser:b57d4879@89.39.255.241:61336
tinydowser:b57d4879@89.39.255.243:61336
tinydowser:b57d4879@89.39.255.246:61336
tinydowser:b57d4879@89.39.255.247:61336
tinydowser:b57d4879@89.39.255.248:61336
tinydowser:b57d4879@89.39.255.249:61336
tinydowser:b57d4879@89.39.255.252:61336

38
pyproject.toml Normal file
View File

@ -0,0 +1,38 @@
[build-system]
requires = ["setuptools>=60.5", "wheel"]
[tool.black]
exclude = 'generated'
target-version = ["py39", "py310"]
[tool.yapf]
[tool.isort]
# https://github.com/PyCQA/isort/wiki/isort-Settings
profile = "black"
# will group `import x` and `from x import` of the same module.
combine_as_imports = true
force_sort_within_sections = true
[project.optional-dependencies]
linux = [
"uvloop",
]
[tool.yapf]
coalesce_brackets = true
decent_closing_brackets = true
each_dict_entry_on_separate_line = false
split_before_dot = true
split_before_first_argument = true
split_before_logical_operator = true
# based_on_style = "google"
based_on_style = "yapf"
column_limit = 83
indent_width = 4
spaces_before_comment = 2
[tool.flake8]
ignore = "E203,E402,E501,E722,W503,MD041,F811"
max-line-length = 80
select = "C,E,F,W,B,B950,B9,ISC"

View File

@ -1,5 +1,9 @@
pycryptodome==3.14.1
attrs==21.4.0
uvloop>=0.16.0
async_timeout>=4.0.2
python_socks>=2.0.3
pycryptodome >= 3.14.1
attrs == 21.4.0
uvloop [uvloop] >= 0.16.0; python_version >= "3.10"
async-timeout >= 4.0.2
python-socks >= 2.0.3
color
Pygments [color]
rich [color]

40
run.py
View File

@ -2,7 +2,7 @@ from asyncio import create_task, get_event_loop, new_event_loop, run, sleep
from json import loads
from random import choice
import clb
from clb import public, private, Client
try:
import uvloop
@ -14,35 +14,43 @@ from os.path import dirname
dir_path = dirname(__file__)
NAMES = []
ACCOUNTS = []
TASKS = []
PROXIES = []
with open(f"{dir_path}/.names", "r") as f:
clb.NAMES.extend([l.rstrip("\n") for l in f.readlines()])
with open(f".names", "r") as f:
NAMES.extend([l.rstrip("\n") for l in f.readlines()])
with open(f"{dir_path}/.words", "r") as f:
clb.NAMES.extend([l.rstrip("\n") for l in f.readlines()])
with open(f".words", "r") as f:
NAMES.extend([l.rstrip("\n") for l in f.readlines()])
with open(f"{dir_path}/.proxies", "r") as f:
with open(f"proxies.txt", "r") as f:
for line in f.readlines():
PROXIES.append(line.rstrip("\n"))
with open(f"{dir_path}/.accounts_2", "r") as f:
# with open(f"{dir_path}/.proxies", "r") as f:
# for line in f.readlines():
# PROXIES.append(line.rstrip("\n"))
with open(f".accounts2", "r") as f:
ACCOUNTS = loads(f.read())
print(len(clb.NAMES), len(PROXIES), len(ACCOUNTS))
print(f"{dir_path}/.accounts_2")
print(len(NAMES), len(public), len(ACCOUNTS))
loop = new_event_loop()
async def create_clients():
loop = get_event_loop()
loop.set_debug(True)
for account in ACCOUNTS[65:67]:
client = clb.Client(
for account in ACCOUNTS[200:300]:
client = Client(
loop=loop,
# names=NAMES,
names=NAMES,
username=account["username"],
password=account["password"],
proxy=choice(PROXIES)
@ -53,10 +61,10 @@ async def create_clients():
await sleep(60.0)
# run(create_clients())
loop.run_until_complete(create_clients())
# loop.run_forever()
loop.run_forever()
with open("{dir_path}/.junk", "w+") as f:
for l in clb.JUNK:
f.write(f"{l}""\n")
# with open("{dir_path}/.junk", "w+") as f:
# for l in clb.JUNK:
# f.write(f"{l}""\n")