import asyncio
import socket
import time
import random
import uuid
character_login = <hex bytes (capture yours with wireshark)>
north = bytes.fromhex('0c0042032711b5ec00c8060821a9')
east = bytes.fromhex('0c00f8030912707a939926bcf10e')
south = bytes.fromhex('0c00ce02c70b774a1860399822a1')
west = bytes.fromhex('0c007103701057d9803a324ceb1d')
pong = bytes.fromhex('0c00e803011495dc0cefca223d52')
logout = bytes.fromhex('0c0008050f1ae4a4f6c83ff94f3a')
attack = bytes.fromhex('0c000e058717f0697183fbb5d040')
response = bytearray()
async def tcp_client(host: str, port: int):
reader, writer = await asyncio.open_connection(host, port)
sock = writer.get_extra_info('socket')
if sock is not None:
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
print(f'Connected to {host}:{port}')
try :
pkt_length = await reader.read(2)
packet_length = int.from_bytes(pkt_length, 'little')
chunk = await reader.read(packet_length)
print(packet_length, chunk[:20])
data = bytes.fromhex(character_login)
writer.write(data)
await writer.drain()
print('Data sent')
start = time.time()
last_ping = time.time()
count = 0
count_attack = 0
previous_val = 0
global response
response = bytearray()
response.extend(pkt_length + chunk)
while True:
pkt_length = await reader.read(2)
packet_length = int.from_bytes(pkt_length, 'little')
chunk = await reader.read(packet_length)
chunk = pkt_length + chunk
if not chunk:
break
if time.time() - last_ping >= 5:
last_ping = time.time()
writer.write(pong)
print('sending pong')
await writer.drain()
await asyncio.sleep(0.1)
count_attack += 1
#print(time.time() - start, packet_length, chunk[:20])
# if count_attack == 4:
# writer.write(attack)
# await writer.drain()
if random.random() > 0.75:
val = (count + random.randrange(4)) % 4
else:
val = previous_val
previous_val = val
match val:
case 0:
writer.write(east)
await writer.drain()
case 1:
writer.write(south)
await writer.drain()
case 2:
writer.write(west)
await writer.drain()
case 3:
writer.write(north)
await writer.drain()
await asyncio.sleep(0.1)
count += 1
response.extend(chunk)
except asyncio.CancelledError as e:
print('exception', e)
writer.write(logout)
await writer.drain()
end = time.time()
print(f'took {end-start}')
writer.close()
await writer.wait_closed()
print('Connection closed')
with open(f'{time.time()}_{uuid.uuid4().hex}', 'wb') as f:
f.write(response)
if __name__ == "__main__":
client = tcp_client('192.168.1.8', 7172)
asyncio.run(client)