Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 309beede26 | |||
| 215ea7b887 | |||
| fdddee106c | |||
| 5cc7895e98 | |||
| 42a2de368a | |||
| 4d58dbf925 | |||
| 9dbd925fb9 | |||
| 051b019b83 | |||
| 3f57b10240 | |||
| 939e03e845 | |||
| 71179c5da1 | |||
| 064c01ee81 | |||
| fc61a67d0c | |||
| e2895f480a | |||
| 4f706f9ecc | |||
| 02b8a72aa5 | |||
| 3644975110 | |||
| 3e615858af | |||
| d80500bd12 | |||
| cda6bfb27d | |||
| 692ad2305f | |||
| fba79d3775 | |||
| ce05b2fb49 | |||
| 0fc5f66d3b | |||
| a16d6ece17 | |||
| 7d8f84868c | |||
| 1ff674c9b1 | |||
| 8ef86979c6 | |||
| 969d14359b | |||
| 9ec8572e5b | |||
| 0367fd69d0 | |||
| d899647c57 | |||
| b26cff674c | |||
| bc1cb66dda | |||
| 6f2e56db76 | |||
| 0afdb6be66 | |||
| 69d130e2d0 | |||
| 797e382f93 | |||
| 9a2e3ef94a | |||
| 3a7345736c | |||
| 56b5ef9df7 | |||
| 6e9a5f1137 | |||
| 671c7c1ae5 | |||
| ef8ed5bd7e | |||
| c225be4f9b | |||
| 90af9fbde3 | |||
| 79fc673617 | |||
| c36b8fe93d | |||
| ef624644b3 | |||
| 9766a12ece | |||
| 01a7decfc9 | |||
| 8f136d1172 | |||
| 21d3ff3b44 | |||
| 4dafd0bf8f | |||
| ac6f8ea630 | |||
| a1222c897a | |||
| ce463df61b | |||
| 0c8bf457a3 | |||
| 28e39d6c34 | |||
| 88bdc3e58e | |||
| d190a2537a | |||
| 9377c8d17e | |||
| c6575d904d | |||
| 9a16c93191 | |||
| a8a9736bf1 | |||
| c43c4bb580 |
@@ -17,11 +17,9 @@ btsnoop.log
|
||||
# xcode
|
||||
xcuserdata
|
||||
*.xcworkspace
|
||||
macos-framework/IOBluetoothExtended.framework/
|
||||
|
||||
# venv
|
||||
venv
|
||||
venv3
|
||||
|
||||
# pycharm
|
||||
*.idea
|
||||
|
||||
@@ -54,17 +54,6 @@ was also recorded and gives a more high level overview.
|
||||
|
||||
Our talk [Playing with Bluetooth](https://media.ccc.de/v/2019-185-playing-with-bluetooth) focuses on new device support
|
||||
within *InternalBlue* and the Patchram state of various devices.
|
||||
|
||||
* **36C3 Talk** (12/2019)
|
||||
|
||||
The rather generic talk [All wireless communication stacks are equally broken](https://media.ccc.de/v/36c3-10531-all_wireless_communication_stacks_are_equally_broken)
|
||||
points out a couple of new research directions and new Bluetooth projects coming up.
|
||||
|
||||
* **EWSN Paper & Demo** (02/2020)
|
||||
|
||||
We did some work on improving blacklisting performance of BLE data connections. Currently in a separate *blacklisting* branch.
|
||||
|
||||
|
||||
|
||||
|
||||
Supported Features
|
||||
@@ -225,7 +214,7 @@ can replace them with anything you want.
|
||||
License
|
||||
-------
|
||||
|
||||
Copyright 2018-2020 The InternalBlue Team
|
||||
Copyright 2018-2019 Dennis Mantz, Jiska Classen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
# Get receive statistics on a Nexus 5 for BLE connection events
|
||||
|
||||
from builtins import range
|
||||
from pwn import *
|
||||
from internalblue.adbcore import ADBCore
|
||||
import internalblue.hci as hci
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
# Get receive statistics on a Samsung Galaxy S8 for BLE connection events
|
||||
|
||||
from builtins import range
|
||||
from pwn import *
|
||||
from internalblue.adbcore import ADBCore
|
||||
import internalblue.hci as hci
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
try:
|
||||
from queue import Queue
|
||||
from Queue import Queue
|
||||
from typing import List, Optional, Any, TYPE_CHECKING, Tuple, Union, NewType, Callable, Dict
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@@ -35,3 +33,30 @@ try:
|
||||
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
class ProgressLog():
|
||||
"""
|
||||
Hack to get around the dependency to the pwnlib logger
|
||||
This looses functionality, but at some point this can be replaced by something like progressbar2
|
||||
"""
|
||||
def __init__(self, init_msg,logger):
|
||||
self.logger = logger
|
||||
self.logger.warning(init_msg)
|
||||
|
||||
def failure(self, msg):
|
||||
self.logger.warning(msg)
|
||||
|
||||
def status(self, msg):
|
||||
self.logger.info(msg)
|
||||
|
||||
def success(self, msg):
|
||||
self.logger.info(msg)
|
||||
|
||||
def getLogger(name):
|
||||
logger = logging.getLogger(name)
|
||||
logger.progress = lambda msg: ProgressLog(msg, logger)
|
||||
return logger
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
#!/usr/bin/env python2
|
||||
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from builtins import str
|
||||
import datetime
|
||||
import socket
|
||||
import queue as queue2k
|
||||
import Queue
|
||||
import random
|
||||
from internalblue import hci
|
||||
from internalblue.utils import bytes_to_hex
|
||||
|
||||
from pwn import *
|
||||
|
||||
@@ -145,7 +141,7 @@ class ADBCore(InternalBlue):
|
||||
while(not self.exit_requested and len(record_hdr) < 24):
|
||||
try:
|
||||
recv_data = self.s_snoop.recv(24 - len(record_hdr))
|
||||
log.debug("recvThreadFunc: received bt_snoop data " + bytes_to_hex(recv_data))
|
||||
log.debug("recvThreadFunc: received bt_snoop data " + recv_data.encode('hex'))
|
||||
if len(recv_data) == 0:
|
||||
log.info("recvThreadFunc: bt_snoop socket was closed by remote site. stopping recv thread...")
|
||||
self.exit_requested = True
|
||||
@@ -167,7 +163,7 @@ class ADBCore(InternalBlue):
|
||||
orig_len, inc_len, flags, drops, time64 = struct.unpack( ">IIIIq", record_hdr)
|
||||
|
||||
# Read the record data
|
||||
record_data = bytearray()
|
||||
record_data = b''
|
||||
while(not self.exit_requested and len(record_data) < inc_len):
|
||||
try:
|
||||
recv_data = self.s_snoop.recv(inc_len - len(record_data))
|
||||
@@ -175,7 +171,7 @@ class ADBCore(InternalBlue):
|
||||
log.info("recvThreadFunc: bt_snoop socket was closed by remote site. stopping..")
|
||||
self.exit_requested = True
|
||||
break
|
||||
record_data += bytearray(recv_data)
|
||||
record_data += recv_data
|
||||
except socket.timeout:
|
||||
pass # this is ok. just try again without error
|
||||
|
||||
@@ -205,7 +201,7 @@ class ADBCore(InternalBlue):
|
||||
if filter_function == None or filter_function(record):
|
||||
try:
|
||||
queue.put(record, block=False)
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("recvThreadFunc: A recv queue is full. dropping packets..")
|
||||
|
||||
# Call all callback functions inside registeredHciCallbacks and pass the
|
||||
|
||||
+8
-10
@@ -28,8 +28,6 @@
|
||||
# Software.
|
||||
|
||||
|
||||
from __future__ import print_function
|
||||
from builtins import str
|
||||
from pwn import *
|
||||
import os
|
||||
import traceback
|
||||
@@ -72,7 +70,7 @@ def commandLoop(internalblue, init_commands=None):
|
||||
if cmdstack:
|
||||
cmdline = cmdstack.pop().strip()
|
||||
else:
|
||||
cmdline = term.readline.readline(prompt='> ').strip().decode('utf-8')
|
||||
cmdline = term.readline.readline(prompt='> ').strip()
|
||||
cmdword = cmdline.split(' ')[0].split('=')[0]
|
||||
if(cmdword == ''):
|
||||
continue
|
||||
@@ -82,11 +80,12 @@ def commandLoop(internalblue, init_commands=None):
|
||||
log.warn("Command unknown: " + cmdline)
|
||||
continue
|
||||
cmd_instance = matching_cmd(cmdline, internalblue)
|
||||
|
||||
if(not cmd_instance.work()):
|
||||
log.warn("Command failed: " + str(cmd_instance))
|
||||
except ValueError as e:
|
||||
log.warn("commandLoop: ValueError: " + str(e))
|
||||
raise
|
||||
continue
|
||||
except KeyboardInterrupt:
|
||||
if(cmd_instance != None):
|
||||
cmd_instance.abort_cmd()
|
||||
@@ -104,7 +103,7 @@ def commandLoop(internalblue, init_commands=None):
|
||||
internalblue.exit_requested = True # Make sure all threads terminate
|
||||
log.critical("Uncaught exception (%s). Abort." % str(e))
|
||||
print(traceback.format_exc())
|
||||
raise
|
||||
break
|
||||
cmd_instance = None
|
||||
|
||||
def _parse_argv(argv):
|
||||
@@ -239,7 +238,7 @@ def internalblue_cli(argv, args=None):
|
||||
# Restore readline history:
|
||||
if os.path.exists(reference.data_directory + "/" + HISTFILE):
|
||||
readline_history = read(reference.data_directory + "/" + HISTFILE)
|
||||
term.readline.history = readline_history.split(b'\n')
|
||||
term.readline.history = readline_history.split('\n')
|
||||
|
||||
# Connect to device
|
||||
if not reference.connect():
|
||||
@@ -254,10 +253,9 @@ def internalblue_cli(argv, args=None):
|
||||
reference.shutdown()
|
||||
|
||||
# Save readline history:
|
||||
# TODO: - This causes issues, have to fix ASAP
|
||||
# f = open(reference.data_directory + "/" + HISTFILE, "w")
|
||||
# f.write("\n".join(term.readline.history))
|
||||
# f.close()
|
||||
f = open(reference.data_directory + "/" + HISTFILE, "w")
|
||||
f.write("\n".join(term.readline.history))
|
||||
f.close()
|
||||
|
||||
# Cleanup
|
||||
log.info("Goodbye")
|
||||
|
||||
+46
-51
@@ -23,11 +23,6 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from __future__ import print_function
|
||||
from builtins import str
|
||||
from builtins import hex
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
from pwn import *
|
||||
import os
|
||||
import sys
|
||||
@@ -40,9 +35,11 @@ import struct
|
||||
import time
|
||||
import select
|
||||
import json
|
||||
from internalblue.utils import bytes_to_hex
|
||||
|
||||
|
||||
from internalblue import getLogger
|
||||
|
||||
#log = getLogger(__name__)
|
||||
|
||||
|
||||
|
||||
@@ -86,7 +83,7 @@ def bt_addr_to_str(bt_addr):
|
||||
# type: (BluetoothAddress) -> str
|
||||
""" Convert a Bluetooth address (6 bytes) into a human readable format.
|
||||
"""
|
||||
return ":".join(format(x, '02x') for x in bytearray(bt_addr))
|
||||
return ":".join([b.encode("hex") for b in bt_addr])
|
||||
|
||||
def parse_bt_addr(bt_addr):
|
||||
# type: (Any) -> Optional[BluetoothAddress]
|
||||
@@ -110,7 +107,7 @@ def parse_bt_addr(bt_addr):
|
||||
return addr
|
||||
|
||||
|
||||
class Cmd(object):
|
||||
class Cmd:
|
||||
""" This class is the superclass of a CLI command. Every CLI command
|
||||
must be defined as subclass of Cmd. The subclass must define the
|
||||
'keywords' list as member variable. The actual implementation of the
|
||||
@@ -289,8 +286,7 @@ class CmdLogLevel(Cmd):
|
||||
log_levels = ['CRITICAL', 'DEBUG', 'ERROR', 'INFO', 'NOTSET', 'WARN', 'WARNING']
|
||||
|
||||
for keyword in list(keywords):
|
||||
for log_level in log_levels:
|
||||
keywords.append('%s %s' % (keyword, log_level))
|
||||
keywords.extend(['%s %s' % (keyword, log_level) for log_level in log_levels])
|
||||
|
||||
parser = argparse.ArgumentParser(prog=keywords[0],
|
||||
description=description,
|
||||
@@ -322,7 +318,7 @@ class CmdMonitor(Cmd):
|
||||
parser.add_argument("command",
|
||||
help="One of: start, stop, kill")
|
||||
|
||||
class MonitorController(object):
|
||||
class MonitorController:
|
||||
instance = None
|
||||
|
||||
@staticmethod
|
||||
@@ -332,7 +328,7 @@ class CmdMonitor(Cmd):
|
||||
CmdMonitor.MonitorController.instance = CmdMonitor.MonitorController.__MonitorController(internalblue, 0xC9)
|
||||
return CmdMonitor.MonitorController.instance
|
||||
|
||||
class __MonitorController(object):
|
||||
class __MonitorController:
|
||||
def __init__(self, internalblue, pcap_data_link_type):
|
||||
self.internalblue = internalblue
|
||||
self.running = False
|
||||
@@ -552,7 +548,7 @@ class CmdDumpMem(Cmd):
|
||||
bytes_total = sum([s.size() for s in self.internalblue.fw.SECTIONS if s.is_ram])
|
||||
bytes_done = 0
|
||||
self.progress_log = log.progress("Downloading RAM sections...")
|
||||
for section in [s for s in self.internalblue.fw.SECTIONS if s.is_ram]:
|
||||
for section in filter(lambda s: s.is_ram, self.internalblue.fw.SECTIONS):
|
||||
filename = args.file + "_" + hex(section.start_addr)
|
||||
if os.path.exists(filename):
|
||||
if not (args.overwrite or yesno("Update '%s'?" % filename)):
|
||||
@@ -605,10 +601,10 @@ class CmdSearchMem(Cmd):
|
||||
highlight = pattern
|
||||
if args.hex:
|
||||
try:
|
||||
pattern = bytearray.fromhex(pattern)
|
||||
pattern = pattern.decode('hex')
|
||||
highlight = pattern
|
||||
except TypeError as e:
|
||||
log.warn("Search pattern cannot be converted to bytestring: " + str(e))
|
||||
log.warn("Search pattern cannot be converted to hexstring: " + str(e))
|
||||
return False
|
||||
elif args.address:
|
||||
pattern = p32(int(pattern, 16))
|
||||
@@ -657,7 +653,7 @@ class CmdHexdump(Cmd):
|
||||
if dump == None:
|
||||
return False
|
||||
|
||||
log.hexdump(bytes(dump), begin=args.address)
|
||||
log.hexdump(dump, begin=args.address)
|
||||
return True
|
||||
|
||||
class CmdTelescope(Cmd):
|
||||
@@ -772,9 +768,9 @@ class CmdWriteMem(Cmd):
|
||||
data = ' '.join(args.data)
|
||||
if args.hex:
|
||||
try:
|
||||
data = bytearray.fromhex(data)
|
||||
data = data.decode('hex')
|
||||
except TypeError as e:
|
||||
log.warn("Hex string cannot be converted to bytestring: " + str(e))
|
||||
log.warn("Data string cannot be converted to hexstring: " + str(e))
|
||||
return False
|
||||
elif args.int:
|
||||
data = p32(auto_int(data))
|
||||
@@ -957,7 +953,7 @@ class CmdSendHciCmd(Cmd):
|
||||
log.info("cmdcode needs to be in the range of 0x0000 - 0xffff")
|
||||
return False
|
||||
|
||||
data = b''
|
||||
data = ''
|
||||
for data_part in args.data:
|
||||
if data_part[0:2] == "0x":
|
||||
data += p32(auto_int(data_part))
|
||||
@@ -1079,9 +1075,9 @@ class CmdSendLmp(Cmd):
|
||||
connection = self.internalblue.readConnectionInformation(i+1)
|
||||
if connection == None:
|
||||
continue
|
||||
if connection.connection_handle != 0 and connection.remote_address != b'\x00\x00\x00\x00\x00\x00':
|
||||
args.conn_handle = connection.connection_handle
|
||||
is_master = connection.master_of_connection
|
||||
if connection["connection_handle"] != 0 and connection["remote_address"] != b'\x00\x00\x00\x00\x00\x00':
|
||||
args.conn_handle = connection["connection_handle"]
|
||||
is_master = connection["master_of_connection"]
|
||||
break
|
||||
|
||||
# if still not set, typical connection handles seem to be 0x0b...0x0d
|
||||
@@ -1182,21 +1178,21 @@ class CmdInfo(Cmd):
|
||||
continue
|
||||
|
||||
log.info("### | Connection ---%02d--- ###" % i)
|
||||
log.info(" - Number: %d" % connection.connection_number)
|
||||
log.info(" - Remote BT address: %s" % bt_addr_to_str(connection.remote_address))
|
||||
log.info(" - Remote BT name: %08X" % connection.remote_name_address)
|
||||
log.info(" - Master of Conn.: %s" % str(connection.master_of_connection))
|
||||
log.info(" - Conn. Handle: 0x%X" % connection.connection_handle)
|
||||
log.info(" - Public RAND: %s" % bytes_to_hex(connection.public_rand))
|
||||
#log.info(" - PIN: %s" % bytes_to_hex(connection.pin)
|
||||
#log.info(" - BT addr for key: %s" % bt_addr_to_str(connection.bt_addr_for_key))
|
||||
log.info(" - Effective Key Len: %d byte (%d bit)" % (connection.effective_key_len, 8*connection["effective_key_len"]))
|
||||
log.info(" - Link Key: %s" % bytes_to_hex(connection.link_key))
|
||||
log.info(" - LMP Features: %s" % bytes_to_hex(connection.extended_lmp_feat))
|
||||
log.info(" - Host Supported F: %s" % bytes_to_hex(connection.host_supported_feat))
|
||||
log.info(" - TX Power (dBm): %d" % connection.tx_pwr_lvl_dBm)
|
||||
log.info(" - Array Index: %s" % bytes_to_hex(connection.id))
|
||||
print()
|
||||
log.info(" - Number: %d" % connection["connection_number"])
|
||||
log.info(" - Remote BT address: %s" % bt_addr_to_str(connection["remote_address"]))
|
||||
log.info(" - Remote BT name: %08X" % connection["remote_name_address"])
|
||||
log.info(" - Master of Conn.: %s" % str(connection["master_of_connection"]))
|
||||
log.info(" - Conn. Handle: 0x%X" % connection["connection_handle"])
|
||||
log.info(" - Public RAND: %s" % connection["public_rand"].encode('hex'))
|
||||
#log.info(" - PIN: %s" % connection["pin"].encode('hex'))
|
||||
#log.info(" - BT addr for key: %s" % bt_addr_to_str(connection["bt_addr_for_key"]))
|
||||
log.info(" - Effective Key Len: %d byte (%d bit)" % (connection["effective_key_len"], 8*connection["effective_key_len"]))
|
||||
log.info(" - Link Key: %s" % connection["link_key"].encode('hex'))
|
||||
log.info(" - LMP Features: %s" % connection["extended_lmp_feat"].encode('hex'))
|
||||
log.info(" - Host Supported F: %s" % connection["host_supported_feat"].encode('hex'))
|
||||
log.info(" - TX Power (dBm): %d" % connection["tx_pwr_lvl_dBm"])
|
||||
log.info(" - Array Index: %s" % connection["id"].encode('hex'))
|
||||
print
|
||||
return True
|
||||
|
||||
def infoDevice(self, args):
|
||||
@@ -1205,14 +1201,14 @@ class CmdInfo(Cmd):
|
||||
log.warn(" '%s' not in fw.py. FEATURE NOT SUPPORTED!" % const)
|
||||
return False
|
||||
bt_addr = self.readMem(self.internalblue.fw.BD_ADDR, 6)[::-1]
|
||||
bt_addr_str = bt_addr_to_str(bt_addr)
|
||||
bt_addr_str = ":".join([b.encode("hex") for b in bt_addr])
|
||||
device_name = self.readMem(self.internalblue.fw.DEVICE_NAME, 258)
|
||||
device_name_len = device_name[0]-1
|
||||
device_name_len = u8(device_name[0])-1
|
||||
device_name = device_name[2:2+device_name_len]
|
||||
adb_serial = context.device
|
||||
|
||||
log.info("### | Device ###")
|
||||
log.info(" - Name: %s" % device_name.decode('utf-8'))
|
||||
log.info(" - Name: %s" % device_name)
|
||||
log.info(" - ADB Serial: %s" % adb_serial)
|
||||
log.info(" - Address: %s" % bt_addr_str)
|
||||
return True
|
||||
@@ -1234,7 +1230,7 @@ class CmdInfo(Cmd):
|
||||
code = disasm(table_values[i],vma=table_addresses[i],byte=False,offset=False)
|
||||
code = code.replace(" ", " ").replace("\n", "; ")
|
||||
log.info("[%03d] 0x%08X: %s (%s)" % (i, table_addresses[i],
|
||||
bytes_to_hex(table_values[i]),
|
||||
table_values[i].encode('hex'),
|
||||
code))
|
||||
return True
|
||||
|
||||
@@ -1312,7 +1308,7 @@ class CmdInfo(Cmd):
|
||||
|
||||
# Print Buffer Details
|
||||
buffer_size = bloc_for_details["buffer_size"] + 4
|
||||
for buffer_address, buffer_hdr in bloc_for_details["buffer_headers"].items():
|
||||
for buffer_address, buffer_hdr in bloc_for_details["buffer_headers"].iteritems():
|
||||
progress_log.status("Dumping buffers from BLOC[%d]: 0x%06X" % (bloc_for_details["index"], buffer_address))
|
||||
# Buffer in use!
|
||||
if buffer_hdr == bloc_for_details["address"]:
|
||||
@@ -1334,7 +1330,7 @@ class CmdInfo(Cmd):
|
||||
|
||||
log.info("[ Idx ] @Queue-Addr Queue-Name Items/Free/Capacity Item-Size Buffer")
|
||||
log.info("------------------------------------------------------------______--------------")
|
||||
for queue in [vars(element) for element in queuelist]:
|
||||
for queue in queuelist:
|
||||
# TODO: waitlist
|
||||
log.info(("QUEU[{index:2d}] @ 0x{address:06X}: {name:21s} {available_items:2d} /"
|
||||
" {free_slots:2d} / {capacity:2d} {item_size:2d} Bytes 0x{queue_buf_start:06X}").format(**queue))
|
||||
@@ -1368,7 +1364,7 @@ class CmdInfo(Cmd):
|
||||
if args.type in subcommands:
|
||||
return subcommands[args.type](args.args)
|
||||
else:
|
||||
log.warn("Unkown type: %s\nKnown types: %s" % (args.type, list(subcommands.keys())))
|
||||
log.warn("Unkown type: %s\nKnown types: %s" % (args.type, subcommands.keys()))
|
||||
return False
|
||||
|
||||
|
||||
@@ -1492,8 +1488,7 @@ class CmdCustom(Cmd):
|
||||
actions = ['list', 'add', 'run', 'remove']
|
||||
|
||||
for keyword in list(keywords):
|
||||
for action in actions:
|
||||
keywords.append('%s %s' % (keyword, action))
|
||||
keywords.extend(['%s %s' % (keyword, action) for action in actions])
|
||||
|
||||
parser = argparse.ArgumentParser(prog=keywords[0],
|
||||
description=description,
|
||||
@@ -1528,7 +1523,7 @@ class CmdCustom(Cmd):
|
||||
return True
|
||||
|
||||
if args.do == 'list':
|
||||
custom_cmds= ["\t%s\t\t%s\n" % (k, v) for k, v in sorted(CmdCustom.custom_commands.items())]
|
||||
custom_cmds= ["\t%s\t\t%s\n" % (k, v) for k, v in sorted(CmdCustom.custom_commands.iteritems())]
|
||||
log.info("Custom commands:\n%s" % ''.join(custom_cmds))
|
||||
return True
|
||||
|
||||
@@ -1613,7 +1608,7 @@ class CmdReadAfhChannelMap(Cmd):
|
||||
if connection == None:
|
||||
continue
|
||||
else:
|
||||
self.readafh(connection.connection_handle)
|
||||
self.readafh(connection["connection_handle"])
|
||||
return True
|
||||
# if not set but connection struct unknown, typical connection handles seem to be 0x0b...0x0d
|
||||
else:
|
||||
@@ -1626,15 +1621,15 @@ class CmdReadAfhChannelMap(Cmd):
|
||||
"""
|
||||
response = self.internalblue.sendHciCommand(0x1406, p16(handle))
|
||||
|
||||
if len(response) < 17 or response[8:] == b'\x00'*9:
|
||||
if len(response) < 17 or response[8:] == '\x00'*9:
|
||||
log.info("Connection 0x%04x is not established." % handle)
|
||||
return False
|
||||
|
||||
log.info("Connection Handle: 0x%04x" % handle)
|
||||
log.info("AFH Enabled: %s" % bool(response[7] != 0))
|
||||
log.info("AFH Enabled: %s" % bool(response[7] != '\x00'))
|
||||
channels = ""
|
||||
for c in response[8:]:
|
||||
bits = format(c, '08b')
|
||||
bits = format(ord(c), '08b')
|
||||
for b in bits:
|
||||
if b == "1":
|
||||
channels = channels + " *"
|
||||
|
||||
+106
-94
@@ -25,26 +25,14 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from __future__ import division
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from builtins import hex
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
from past.utils import old_div
|
||||
from abc import ABCMeta, abstractmethod
|
||||
|
||||
from pwn import *
|
||||
from .fw.fw import Firmware
|
||||
import datetime
|
||||
import time
|
||||
import queue as queue2k
|
||||
import Queue
|
||||
from . import hci
|
||||
from .objects.queue_element import QueueElement
|
||||
from .objects.connection_information import ConnectionInformation
|
||||
from future.utils import with_metaclass
|
||||
from internalblue.utils import bytes_to_hex
|
||||
|
||||
try:
|
||||
from typing import List, Optional, Any, TYPE_CHECKING, Tuple, Union, NewType, Callable
|
||||
@@ -60,7 +48,9 @@ except:
|
||||
#import logging
|
||||
#log = logging.getLogger(__name__)
|
||||
|
||||
class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
class InternalBlue:
|
||||
__metaclass__ = ABCMeta
|
||||
|
||||
def __init__(self, queue_size=1000, btsnooplog_filename='btsnoop.log', log_level='info', fix_binutils='True', data_directory=".", replay=False):
|
||||
# type: (int, str, str, bool, str, bool) -> None
|
||||
context.log_level = log_level
|
||||
@@ -102,12 +92,12 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
# firmware (the response is recognized with the help of the filter function).
|
||||
# Once the response arrived, it puts the response into the response_queue from
|
||||
# the tuple. See sendH4() and sendHciCommand().
|
||||
self.sendQueue = queue2k.Queue(queue_size) # type: Queue.Queue[Task]
|
||||
self.sendQueue = Queue.Queue(queue_size) # type: Queue.Queue[Task]
|
||||
|
||||
self.recvThread = None # The thread which is responsible for the HCI snoop socket
|
||||
self.sendThread = None # The thread which is responsible for the HCI inject socket
|
||||
|
||||
self.tracepoints = [] # A list of currently active tracepoints
|
||||
self.tracepoints = [] # A list of currently active tracepoints
|
||||
# The list contains tuples:
|
||||
# [0] target address
|
||||
# [1] address of the hook code
|
||||
@@ -203,7 +193,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
time_betw_0_and_2000_ad = int("0x00E03AB44A676000", 16)
|
||||
time_since_2000_epoch = datetime.timedelta(microseconds=time) - datetime.timedelta(microseconds=time_betw_0_and_2000_ad)
|
||||
return datetime.datetime(2000, 1, 1) + time_since_2000_epoch
|
||||
|
||||
|
||||
@abstractmethod
|
||||
def _recvThreadFunc(self):
|
||||
# type: () -> None
|
||||
@@ -233,7 +223,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
# Wait for 'send task' in send queue
|
||||
try:
|
||||
task = self.sendQueue.get(timeout=0.5)
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
continue
|
||||
|
||||
# Extract the components of the task
|
||||
@@ -285,12 +275,12 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
# if the caller expects a response: register a queue to receive the response
|
||||
if queue != None and filter_function != None:
|
||||
recvQueue = queue2k.Queue(1)
|
||||
recvQueue = Queue.Queue(1)
|
||||
self.registerHciRecvQueue(recvQueue, filter_function)
|
||||
|
||||
# Send command to the chip using s_inject socket
|
||||
try:
|
||||
log.debug("_sendThreadFunc: Send: " + bytes_to_hex(out))
|
||||
log.debug("_sendThreadFunc: Send: " + str(out.encode('hex')))
|
||||
self.s_inject.send(out)
|
||||
except socket.error:
|
||||
pass
|
||||
@@ -307,7 +297,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
record = recvQueue.get(timeout=2)
|
||||
hcipkt = record[0]
|
||||
data = hcipkt.data
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
log.warn("_sendThreadFunc: No response from the firmware.")
|
||||
data = None
|
||||
self.unregisterHciRecvQueue(recvQueue)
|
||||
@@ -342,7 +332,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
registers += "r10: 0x%08x r11: 0x%08x r12: 0x%08x\n" % \
|
||||
tuple(self.tracepoint_registers[13:16])
|
||||
log.info("Tracepoint 0x%x was hit and deactivated:\n" % pc + registers)
|
||||
|
||||
|
||||
filename = self.data_directory + "/" + "internalblue_tracepoint_registers_%s.bin" % datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
||||
log.info("Captured Registers for Tracepoint to %s" % filename)
|
||||
f = open(filename, "w")
|
||||
@@ -366,7 +356,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
if self.tracepoint_memdump_address == None:
|
||||
self.tracepoint_memdump_address = dump_address
|
||||
normalized_address = dump_address - self.tracepoint_memdump_address
|
||||
normalized_address = dump_address - self.tracepoint_memdump_address
|
||||
self.tracepoint_memdump_parts[normalized_address] = data
|
||||
|
||||
# Check if this was the last packet
|
||||
@@ -547,7 +537,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
# register hci callback:
|
||||
self.registerHciCallback(self.stackDumpReceiver.recvPacket)
|
||||
|
||||
|
||||
if not self.initialize_fimware():
|
||||
log.warn("connect: Failed to initialize firmware!")
|
||||
return False
|
||||
@@ -559,7 +549,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
@abstractmethod
|
||||
def local_connect(self):
|
||||
return True
|
||||
|
||||
|
||||
def initialize_fimware(self):
|
||||
# type: () -> bool
|
||||
"""
|
||||
@@ -568,8 +558,8 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
"""
|
||||
|
||||
# send Read_Local_Version_Information
|
||||
version = self.sendHciCommand(0x1001, ''.encode('utf-8'))
|
||||
|
||||
version = self.sendHciCommand(0x1001, '')
|
||||
|
||||
if not version or len(version) < 11:
|
||||
log.warn("""initialize_fimware: Failed to send a HCI command to the Bluetooth driver.
|
||||
adb: Check if you installed a custom bluetooth.default.so properly on your
|
||||
@@ -578,24 +568,24 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
return False
|
||||
|
||||
# Broadcom uses 0x000f as vendor ID, Cypress 0x0131
|
||||
vendor = (version[9] << 8) + version[8]
|
||||
vendor = (u8(version[9]) << 8) + u8(version[8])
|
||||
if vendor != 0xf and vendor != 0x131:
|
||||
log.critical("Not running on a Broadcom or Cypress chip!")
|
||||
return False
|
||||
else:
|
||||
subversion = (version[11] << 8) + version[10]
|
||||
subversion = (u8(version[11]) << 8) + u8(version[10])
|
||||
|
||||
iOS = False
|
||||
if self.__class__.__name__ == "iOSCore":
|
||||
iOS = True
|
||||
|
||||
self.fw = Firmware(subversion, iOS).firmware
|
||||
|
||||
|
||||
# Safe to turn diagnostic logging on, it just gets a timeout if the Android
|
||||
# driver was recompiled with other flags but without applying a proper patch.
|
||||
log.info("Try to enable debugging on H4 (warning if not supported)...")
|
||||
self.enableBroadcomDiagnosticLogging(True)
|
||||
|
||||
|
||||
return True
|
||||
|
||||
def shutdown(self):
|
||||
@@ -698,7 +688,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
log.warn("registerHciRecvQueue: no such queue is registered!")
|
||||
|
||||
def sendHciCommand(self, opcode, data, timeout=3):
|
||||
# type: (Opcode, bytes, int) -> Optional[bytearray]
|
||||
# type: (Opcode, bytes, int) -> Optional[Any]
|
||||
"""
|
||||
Send an arbitrary HCI command packet by pushing a send-task into the
|
||||
sendQueue. This function blocks until the response is received
|
||||
@@ -710,7 +700,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
# return this instead of the Command Complete Event (which will
|
||||
# follow later and will be ignored). This should be fixed..
|
||||
|
||||
queue = queue2k.Queue(1)
|
||||
queue = Queue.Queue(1)
|
||||
|
||||
# standard HCI command structure
|
||||
payload = p16(opcode) + p8(len(data)) + data
|
||||
@@ -740,14 +730,14 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
timeout=timeout)
|
||||
ret = queue.get(timeout=timeout)
|
||||
return ret
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
log.warn("sendHciCommand: waiting for response timed out!")
|
||||
# If there was no response because the Trace Replay Hook throw an assert it will be in this attribute.
|
||||
# Raise this so the main thread doesn't ignore this and it will be caught by any testing framework
|
||||
if hasattr(self, 'test_failed'):
|
||||
raise self.test_failed
|
||||
return None
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("sendHciCommand: send queue is full!")
|
||||
return None
|
||||
|
||||
@@ -764,7 +754,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
try:
|
||||
self.sendQueue.put((h4type, data, None, None), timeout=timeout)
|
||||
return True
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("sendH4: send queue is full!")
|
||||
return False
|
||||
|
||||
@@ -782,7 +772,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
a blocking manner. Consider using the registerHciCallback()
|
||||
functionality as an alternative which works asynchronously.
|
||||
"""
|
||||
|
||||
|
||||
log.debug("recvPacket: called")
|
||||
|
||||
if not self.check_running():
|
||||
@@ -790,7 +780,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
try:
|
||||
return self.recvQueue.get(timeout=timeout)
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
return None
|
||||
|
||||
def readMem(self, address, length, progress_log=None, bytes_done=0, bytes_total=0):
|
||||
@@ -813,9 +803,9 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
read_addr = address # read_addr is the address of the next Read_RAM HCI command
|
||||
byte_counter = 0 # tracks the number of received bytes
|
||||
outbuffer = bytearray() # buffer which stores all accumulated data read from the chip
|
||||
outbuffer = '' # buffer which stores all accumulated data read from the chip
|
||||
if bytes_total == 0: # If no total bytes where given just use length
|
||||
bytes_total = length
|
||||
bytes_total = length
|
||||
retry = 3 # Retry on failures
|
||||
while read_addr < address+length: # Send HCI Read_RAM commands until all data is received
|
||||
# Send hci frame
|
||||
@@ -848,7 +838,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
log.debug("readMem: insufficient bytes returned, retrying...")
|
||||
continue
|
||||
|
||||
status = response[3]
|
||||
status = ord(response[3])
|
||||
if status != 0:
|
||||
# It is not yet reverse engineered what this byte means. For almost
|
||||
# all memory addresses it will be 0. But for some it will be different,
|
||||
@@ -872,8 +862,8 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
read_addr += len(data)
|
||||
byte_counter += len(data)
|
||||
if(progress_log != None):
|
||||
msg = "receiving data... %d / %d Bytes (%d%%)" % (bytes_done+byte_counter,
|
||||
bytes_total, old_div((bytes_done+byte_counter)*100,bytes_total))
|
||||
msg = "receiving data... %d / %d Bytes (%d%%)" % (bytes_done+byte_counter,
|
||||
bytes_total, (bytes_done+byte_counter)*100/bytes_total)
|
||||
progress_log.status(msg)
|
||||
retry = 3 # this round worked, so we re-enable retries
|
||||
return outbuffer
|
||||
@@ -915,7 +905,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
log.warn("readMemAligned: address (0x%x) must be 4-byte aligned!" % address)
|
||||
return None
|
||||
|
||||
recvQueue = queue2k.Queue(1)
|
||||
recvQueue = Queue.Queue(1)
|
||||
def hciFilterFunction(record):
|
||||
# type: (Record) -> bool
|
||||
hcipkt = record[0]
|
||||
@@ -941,7 +931,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
blocksize = 244
|
||||
|
||||
# Customize the assembler snippet with the current read_addr and blocksize
|
||||
code = asm(self.fw.READ_MEM_ALIGNED_ASM_SNIPPET % (blocksize, read_addr, old_div(blocksize,4)), vma=self.fw.READ_MEM_ALIGNED_ASM_LOCATION, arch='thumb')
|
||||
code = asm(self.fw.READ_MEM_ALIGNED_ASM_SNIPPET % (blocksize, read_addr, blocksize/4), vma=self.fw.READ_MEM_ALIGNED_ASM_LOCATION, arch='thumb')
|
||||
|
||||
# Write snippet to the RAM (TODO: maybe backup and restore content of this area?)
|
||||
self.writeMem(self.fw.READ_MEM_ALIGNED_ASM_LOCATION, code)
|
||||
@@ -958,7 +948,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
# wait for the custom HCI event sent by the snippet:
|
||||
try:
|
||||
record = recvQueue.get(timeout=1)
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
log.warn("readMemAligned: No response from assembler snippet.")
|
||||
return None
|
||||
|
||||
@@ -968,8 +958,8 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
read_addr += len(data)
|
||||
byte_counter += len(data)
|
||||
if progress_log is not None:
|
||||
msg = "receiving data... %d / %d Bytes (%d%%)" % (bytes_done+byte_counter,
|
||||
bytes_total, old_div((bytes_done+byte_counter)*100,bytes_total))
|
||||
msg = "receiving data... %d / %d Bytes (%d%%)" % (bytes_done+byte_counter,
|
||||
bytes_total, (bytes_done+byte_counter)*100/bytes_total)
|
||||
progress_log.status(msg)
|
||||
|
||||
self.unregisterHciRecvQueue(recvQueue)
|
||||
@@ -989,7 +979,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
"""
|
||||
|
||||
log.debug("writeMem: writing to 0x%x" % address)
|
||||
|
||||
|
||||
if not self.check_running():
|
||||
return None
|
||||
|
||||
@@ -1008,8 +998,8 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
if(response == None):
|
||||
log.warn("writeMem: Timeout while reading response, probably need to wait longer.")
|
||||
return False
|
||||
elif (response[3] != 0):
|
||||
log.warn("writeMem: Got error code %s in command complete event." % bytes_to_hex(response[3]))
|
||||
elif (response[3] != '\x00'):
|
||||
log.warn("writeMem: Got error code %s in command complete event." % response[3].encode('hex'))
|
||||
return False
|
||||
write_addr += blocksize
|
||||
byte_counter += blocksize
|
||||
@@ -1032,16 +1022,15 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
log.warn("Empty HCI response during launchRam, driver crashed due to invalid code or destination")
|
||||
return False
|
||||
|
||||
error_code = response[3]
|
||||
if error_code != 0:
|
||||
log.warn("Got error code %x in command complete event." % error_code)
|
||||
if response[3] != '\x00':
|
||||
log.warn("Got error code %x in command complete event." % u8(response[3]))
|
||||
return False
|
||||
|
||||
|
||||
# Nexus 6P Bugfix
|
||||
if 'LAUNCH_RAM_PAUSE' in dir(self.fw) and self.fw.LAUNCH_RAM_PAUSE:
|
||||
log.debug("launchRam: Bugfix, sleeping %ds" % self.fw.LAUNCH_RAM_PAUSE)
|
||||
time.sleep(self.fw.LAUNCH_RAM_PAUSE)
|
||||
|
||||
|
||||
return True
|
||||
|
||||
def getPatchramState(self):
|
||||
@@ -1062,25 +1051,25 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
return False
|
||||
|
||||
slot_count = self.fw.PATCHRAM_NUMBER_OF_SLOTS
|
||||
|
||||
|
||||
# On Nexus 5, ReadMemAligned is required, while Nexus 6P supports this memory area with ReadRAM
|
||||
if self.fw.PATCHRAM_ALIGNED:
|
||||
slot_dump = self.readMemAligned(self.fw.PATCHRAM_ENABLED_BITMAP_ADDRESS, old_div(slot_count,4))
|
||||
slot_dump = self.readMemAligned(self.fw.PATCHRAM_ENABLED_BITMAP_ADDRESS, slot_count/4)
|
||||
table_addr_dump = self.readMemAligned(self.fw.PATCHRAM_TARGET_TABLE_ADDRESS, slot_count*4)
|
||||
else:
|
||||
slot_dump = self.readMem(self.fw.PATCHRAM_ENABLED_BITMAP_ADDRESS, old_div(slot_count,4))
|
||||
slot_dump = self.readMem(self.fw.PATCHRAM_ENABLED_BITMAP_ADDRESS, slot_count/4)
|
||||
table_addr_dump = self.readMem(self.fw.PATCHRAM_TARGET_TABLE_ADDRESS, slot_count*4)
|
||||
table_val_dump = self.readMem(self.fw.PATCHRAM_VALUE_TABLE_ADDRESS, slot_count*4)
|
||||
|
||||
|
||||
table_addresses = []
|
||||
table_values = []
|
||||
slot_dwords = []
|
||||
slot_bits = []
|
||||
for dword in range(old_div(slot_count,32)):
|
||||
for dword in range(slot_count/32):
|
||||
slot_dwords.append(slot_dump[dword*32:(dword+1)*32])
|
||||
|
||||
|
||||
for dword in slot_dwords:
|
||||
slot_bits.extend(bits(bytes(dword[::-1]))[::-1])
|
||||
slot_bits.extend(bits(dword[::-1])[::-1])
|
||||
for i in range(slot_count):
|
||||
if slot_bits[i]:
|
||||
table_addresses.append(u32(table_addr_dump[i*4:i*4+4])<<2)
|
||||
@@ -1116,7 +1105,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
if len(patch) != 4:
|
||||
log.warn("patchRom: patch (%s) must be a 32-bit dword!" % patch)
|
||||
return False
|
||||
|
||||
|
||||
log.debug("patchRom: applying patch 0x%x to address 0x%x" % (u32(patch), address))
|
||||
|
||||
alignment = address % 4
|
||||
@@ -1166,7 +1155,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
# Enable patchram slot (enable bitfield starts at 0x310204)
|
||||
# (We need to enable the slot by setting a bit in a multi-dword bitfield)
|
||||
target_dword = int(old_div(slot, 32))
|
||||
target_dword = int(slot / 32)
|
||||
table_slots[slot] = 1
|
||||
slot_dword = unbits(table_slots[target_dword*32:(target_dword+1)*32][::-1])[::-1]
|
||||
self.writeMem(self.fw.PATCHRAM_ENABLED_BITMAP_ADDRESS + target_dword*4, slot_dword)
|
||||
@@ -1205,7 +1194,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
# Disable patchram slot (enable bitfield starts at 0x310204)
|
||||
# (We need to disable the slot by clearing a bit in a multi-dword bitfield)
|
||||
target_dword = int(old_div(slot, 32))
|
||||
target_dword = int(slot / 32)
|
||||
table_slots[slot] = 0
|
||||
slot_dword = unbits(table_slots[target_dword*32:(target_dword+1)*32][::-1])[::-1]
|
||||
self.writeMem(self.fw.PATCHRAM_ENABLED_BITMAP_ADDRESS + target_dword*4, slot_dword)
|
||||
@@ -1216,7 +1205,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
return True
|
||||
|
||||
def readConnectionInformation(self, conn_number):
|
||||
# type: (ConnectionNumber) -> Optional[ConnectionInformation]
|
||||
# type: (ConnectionNumber) -> Optional[ConnectionDict]
|
||||
"""
|
||||
Reads and parses a connection struct based on the connection number.
|
||||
Note: The connection number is different from the connection index!
|
||||
@@ -1227,7 +1216,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
In the Nexus 5 firmware all connection numbers are simply the connection
|
||||
index increased by 1.
|
||||
|
||||
The return value is a ConnectionInformation object containing all information that could
|
||||
The return value is a dictionary containing all information that could
|
||||
be parsed from the connection structure. If the connection struct at the
|
||||
specified connection number is empty, the return value is None.
|
||||
"""
|
||||
@@ -1238,7 +1227,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
for const in ['CONNECTION_MAX', 'CONNECTION_ARRAY_ADDRESS', 'CONNECTION_STRUCT_LENGTH']:
|
||||
if const not in dir(self.fw):
|
||||
is_array = False
|
||||
|
||||
|
||||
# Do we have a list implementation?
|
||||
for const in ['CONNECTION_LIST_ADDRESS']:
|
||||
if const not in dir(self.fw):
|
||||
@@ -1262,9 +1251,23 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
if connection == b'\x00'*self.fw.CONNECTION_STRUCT_LENGTH:
|
||||
return None
|
||||
|
||||
|
||||
conn_dict = ConnectionInformation.from_connection_buffer(connection)
|
||||
|
||||
conn_dict = {}
|
||||
conn_dict["connection_number"] = u32(connection[:4])
|
||||
conn_dict["remote_address"] = connection[0x28:0x2E][::-1]
|
||||
conn_dict["remote_name_address"] = u32(connection[0x4C:0x50])
|
||||
conn_dict["master_of_connection"] = u32(connection[0x1C:0x20]) & 1<<15 == 0
|
||||
conn_dict["connection_handle"] = u16(connection[0x64:0x66])
|
||||
conn_dict["public_rand"] = connection[0x78:0x88]
|
||||
#conn_dict["pin"] = connection[0x8C:0x92]
|
||||
#conn_dict["bt_addr_for_key"] = connection[0x92:0x98][::-1]
|
||||
effective_key_len = u8(connection[0xa7:0xa8])
|
||||
conn_dict["effective_key_len"] = effective_key_len
|
||||
conn_dict["link_key"] = connection[0x68:0x68+effective_key_len]
|
||||
#new fields - TODO verify
|
||||
conn_dict["tx_pwr_lvl_dBm"] = u8(connection[0x9c:0x9d]) - 127
|
||||
conn_dict["extended_lmp_feat"] = connection[0x30:0x38] #standard p. 527
|
||||
conn_dict["host_supported_feat"] = connection[0x38:0x40]
|
||||
conn_dict["id"] = connection[0x0c:0x0d] #not sure if this is an id?
|
||||
return conn_dict
|
||||
|
||||
def sendLmpPacket(self, opcode, payload='', is_master=True, conn_handle=0x0c, extended_op=False):
|
||||
@@ -1289,47 +1292,47 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
Returns True on success and False on failure.
|
||||
"""
|
||||
|
||||
|
||||
# Check the connection handle
|
||||
# Range: 0x0000-0x0EFF (all other values reserved for future use)
|
||||
if conn_handle < 0 or conn_handle > 0x0EFF:
|
||||
log.warn("sendLmpPacket: connection handle out of bounds: %d" % conn_handle)
|
||||
return False
|
||||
|
||||
|
||||
# must be string...
|
||||
if payload == None:
|
||||
payload = ''
|
||||
|
||||
|
||||
if ((not extended_op) and opcode > (0xff>>1)) or (extended_op and opcode > 0xff):
|
||||
log.warn("sendLmpPacket: opcode out of range!")
|
||||
return False
|
||||
|
||||
|
||||
# Build the LMP packet
|
||||
opcode_data = p8(opcode<<1 | (not is_master)) if not extended_op else p8(0x7F<<1 | (not is_master)) + p8(opcode)
|
||||
|
||||
|
||||
# Nexus 5 (2012) simply takes any length as argument, but later withdraws bytes if too many were passed.
|
||||
# Nexus 6P, Raspi 3+ and evaulation board (2014-2018) require a fixed 20 byte length parameter to be passed!
|
||||
# -> 2 bytes connection handle, 1 byte length, which means 17 bytes for opcode and payload remaining
|
||||
# sendlmp --data 11223344556677889900112233445566 01 -> actually works
|
||||
# always pad to 17 data bytes...
|
||||
data = opcode_data + payload + '\x00'*(17 - len(opcode_data) - len(payload))
|
||||
|
||||
|
||||
if len(data) > 17:
|
||||
log.warn("sendLmpPacket: Vendor specific HCI command only allows for 17 bytes LMP content.")
|
||||
|
||||
|
||||
#log.info("packet: " + p16(conn_handle) + p8(len(data)) + data)
|
||||
result = self.sendHciCommand(0xfc58, p16(conn_handle) + p8(len(payload + opcode_data)) + data)
|
||||
|
||||
|
||||
if result == None:
|
||||
log.warn("sendLmpPacket: did not get a result from firmware, maybe crashed internally?")
|
||||
return False
|
||||
|
||||
|
||||
result = u8(result[3])
|
||||
|
||||
|
||||
if result != 0:
|
||||
log.warn("sendLmpPacket: got error status 0x%02x" % result)
|
||||
return False
|
||||
|
||||
|
||||
return True
|
||||
|
||||
def fuzzLmp(self):
|
||||
@@ -1399,7 +1402,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
# Prepare the assembler snippet by injecting the connection number
|
||||
# and appending the LMP packet data.
|
||||
asm_code = self.fw.SENDLMP_ASM_CODE % (conn_nr) # type: str
|
||||
asm_code_with_data = asm_code + ''.join([".byte 0x%02x\n" % ord(x)
|
||||
asm_code_with_data = asm_code + ''.join([".byte 0x%02x\n" % ord(x)
|
||||
for x in data.ljust(20, "\x00")])
|
||||
|
||||
# Assemble the snippet and write it to SENDLMP_CODE_BASE_ADDRESS
|
||||
@@ -1648,7 +1651,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
|
||||
|
||||
def readQueueInformation(self):
|
||||
# type: () -> Optional[List[QueueElement]]
|
||||
# type: () -> Optional[Union[bool, QueueInformation]]
|
||||
"""
|
||||
Traverses the double-linked list of QUEUE structs and returns them as a
|
||||
list of dictionaries. The dicts have the following fields:
|
||||
@@ -1674,7 +1677,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
for const in ['QUEUE_HEAD']:
|
||||
if const not in dir(self.fw):
|
||||
log.warn("readQueueInformation: '%s' not in fw.py. FEATURE NOT SUPPORTED!" % const)
|
||||
return None
|
||||
return False
|
||||
|
||||
# Read address of first queue struct:
|
||||
first_queue_struct_address = u32(self.readMem(self.fw.QUEUE_HEAD, 4))
|
||||
@@ -1688,13 +1691,22 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
if queue_fields[0] != u32("UEUQ"):
|
||||
log.warn("readQueueInformation: QUEUE double-linked list contains non-QUEU element. abort.")
|
||||
return None
|
||||
|
||||
current_element = QueueElement(index, current_queue_struct_address, queue_fields[2] * 4,
|
||||
queue_fields[3], queue_fields[4], queue_fields[5], queue_fields[6],
|
||||
queue_fields[7], queue_fields[8], queue_fields[9], queue_fields[10],
|
||||
queue_fields[11], queue_fields[12], queue_fields[13],
|
||||
self.fw.QUEUE_NAMES[index])
|
||||
|
||||
current_element = {}
|
||||
current_element["index"] = index
|
||||
current_element["address"] = current_queue_struct_address
|
||||
current_element["item_size"] = queue_fields[2] * 4 # Item size is measured in dwords (4 Byte)
|
||||
current_element["capacity"] = queue_fields[3]
|
||||
current_element["available_items"] = queue_fields[4]
|
||||
current_element["free_slots"] = queue_fields[5]
|
||||
current_element["queue_buf_start"] = queue_fields[6]
|
||||
current_element["queue_buf_end"] = queue_fields[7]
|
||||
current_element["next_item"] = queue_fields[8]
|
||||
current_element["next_free_slot"] = queue_fields[9]
|
||||
current_element["thread_waitlist"] = queue_fields[10]
|
||||
current_element["waitlist_length"] = queue_fields[11]
|
||||
current_element["next"] = queue_fields[12]
|
||||
current_element["prev"] = queue_fields[13]
|
||||
current_element["name"] = self.fw.QUEUE_NAMES[index]
|
||||
queuelist.append(current_element)
|
||||
|
||||
current_queue_struct_address = current_element["next"]
|
||||
@@ -1724,7 +1736,7 @@ class InternalBlue(with_metaclass(ABCMeta, object)):
|
||||
"""
|
||||
|
||||
if not self.serial:
|
||||
self.sendH4(hci.HCI.BCM_DIAG, b'\xf0' + b'\x01' if enable else b'\x00')
|
||||
self.sendH4(hci.HCI.BCM_DIAG, '\xf0' + p8(enable))
|
||||
|
||||
# We can send the activation to the serial, but then the Android driver
|
||||
# itself crashes when receiving diagnostic frames...
|
||||
|
||||
@@ -23,12 +23,10 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from builtins import hex
|
||||
from builtins import object
|
||||
from pwn import log
|
||||
|
||||
|
||||
class Firmware(object):
|
||||
class Firmware:
|
||||
def __init__(self, version=None, iOS=False):
|
||||
"""
|
||||
Load and initialize the actual firmware add-ons for Nexus 5, Raspi3, etc.
|
||||
@@ -62,7 +60,7 @@ class Firmware(object):
|
||||
log.info("Loaded firmware information for " + self.firmware.FW_NAME + ".")
|
||||
|
||||
|
||||
class MemorySection(object):
|
||||
class MemorySection:
|
||||
"""
|
||||
All firmwares have memory sections that can be RAM, ROM or neither of both.
|
||||
"""
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
from __future__ import absolute_import
|
||||
# fw_0x420e.py
|
||||
#
|
||||
# Generic firmware file in case we do not know something...
|
||||
@@ -21,7 +20,7 @@ from __future__ import absolute_import
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from .fw import MemorySection
|
||||
from fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
# Samsung S10/S10e/S10+
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
# Firmware Infos
|
||||
# This runs on Rasperry Pi 3
|
||||
from builtins import object
|
||||
FW_NAME = "BCM43430A1"
|
||||
|
||||
# Device Infos
|
||||
@@ -35,7 +34,7 @@ DEVICE_NAME = 0x20401C
|
||||
BD_ADDR = 0x201C64
|
||||
|
||||
# Memory Sections
|
||||
class MemorySection(object):
|
||||
class MemorySection:
|
||||
def __init__(self, start_addr, end_addr, is_rom, is_ram):
|
||||
self.start_addr = start_addr
|
||||
self.end_addr = end_addr
|
||||
@@ -51,7 +50,7 @@ SECTIONS = [ MemorySection(0x0, 0x90000, True , False),
|
||||
MemorySection(0xd0000, 0xd8000, False, True ),
|
||||
#MemorySection(0xe0000, 0x1f0000, True , False),
|
||||
MemorySection(0x200000, 0x21ffff, False, True ),
|
||||
#MemorySection(0x260000, 0x268000, True , False), # might crash? issue 14
|
||||
MemorySection(0x260000, 0x268000, True , False),
|
||||
#MemorySection(0x280000, 0x2a0000, True , False),
|
||||
MemorySection(0x318000, 0x320000, False, False),
|
||||
MemorySection(0x324000, 0x360000, False, False),
|
||||
@@ -75,10 +74,6 @@ PATCHRAM_VALUE_TABLE_ADDRESS = 0xd0000
|
||||
PATCHRAM_NUMBER_OF_SLOTS = 128
|
||||
PATCHRAM_ALIGNED = False
|
||||
|
||||
# Heap
|
||||
BLOC_HEAD = 0x200588 # g_dynamic_memory_GeneralUsePools
|
||||
BLOC_NG = True # Next Generation Bloc Buffer
|
||||
|
||||
# Snippet for sendLcpPacket()
|
||||
SENDLCP_CODE_BASE_ADDRESS = 0x21a000
|
||||
SENDLCP_ASM_CODE = """
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
from __future__ import absolute_import
|
||||
# fw_0x420e.py
|
||||
#
|
||||
# Generic firmware file in case we do not know something...
|
||||
@@ -21,7 +20,7 @@ from __future__ import absolute_import
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from .fw import MemorySection
|
||||
from fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
# Evaluation Kit CYW20706
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
from __future__ import absolute_import
|
||||
# fw_0x420e.py
|
||||
#
|
||||
# Generic firmware file in case we do not know something...
|
||||
@@ -21,7 +20,7 @@ from __future__ import absolute_import
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from .fw import MemorySection
|
||||
from fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
# Evaluation Kit CYW920819
|
||||
|
||||
@@ -23,8 +23,7 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from __future__ import absolute_import
|
||||
from .fw import MemorySection
|
||||
from fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
FW_NAME = "BCM20702A1 (USB Bluetooth dongle)"
|
||||
|
||||
@@ -22,8 +22,7 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from __future__ import absolute_import
|
||||
from .fw import MemorySection
|
||||
from fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
FW_NAME = "BCM20703A2 (MacBook Pro 2016)"
|
||||
|
||||
@@ -25,8 +25,7 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from __future__ import absolute_import
|
||||
from .fw import MemorySection
|
||||
from fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
# This runs on Nexus 6P, Samsung Galaxy S6, Samsung Galaxy S6 edge
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
from .fw import MemorySection
|
||||
|
||||
# Firmware Infos
|
||||
# Evaluation Kit CYW920719
|
||||
FW_NAME = "CYW20739B1 (NOT iPhone X/XR!)"
|
||||
# Evaluation Kit CYW927019
|
||||
FW_NAME = "CYW27039B1 (NOT iPhone X/XR!)"
|
||||
# TODO this is not the iPhone firmware, we need to add a switch in fw.py
|
||||
|
||||
# Device Infos
|
||||
|
||||
@@ -27,14 +27,13 @@
|
||||
|
||||
# Firmware Infos
|
||||
# This runs on Rasperry Pi 3+
|
||||
from builtins import object
|
||||
FW_NAME = "BCM4345C0"
|
||||
|
||||
# Device Infos
|
||||
DEVICE_NAME = 0x204954
|
||||
|
||||
# Memory Sections
|
||||
class MemorySection(object):
|
||||
class MemorySection:
|
||||
def __init__(self, start_addr, end_addr, is_rom, is_ram):
|
||||
self.start_addr = start_addr
|
||||
self.end_addr = end_addr
|
||||
@@ -74,10 +73,6 @@ PATCHRAM_VALUE_TABLE_ADDRESS = 0xd0000
|
||||
PATCHRAM_NUMBER_OF_SLOTS = 128
|
||||
PATCHRAM_ALIGNED = False
|
||||
|
||||
# Heap
|
||||
BLOC_HEAD = 0x200490 # g_dynamic_memory_GeneralUsePools
|
||||
BLOC_NG = True # Next Generation Bloc Buffer
|
||||
|
||||
# Snippet for sendLcpPacket()
|
||||
SENDLCP_CODE_BASE_ADDRESS = 0x21f000
|
||||
SENDLCP_ASM_CODE = """
|
||||
|
||||
+8
-23
@@ -25,10 +25,6 @@
|
||||
# out of or in connection with the Software or the use or other dealings in the
|
||||
# Software.
|
||||
|
||||
from __future__ import absolute_import
|
||||
from builtins import hex
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
from pwn import *
|
||||
|
||||
HCI_UART_TYPE_CLASS = {}
|
||||
@@ -56,7 +52,7 @@ class HCI(object):
|
||||
|
||||
@staticmethod
|
||||
def from_data(data):
|
||||
uart_type = data[0]
|
||||
uart_type = ord(data[0])
|
||||
return HCI_UART_TYPE_CLASS[uart_type].from_data(data[1:])
|
||||
|
||||
def __init__(self, uart_type):
|
||||
@@ -577,7 +573,7 @@ class HCI_Cmd(HCI):
|
||||
0xffed : "COMND VSC_EnterDownloadMode"
|
||||
}
|
||||
|
||||
HCI_CMD_STR_REVERSE = {v: k for k, v in HCI_CMD_STR.items()}
|
||||
HCI_CMD_STR_REVERSE = {v: k for k, v in HCI_CMD_STR.iteritems()}
|
||||
|
||||
@staticmethod
|
||||
def cmd_name(opcode):
|
||||
@@ -611,7 +607,7 @@ class HCI_Cmd(HCI):
|
||||
|
||||
@staticmethod
|
||||
def from_data(data):
|
||||
return HCI_Cmd(u16(data[0:2]), data[2], data[3:])
|
||||
return HCI_Cmd(u16(data[0:2]), ord(data[2]), data[3:])
|
||||
|
||||
def __init__(self, opcode, length, data):
|
||||
HCI.__init__(self, HCI.HCI_CMD)
|
||||
@@ -627,7 +623,7 @@ class HCI_Cmd(HCI):
|
||||
cmdname = "unknown"
|
||||
if self.opcode in self.HCI_CMD_STR:
|
||||
cmdname = self.HCI_CMD_STR[self.opcode]
|
||||
return parent + "<0x%04x %s (len=%d): %s>" % (self.opcode, cmdname, self.length, ''.join(format(x, '02x') for x in self.data[0:16]))
|
||||
return parent + "<0x%04x %s (len=%d): %s>" % (self.opcode, cmdname, self.length, self.data[0:16].encode('hex'))
|
||||
|
||||
class HCI_Acl(HCI):
|
||||
|
||||
@@ -702,7 +698,7 @@ class HCI_Diag(HCI):
|
||||
cmdname = "unknown"
|
||||
if self.opcode in self.BCM_DIAG_STR:
|
||||
cmdname = self.BCM_DIAG_STR[self.opcode]
|
||||
return parent + "<0x%02x %s: %s>" % (self.opcode, cmdname, ''.join(format(x, '02x') for x in self.data[0:16]))
|
||||
return parent + "<0x%02x %s: %s>" % (self.opcode, cmdname, self.data[0:16].encode('hex'))
|
||||
|
||||
class HCI_Event(HCI):
|
||||
|
||||
@@ -891,7 +887,7 @@ class HCI_Event(HCI):
|
||||
|
||||
@staticmethod
|
||||
def from_data(data):
|
||||
return HCI_Event(data[0], data[1], data[2:])
|
||||
return HCI_Event(ord(data[0]), ord(data[1]), data[2:])
|
||||
|
||||
def __init__(self, event_code, length, data):
|
||||
HCI.__init__(self, HCI.HCI_EVT)
|
||||
@@ -907,7 +903,7 @@ class HCI_Event(HCI):
|
||||
eventname = "unknown"
|
||||
if self.event_code in self.HCI_EVENT_STR:
|
||||
eventname = self.HCI_EVENT_STR[self.event_code]
|
||||
return parent + "<0x%02x %s (len=%d): %s>" % (self.event_code, eventname, self.length, ''.join(format(x, '02x') for x in self.data[0:]))
|
||||
return parent + "<0x%02x %s (len=%d): %s>" % (self.event_code, eventname, self.length, self.data[0:].encode('hex'))
|
||||
|
||||
HCI_UART_TYPE_CLASS = {
|
||||
HCI.HCI_CMD : HCI_Cmd,
|
||||
@@ -921,7 +917,7 @@ def parse_hci_packet(data):
|
||||
return HCI.from_data(data)
|
||||
|
||||
|
||||
class StackDumpReceiver(object):
|
||||
class StackDumpReceiver:
|
||||
memdump_addr = None
|
||||
memdumps = {}
|
||||
stack_dump_has_happend = False
|
||||
@@ -962,7 +958,6 @@ class StackDumpReceiver(object):
|
||||
if self.memdump_addr == None:
|
||||
self.memdump_addr = addr
|
||||
self.memdumps[addr-self.memdump_addr] = data[4:]
|
||||
log.debug("Stack dump handling addr %08x", addr-self.memdump_addr)
|
||||
|
||||
def finishStackDump(self):
|
||||
dump = fit(self.memdumps)
|
||||
@@ -1097,16 +1092,6 @@ class StackDumpReceiver(object):
|
||||
self.finishStackDump()
|
||||
return True
|
||||
|
||||
# On a Raspberry Pi 3, the last packet of a stack dump is '1b0340df0338'.... so it's 0x40
|
||||
elif packet_type == 0xe8:
|
||||
# FIXME Raspi memdump is divided in two parts!
|
||||
# address change from 0001fe38 to packet type e8 and then it's computing addr -0130000
|
||||
# negative addr does not work with finishStackDump()
|
||||
# so even though the last packet is 0x40, let's just finish on 0xe8
|
||||
log.info("End of first stackdump block, writing to file and skipping second...")
|
||||
self.finishStackDump()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
+10
-17
@@ -1,18 +1,12 @@
|
||||
#!/usr/bin/env python2
|
||||
|
||||
from __future__ import absolute_import
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from builtins import str
|
||||
from builtins import zip
|
||||
from builtins import range
|
||||
import subprocess
|
||||
import datetime
|
||||
from pwn import *
|
||||
import fcntl
|
||||
from .core import InternalBlue
|
||||
from . import hci
|
||||
import queue as queue2k
|
||||
import hci
|
||||
import Queue
|
||||
import threading
|
||||
|
||||
try:
|
||||
@@ -71,7 +65,7 @@ class HCICore(InternalBlue):
|
||||
# Do ioctl(s,HCIGETDEVLIST,arg) to get the number of available devices:
|
||||
# arg is struct hci_dev_list_req (/usr/include/bluetooth/hci.h)
|
||||
arg = p32(16) # dl->dev_num = HCI_MAX_DEV which is 16 (little endian)
|
||||
arg += b"\x00"*(8*16)
|
||||
arg += "\x00"*(8*16)
|
||||
devices_raw = fcntl.ioctl(s.fileno(), HCIGETDEVLIST, arg)
|
||||
num_devices = u16(devices_raw[:2])
|
||||
log.debug("Found %d HCI devices via ioctl(HCIGETDEVLIST)!" % num_devices)
|
||||
@@ -82,10 +76,10 @@ class HCICore(InternalBlue):
|
||||
dev_id = u16(devices_raw[dev_struct_start:dev_struct_start+2])
|
||||
# arg is struct hci_dev_info (/usr/include/bluetooth/hci.h)
|
||||
arg = p16(dev_id) # di->dev_id = <device_id>
|
||||
arg += b"\x00"*20 # Enough space for name, bdaddr and flags
|
||||
dev_info_raw = bytearray(fcntl.ioctl(s.fileno(), HCIGETDEVINFO, arg))
|
||||
dev_name = dev_info_raw[2:10].replace(b"\x00",b"").decode()
|
||||
dev_bdaddr = ":".join(["%02X" % x for x in dev_info_raw[10:16][::-1]])
|
||||
arg += "\x00"*20 # Enough space for name, bdaddr and flags
|
||||
dev_info_raw = fcntl.ioctl(s.fileno(), HCIGETDEVINFO, arg)
|
||||
dev_name = dev_info_raw[2:10].replace("\x00","")
|
||||
dev_bdaddr = ":".join(["%02X" % ord(x) for x in dev_info_raw[10:16][::-1]])
|
||||
dev_flags = u32(dev_info_raw[16:20])
|
||||
if dev_flags == 0:
|
||||
dev_flags_str = "DOWN"
|
||||
@@ -198,7 +192,6 @@ class HCICore(InternalBlue):
|
||||
# Read the record data
|
||||
try:
|
||||
record_data = self.s_snoop.recv(1024)
|
||||
record_data = bytearray(record_data)
|
||||
except socket.timeout:
|
||||
continue # this is ok. just try again without error
|
||||
except Exception as e:
|
||||
@@ -234,7 +227,7 @@ class HCICore(InternalBlue):
|
||||
if filter_function == None or filter_function(record):
|
||||
try:
|
||||
queue.put(record, block=False)
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("recvThreadFunc: A recv queue is full. dropping packets..")
|
||||
|
||||
# Call all callback functions inside registeredHciCallbacks and pass the
|
||||
@@ -285,7 +278,7 @@ class HCICore(InternalBlue):
|
||||
"""
|
||||
# TODO still seems to only forward incoming events?!
|
||||
self.s_snoop.setsockopt(socket.SOL_HCI, socket.HCI_FILTER,
|
||||
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00') #type mask, event mask, event mask, opcode
|
||||
'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00') #type mask, event mask, event mask, opcode
|
||||
|
||||
interface_num = device["dev_id"]
|
||||
log.debug("Socket interface number: %s" % (interface_num))
|
||||
@@ -299,7 +292,7 @@ class HCICore(InternalBlue):
|
||||
# Write Header to btsnoop file (if file is still empty):
|
||||
if self.write_btsnooplog and self.btsnooplog_file.tell() == 0:
|
||||
# BT Snoop Header: btsnoop\x00, version: 1, data link type: 1002
|
||||
btsnoop_hdr = b"btsnoop\x00" + p32(1,endian="big") + p32(1002,endian="big")
|
||||
btsnoop_hdr = "btsnoop\x00" + p32(1,endian="big") + p32(1002,endian="big")
|
||||
with self.btsnooplog_file_lock:
|
||||
self.btsnooplog_file.write(btsnoop_hdr)
|
||||
self.btsnooplog_file.flush()
|
||||
|
||||
+7
-11
@@ -1,16 +1,12 @@
|
||||
#!/usr/bin/env python2
|
||||
|
||||
from __future__ import absolute_import
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from builtins import str
|
||||
import socket
|
||||
import queue as queue2k
|
||||
from . import hci
|
||||
import Queue
|
||||
import hci
|
||||
|
||||
from pwn import *
|
||||
|
||||
from .core import InternalBlue
|
||||
from core import InternalBlue
|
||||
|
||||
class iOSCore(InternalBlue):
|
||||
|
||||
@@ -53,16 +49,16 @@ class iOSCore(InternalBlue):
|
||||
the command or None if no response was received within the timeout.
|
||||
"""
|
||||
|
||||
queue = queue2k.Queue(1)
|
||||
queue = Queue.Queue(1)
|
||||
|
||||
try:
|
||||
self.sendQueue.put((h4type, data, queue, None), timeout=timeout)
|
||||
ret = queue.get(timeout=timeout)
|
||||
return ret
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
log.warn("sendH4: waiting for response timed out!")
|
||||
return None
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("sendH4: send queue is full!")
|
||||
return None
|
||||
|
||||
@@ -177,7 +173,7 @@ class iOSCore(InternalBlue):
|
||||
for queue, filter_function in self.registeredHciRecvQueues: # TODO filter_function not working with bluez modifications
|
||||
try:
|
||||
queue.put(record, block=False)
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("recvThreadFunc: A recv queue is full. dropping packets..")
|
||||
|
||||
# Call all callback functions inside registeredHciCallbacks and pass the
|
||||
|
||||
+11
-17
@@ -1,16 +1,12 @@
|
||||
#!/usr/bin/env python2
|
||||
|
||||
from __future__ import absolute_import
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from builtins import str
|
||||
import socket
|
||||
import queue as queue2k
|
||||
from . import hci
|
||||
import Queue
|
||||
import hci
|
||||
|
||||
from pwn import *
|
||||
|
||||
from .core import InternalBlue
|
||||
from core import InternalBlue
|
||||
|
||||
import binascii
|
||||
import os
|
||||
@@ -93,7 +89,7 @@ class macOSCore(InternalBlue):
|
||||
# read record data
|
||||
try:
|
||||
data, addr = self.s_snoop.recvfrom(1024)
|
||||
record_data = bytearray(data)
|
||||
record_data = data
|
||||
except socket.timeout:
|
||||
continue # this is ok. just try again without error
|
||||
|
||||
@@ -107,7 +103,7 @@ class macOSCore(InternalBlue):
|
||||
for queue, filter_function in self.registeredHciRecvQueues: # TODO filter_function not working with bluez modifications
|
||||
try:
|
||||
queue.put(record, block=False)
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("recvThreadFunc: A recv queue is full. dropping packets..>" + record_data)
|
||||
|
||||
# Call all callback functions inside registeredHciCallbacks and pass the
|
||||
@@ -126,7 +122,7 @@ class macOSCore(InternalBlue):
|
||||
# Wait for 'send task' in send queue
|
||||
try:
|
||||
task = self.sendQueue.get(timeout=0.5)
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
continue
|
||||
|
||||
# Extract the components of the task
|
||||
@@ -137,10 +133,8 @@ class macOSCore(InternalBlue):
|
||||
|
||||
# Send command to the chip using IOBluetoothExtended framework
|
||||
h4type, data, queue, filter_function = task
|
||||
data = bytearray(data)
|
||||
opcode = format(data[1], '02x') + format(data[0], '02x')
|
||||
|
||||
log.debug("Sending command: 0x" + ''.join(format(x, '02x') for x in data) + ", opcode: " + opcode)
|
||||
opcode = binascii.hexlify(data[1]) + binascii.hexlify(data[0])
|
||||
log.debug("Sending command: 0x" + binascii.hexlify(data) + ", opcode: " + opcode)
|
||||
|
||||
if not(h4type == 0x01 or h4type == 0x02):
|
||||
log.warn("H4 Type {0} not supported by macOS Core!".format(str(h4type)))
|
||||
@@ -150,7 +144,7 @@ class macOSCore(InternalBlue):
|
||||
|
||||
# if the caller expects a response: register a queue to receive the response
|
||||
if queue is not None and filter_function is not None:
|
||||
recvQueue = queue2k.Queue(1)
|
||||
recvQueue = Queue.Queue(1)
|
||||
self.registerHciRecvQueue(recvQueue, filter_function)
|
||||
|
||||
# Sending command
|
||||
@@ -163,7 +157,7 @@ class macOSCore(InternalBlue):
|
||||
record = recvQueue.get(timeout=10)
|
||||
hcipkt = record[0]
|
||||
data = hcipkt.data
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
log.warn("_sendThreadFunc: No response from the firmware.")
|
||||
data = None
|
||||
self.unregisterHciRecvQueue(recvQueue)
|
||||
@@ -188,5 +182,5 @@ class macOSCore(InternalBlue):
|
||||
def shutdown(self):
|
||||
if not self.replay:
|
||||
self.iobe.shutdown()
|
||||
self.s_inject.sendto(b'', ('127.0.0.1', self.s_snoop.getsockname()[1]))
|
||||
self.s_inject.sendto("", ('127.0.0.1', self.s_snoop.getsockname()[1]))
|
||||
super(macOSCore, self).shutdown()
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
from builtins import object
|
||||
from pwnlib.util.packing import u32, u16, u8
|
||||
|
||||
|
||||
class ConnectionInformation(object):
|
||||
connection_handle = 0
|
||||
connection_number = 0
|
||||
master_of_connection = False
|
||||
remote_name_address = 0
|
||||
remote_address = None
|
||||
id = None
|
||||
public_rand = None
|
||||
extended_lmp_feat = None
|
||||
link_key = None
|
||||
tx_pwr_lvl_dBm = 0
|
||||
effective_key_len = 0
|
||||
host_supported_feat = None
|
||||
|
||||
def __init__(self, connection_number, remote_address, remote_name_address, master_of_connection, connection_handle,
|
||||
public_rand, effective_key_len, link_key, tx_pwr_lvl_dBm, extended_lmp_feat, host_supported_feat, id):
|
||||
self.connection_number = connection_number
|
||||
self.remote_address = remote_address
|
||||
self.remote_name_address = remote_name_address
|
||||
self.master_of_connection = master_of_connection
|
||||
self.connection_handle = connection_handle
|
||||
self.public_rand = public_rand
|
||||
self.effective_key_len = effective_key_len
|
||||
self.link_key = link_key
|
||||
self.tx_pwr_lvl_dBm = tx_pwr_lvl_dBm
|
||||
self.extended_lmp_feat = extended_lmp_feat
|
||||
self.host_supported_feat = host_supported_feat
|
||||
self.id = id
|
||||
|
||||
@staticmethod
|
||||
def from_connection_buffer(connection):
|
||||
|
||||
# Possible TODO: Convert this to a Katai Struct parser with a proper .ksy grammar.
|
||||
return ConnectionInformation(u32(connection[:4]), connection[0x28:0x2E][::-1],
|
||||
u32(connection[0x4C:0x50]),
|
||||
u32(connection[0x1C:0x20]) & 1 << 15 == 0,
|
||||
u16(connection[0x64:0x66]),
|
||||
connection[0x78:0x88],
|
||||
u8(connection[0xa7:0xa8]),
|
||||
connection[0x68:0x68 + u8(connection[0xa7:0xa8])],
|
||||
u8(connection[0x9c:0x9d]) - 127,
|
||||
connection[0x30:0x38], connection[0x38:0x40],
|
||||
connection[0x0c:0x0d])
|
||||
# For some reason the following doesn't work because some attributes like link_key end up as one element tuples
|
||||
# connection_number = u32(connection[:4])
|
||||
# remote_address = connection[0x28:0x2E][::-1],
|
||||
# remote_name_address = u32(connection[0x4C:0x50])
|
||||
# master_of_connection = u32(connection[0x1C:0x20]) & 1 << 15 == 0
|
||||
# connection_handle = u16(connection[0x64:0x66])
|
||||
# public_rand = connection[0x78:0x88]
|
||||
# effective_key_len = u8(connection[0xa7:0xa8])
|
||||
# link_key = connection[0x68:0x68 + effective_key_len],
|
||||
# tx_pwr_lvl_dBm = u8(connection[0x9c:0x9d]) - 127,
|
||||
# extended_lmp_feat = connection[0x30:0x38]
|
||||
# host_supported_feat = connection[0x38:0x40]
|
||||
# id = connection[0x0c:0x0d]
|
||||
# return ConnectionInformation(connection_number, remote_address, remote_name_address, master_of_connection,
|
||||
# connection_handle,
|
||||
# public_rand, effective_key_len, link_key, tx_pwr_lvl_dBm, extended_lmp_feat,
|
||||
# host_supported_feat, id)
|
||||
|
||||
def __getitem__(self, item):
|
||||
# type: (str) -> Any
|
||||
return vars(self)[item]
|
||||
@@ -1,39 +0,0 @@
|
||||
from builtins import object
|
||||
class QueueElement(object):
|
||||
index = 0
|
||||
next_item = 0
|
||||
prev = 0
|
||||
capacity = 0
|
||||
name = ''
|
||||
queue_buf_start = 0
|
||||
available_items = 0
|
||||
item_size = 0
|
||||
next_free_slot = 0
|
||||
free_slots = 0
|
||||
address = 0
|
||||
waitlist_length = 0
|
||||
next = 0
|
||||
queue_buf_end = 0
|
||||
thread_waitlist = 0
|
||||
|
||||
def __init__(self, index, address, item_size, capacity, available_items, free_slots, queue_buf_start, queue_buf_end,
|
||||
next_item, next_free_slot, thread_waitlist, waitlist_length, next, prev, name):
|
||||
self.index = index
|
||||
self.next_item = next_item
|
||||
self.prev = prev
|
||||
self.capacity = capacity
|
||||
self.name = name
|
||||
self.queue_buf_start = queue_buf_start
|
||||
self.available_items = available_items
|
||||
self.item_size = item_size
|
||||
self.next_free_slot = next_free_slot
|
||||
self.free_slots = free_slots
|
||||
self.address = address
|
||||
self.waitlist_length = waitlist_length
|
||||
self.next = next
|
||||
self.queue_buf_end = queue_buf_end
|
||||
self.thread_waitlist = thread_waitlist
|
||||
|
||||
def __getitem__(self, item):
|
||||
# type: (str) -> Any
|
||||
return vars(self)[item]
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import print_function
|
||||
from builtins import object
|
||||
import binascii
|
||||
import time
|
||||
|
||||
@@ -10,7 +8,7 @@ except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
class SocketRecvHook(object):
|
||||
class SocketRecvHook():
|
||||
def __init__(self, socket):
|
||||
# type: (socket.socket) -> None
|
||||
self.snoop_socket = socket
|
||||
@@ -45,7 +43,7 @@ class SocketRecvHook(object):
|
||||
self.recvfrom_hook(data, addr)
|
||||
return data, addr
|
||||
|
||||
class SocketInjectHook(object):
|
||||
class SocketInjectHook():
|
||||
def __init__(self, socket, core):
|
||||
# type: (socket.socket, InternalBlue) -> None
|
||||
self.inject_socket = socket
|
||||
@@ -116,7 +114,7 @@ class SocketDuplexHook(SocketInjectHook, SocketRecvHook):
|
||||
pass
|
||||
|
||||
|
||||
class HookBase(object):
|
||||
class HookBase():
|
||||
def send_hook(self, data):
|
||||
raise NotImplementedError
|
||||
|
||||
@@ -188,36 +186,15 @@ class PrintTrace(SocketDuplexHook):
|
||||
print("Exception: {}".format(e))
|
||||
|
||||
|
||||
class ReplaySocket(SocketDuplexHook):
|
||||
def __init__(self, snoop_socket, inject_socket, core, filename='/tmp/bt_hci.log', debug=False):
|
||||
class ReplaySocket(PrintTrace):
|
||||
def __init__(self, snoop_socket, inject_socket, core, filename='/tmp/bt_hci.log'):
|
||||
SocketDuplexHook.__init__(self, snoop_socket, inject_socket, core)
|
||||
self.replace = True
|
||||
self.log = open(filename).readlines()
|
||||
self.index = 0
|
||||
self.debug = debug
|
||||
if self.log[0].startswith("#"):
|
||||
self.index = 1
|
||||
|
||||
def send_hook(self, data, **kwargs):
|
||||
if self.debug:
|
||||
print("Sent: {}".format(binascii.hexlify(data)))
|
||||
|
||||
def recv_hook(self, data, **kwargs):
|
||||
if self.debug:
|
||||
print("Recv: {}".format(binascii.hexlify(data)))
|
||||
|
||||
def recvfrom_hook(self, data, addr, **kwargs):
|
||||
if self.debug:
|
||||
print("Recv: {}".format(binascii.hexlify(data)))
|
||||
|
||||
def sendto_hook(self, data, socket, **kwargs):
|
||||
if self.debug:
|
||||
print("Sent: {}".format(binascii.hexlify(data)))
|
||||
|
||||
def send_exception(self, e):
|
||||
if self.debug:
|
||||
print("Exception: {}".format(e))
|
||||
|
||||
def send_replace(self, data, **kwargs):
|
||||
encoded_data = "" # type: str
|
||||
hex_data = binascii.hexlify(data)
|
||||
@@ -256,8 +233,6 @@ class ReplaySocket(SocketDuplexHook):
|
||||
def getsockname(self):
|
||||
return (None, 0)
|
||||
|
||||
def close(self):
|
||||
assert self.index + 1 == len(self.log)
|
||||
|
||||
from internalblue.core import InternalBlue
|
||||
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
#!/usr/bin/env python2
|
||||
|
||||
from __future__ import print_function
|
||||
from __future__ import absolute_import
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import socket
|
||||
import queue as queue2k
|
||||
from . import hci
|
||||
import Queue
|
||||
import hci
|
||||
|
||||
from pwn import *
|
||||
|
||||
from .core import InternalBlue
|
||||
from core import InternalBlue
|
||||
import binascii
|
||||
|
||||
filepath = os.path.dirname(os.path.abspath(__file__))
|
||||
@@ -59,16 +55,16 @@ class testCore(InternalBlue):
|
||||
the command or None if no response was received within the timeout.
|
||||
"""
|
||||
|
||||
queue = queue2k.Queue(1)
|
||||
queue = Queue.Queue(1)
|
||||
|
||||
try:
|
||||
self.sendQueue.put((h4type, data, queue, None), timeout=timeout)
|
||||
ret = queue.get(timeout=timeout)
|
||||
return ret
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
log.warn("sendH4: waiting for response timed out!")
|
||||
return None
|
||||
except queue.Full:
|
||||
except Queue.Full:
|
||||
log.warn("sendH4: send queue is full!")
|
||||
return None
|
||||
|
||||
@@ -109,7 +105,7 @@ class testCore(InternalBlue):
|
||||
# Wait for 'send task' in send queue
|
||||
try:
|
||||
task = self.sendQueue.get(timeout=0.5)
|
||||
except queue2k.Empty:
|
||||
except Queue.Empty:
|
||||
continue
|
||||
|
||||
# Extract the components of the task
|
||||
@@ -125,7 +121,7 @@ class testCore(InternalBlue):
|
||||
|
||||
# if the caller expects a response: register a queue to receive the response
|
||||
if queue is not None and filter_function is not None:
|
||||
recvQueue = queue2k.Queue(1)
|
||||
recvQueue = Queue.Queue(1)
|
||||
self.registerHciRecvQueue(recvQueue, filter_function)
|
||||
|
||||
# if the caller expects a response:
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
def bytes_to_hex(bytes):
|
||||
# type: (bytearray) -> str
|
||||
return ''.join(format(x, '02x') for x in bytearray(bytes))
|
||||
@@ -0,0 +1,2 @@
|
||||
pwntools==3.12.2
|
||||
pyelftools==0.24
|
||||
@@ -11,8 +11,7 @@ setup(name='internalblue',
|
||||
license='MIT',
|
||||
packages=['internalblue', 'internalblue/fw'],
|
||||
install_requires=[
|
||||
'pwntools>=4.2.0.dev0',
|
||||
'pyelftools',
|
||||
'pwntools',
|
||||
],
|
||||
extras_require={
|
||||
"macoscore": ["pyobjc"],
|
||||
|
||||
@@ -1,282 +0,0 @@
|
||||
from __future__ import print_function
|
||||
from internalblue.cli import _parse_argv
|
||||
from internalblue.hcicore import HCICore
|
||||
|
||||
import os
|
||||
import nose
|
||||
|
||||
try:
|
||||
from typing import List, Optional, Any, TYPE_CHECKING, Tuple
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def test_info_heap_new():
|
||||
dummy = [
|
||||
{
|
||||
"index": 0,
|
||||
"capacity": 32,
|
||||
"address": 2100380,
|
||||
"next": 2100412,
|
||||
"memory_size": 1152,
|
||||
"buffer_list": 2190960,
|
||||
"memory": 2190864,
|
||||
"buffer_size": 32,
|
||||
"buffer_headers": {
|
||||
2191872: 2134443254,
|
||||
2191620: 2037880954,
|
||||
2191368: 375085499,
|
||||
2191116: 3147300663,
|
||||
2190864: 0,
|
||||
2191764: 264196083,
|
||||
2191512: 2509895076,
|
||||
2191260: 2520551584,
|
||||
2191008: 0,
|
||||
2191908: 1846542368,
|
||||
2191656: 1757769142,
|
||||
2191404: 3932721686,
|
||||
2191152: 2191184,
|
||||
2190900: 28735,
|
||||
2191800: 2840650003,
|
||||
2191548: 1443923039,
|
||||
2191296: 1489683938,
|
||||
2191044: 4066066958,
|
||||
2191944: 1913651233,
|
||||
2191692: 152195353,
|
||||
2191440: 2191472,
|
||||
2191188: 1557416373,
|
||||
2190936: 302056974,
|
||||
2191836: 649087106,
|
||||
2191584: 3228135896,
|
||||
2191332: 3061215438,
|
||||
2191080: 720823376,
|
||||
2191980: 2196903397,
|
||||
2191728: 2191760,
|
||||
2191476: 2016717863,
|
||||
2191224: 733933656,
|
||||
2190972: 101581052
|
||||
},
|
||||
"list_length": 28
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"capacity": 50,
|
||||
"address": 2100412,
|
||||
"next": 2100444,
|
||||
"memory_size": 5000,
|
||||
"buffer_list": 2191888,
|
||||
"memory": 2191888,
|
||||
"buffer_size": 96,
|
||||
"buffer_headers": {
|
||||
2194688: 2418054699,
|
||||
2196288: 1950181917,
|
||||
2192388: 998902997,
|
||||
2193288: 1237870693,
|
||||
2196588: 3682344019,
|
||||
2194188: 3476501705,
|
||||
2191888: 2191984,
|
||||
2195288: 1169168150,
|
||||
2192788: 733035576,
|
||||
2193688: 212170382,
|
||||
2195588: 4256985711,
|
||||
2194588: 2553343043,
|
||||
2196688: 2197224,
|
||||
2192288: 1364917638,
|
||||
2195888: 19938058,
|
||||
2193188: 1183181508,
|
||||
2194088: 2389621397,
|
||||
2196188: 1101316817,
|
||||
2194988: 4119138959,
|
||||
2192688: 3404258821,
|
||||
2196488: 2957618219,
|
||||
2193588: 1015303433,
|
||||
2194488: 1542989588,
|
||||
2195188: 334177442,
|
||||
2192188: 3048389179,
|
||||
2193088: 4249806944,
|
||||
2195488: 1476670297,
|
||||
2193988: 4205996809,
|
||||
2196788: 0,
|
||||
2194888: 1063521161,
|
||||
2195788: 1587397832,
|
||||
2192588: 3951930416,
|
||||
2193488: 3182543110,
|
||||
2196088: 1404536822,
|
||||
2194388: 3962928810,
|
||||
2192088: 1508747568,
|
||||
2196388: 2481150443,
|
||||
2192988: 3794218756,
|
||||
2193888: 2230011074,
|
||||
2195088: 2388733849,
|
||||
2194788: 319481313,
|
||||
2192488: 1066099460,
|
||||
2195388: 2397324227,
|
||||
2193388: 3268540448,
|
||||
2194288: 2194384,
|
||||
2195688: 443293108,
|
||||
2191988: 3365837461,
|
||||
2192888: 2725717105,
|
||||
2195988: 954670552,
|
||||
2193788: 2274473962
|
||||
},
|
||||
"list_length": 50
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"capacity": 12,
|
||||
"address": 2100444,
|
||||
"next": 2169260,
|
||||
"memory_size": 3264,
|
||||
"buffer_list": 2196688,
|
||||
"memory": 2196688,
|
||||
"buffer_size": 268,
|
||||
"buffer_headers": {
|
||||
2196960: 1868719728,
|
||||
2198048: 2301952667,
|
||||
2197504: 2764580300,
|
||||
2198592: 4031749240,
|
||||
2199408: 3141828370,
|
||||
2199680: 2673196138,
|
||||
2197776: 655413012,
|
||||
2196688: 2197224,
|
||||
2198864: 483218198,
|
||||
2199136: 2070409995,
|
||||
2197232: 4269595008,
|
||||
2198320: 2960663615
|
||||
},
|
||||
"list_length": 11
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"capacity": 4,
|
||||
"address": 2169260,
|
||||
"next": 2169292,
|
||||
"memory_size": 4288,
|
||||
"buffer_list": 2199904,
|
||||
"memory": 2199904,
|
||||
"buffer_size": 1068,
|
||||
"buffer_headers": {
|
||||
2199904: 2200972,
|
||||
2200976: 3538041113,
|
||||
2202048: 1981831315,
|
||||
2203120: 2664647264
|
||||
},
|
||||
"list_length": 4
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"capacity": 16,
|
||||
"address": 2169292,
|
||||
"next": 2169324,
|
||||
"memory_size": 17536,
|
||||
"buffer_list": 2204176,
|
||||
"memory": 2204176,
|
||||
"buffer_size": 1092,
|
||||
"buffer_headers": {
|
||||
2206368: 3081486871,
|
||||
2208560: 2201211482,
|
||||
2218424: 1142812043,
|
||||
2210752: 1735894938,
|
||||
2219520: 1997110991,
|
||||
2207464: 3467810309,
|
||||
2220616: 3465059190,
|
||||
2217328: 3406578824,
|
||||
2215136: 2543784863,
|
||||
2204176: 2205268,
|
||||
2209656: 3726451979,
|
||||
2214040: 3051833507,
|
||||
2211848: 3382482014,
|
||||
2205272: 2465189202,
|
||||
2212944: 2900433384,
|
||||
2216232: 619500542
|
||||
},
|
||||
"list_length": 16
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"capacity": 15,
|
||||
"address": 2169324,
|
||||
"next": 2169356,
|
||||
"memory_size": 4020,
|
||||
"buffer_list": 2221648,
|
||||
"memory": 2221648,
|
||||
"buffer_size": 264,
|
||||
"buffer_headers": {
|
||||
2222720: 4187811300,
|
||||
2223792: 71320053,
|
||||
2223524: 2131726092,
|
||||
2222184: 983003111,
|
||||
2224060: 1514897371,
|
||||
2222988: 2920869383,
|
||||
2225132: 670722248,
|
||||
2225400: 4011899155,
|
||||
2221648: 2221912,
|
||||
2224328: 1327684221,
|
||||
2222452: 1691084254,
|
||||
2223256: 2278527172,
|
||||
2224596: 3213868993,
|
||||
2221916: 2666878639,
|
||||
2224864: 4293236507
|
||||
},
|
||||
"list_length": 15
|
||||
},
|
||||
{
|
||||
"index": 6,
|
||||
"capacity": 15,
|
||||
"address": 2169356,
|
||||
"next": 0,
|
||||
"memory_size": 4020,
|
||||
"buffer_list": 2225608,
|
||||
"memory": 2225608,
|
||||
"buffer_size": 264,
|
||||
"buffer_headers": {
|
||||
2226144: 2468503925,
|
||||
2228288: 3769100033,
|
||||
2226948: 3003019165,
|
||||
2225608: 2225872,
|
||||
2228556: 1848533574,
|
||||
2226412: 19831529,
|
||||
2229360: 3069868169,
|
||||
2227216: 2022414238,
|
||||
2227752: 2727841579,
|
||||
2228824: 1909490602,
|
||||
2225876: 2300688060,
|
||||
2226680: 210906155,
|
||||
2228020: 3166977216,
|
||||
2227484: 2262736138,
|
||||
2229092: 1991768492
|
||||
},
|
||||
"list_length": 15
|
||||
}
|
||||
]
|
||||
|
||||
trace = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
'traces/hcicore/dictionary_tests/info_heap_new.trace')
|
||||
args = _parse_argv('')
|
||||
args.device = 'adb_replay'
|
||||
args.replay = trace
|
||||
|
||||
data_directory = os.path.expanduser('~') + '/.internalblue'
|
||||
|
||||
if not os.path.exists(data_directory):
|
||||
os.mkdir(data_directory)
|
||||
|
||||
from internalblue.socket_hooks import hook, ReplaySocket
|
||||
hook(HCICore, ReplaySocket, filename=args.replay)
|
||||
|
||||
connection_methods = [HCICore(log_level='info', data_directory=data_directory, replay=True)]
|
||||
|
||||
devices = [] # type: List[DeviceTuple]
|
||||
devices = connection_methods[0].device_list()
|
||||
|
||||
device = devices[0]
|
||||
reference = device[0]
|
||||
reference.interface = device[1]
|
||||
reference.connect()
|
||||
|
||||
information = reference.readHeapInformation()
|
||||
print(information)
|
||||
|
||||
nose.tools.assert_equal(information, dummy)
|
||||
|
||||
reference.shutdown()
|
||||
@@ -1,234 +0,0 @@
|
||||
from __future__ import print_function
|
||||
from internalblue.cli import _parse_argv
|
||||
from internalblue.adbcore import ADBCore
|
||||
|
||||
import os
|
||||
import nose
|
||||
|
||||
try:
|
||||
from typing import List, Optional, Any, TYPE_CHECKING, Tuple
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def test_info_heap_old():
|
||||
dummy = [
|
||||
{
|
||||
'index':0,
|
||||
'buffer_headers': {
|
||||
2194080: 0,
|
||||
2193828: 2121160,
|
||||
2193864: 2194008,
|
||||
2193900: 2194044,
|
||||
2193936: 2193864,
|
||||
2193972: 2121160,
|
||||
2194008: 2193900,
|
||||
2194044: 2194080
|
||||
},
|
||||
'capacity': 8,
|
||||
'address': 2121160,
|
||||
'next': 2121208,
|
||||
'memory_size': 288,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2193828,
|
||||
'memory': 2193828,
|
||||
'buffer_size': 32,
|
||||
'prev': 2157672,
|
||||
'list_length': 7,
|
||||
'thread_waitlist': 0
|
||||
},
|
||||
{
|
||||
'index': 1,
|
||||
'buffer_headers': {
|
||||
2194592: 0,
|
||||
2194116: 2194184,
|
||||
2194184: 2194252,
|
||||
2194252: 2194320,
|
||||
2194320: 2194388,
|
||||
2194388: 2194456,
|
||||
2194456: 2194524,
|
||||
2194524: 2194592
|
||||
},
|
||||
'capacity': 8,
|
||||
'address': 2121208,
|
||||
'next': 2121256,
|
||||
'memory_size': 544,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2194184,
|
||||
'memory': 2194116,
|
||||
'buffer_size': 64,
|
||||
'prev': 2121160,
|
||||
'list_length': 7,
|
||||
'thread_waitlist': 0
|
||||
},
|
||||
{
|
||||
'index': 2,
|
||||
'buffer_headers': {
|
||||
2196000: 2196268,
|
||||
2197072: 0,
|
||||
2194660: 2194928,
|
||||
2195464: 2195732,
|
||||
2196268: 2196536,
|
||||
2194928: 2195196,
|
||||
2195732: 2196000,
|
||||
2196536: 2196804,
|
||||
2196804: 2197072,
|
||||
2195196: 2195464
|
||||
},
|
||||
'capacity': 10,
|
||||
'address': 2121256,
|
||||
'next': 2121352,
|
||||
'memory_size': 2680,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2194660,
|
||||
'memory': 2194660,
|
||||
'buffer_size': 264,
|
||||
'prev': 2121208,
|
||||
'list_length': 10,
|
||||
'thread_waitlist': 0
|
||||
},
|
||||
{
|
||||
'index': 3,
|
||||
'buffer_headers': {
|
||||
2214480: 2215548,
|
||||
2215548: 2216616,
|
||||
2216616: 0,
|
||||
2213412: 2214480
|
||||
},
|
||||
'capacity': 4,
|
||||
'address': 2121352,
|
||||
'next': 2121304,
|
||||
'memory_size': 4272,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2213412,
|
||||
'memory': 2213412,
|
||||
'buffer_size': 1064,
|
||||
'prev': 2121256,
|
||||
'list_length': 4,
|
||||
'thread_waitlist': 0
|
||||
},
|
||||
{
|
||||
'index': 4,
|
||||
'buffer_headers': {
|
||||
2234124: 0,
|
||||
2231932: 2233028,
|
||||
2224260: 2225356,
|
||||
2219876: 2220972,
|
||||
2226452: 2227548,
|
||||
2223164: 2224260,
|
||||
2228644: 2229740,
|
||||
2220972: 2222068,
|
||||
2225356: 2226452,
|
||||
2230836: 2231932,
|
||||
2233028: 2234124,
|
||||
2222068: 2223164,
|
||||
2227548: 2228644,
|
||||
2217684: 2218780,
|
||||
2218780: 2219876,
|
||||
2229740: 2230836
|
||||
},
|
||||
'capacity': 16,
|
||||
'address': 2121304,
|
||||
'next': 2157624,
|
||||
'memory_size': 17536,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2217684,
|
||||
'memory': 2217684,
|
||||
'buffer_size': 1092,
|
||||
'prev': 2121352,
|
||||
'list_length': 16,
|
||||
'thread_waitlist': 0
|
||||
},
|
||||
{
|
||||
'index': 5,
|
||||
'buffer_headers': {
|
||||
2235264: 2235308,
|
||||
2235616: 2235660,
|
||||
2235396: 2235440,
|
||||
2235528: 2235572,
|
||||
2235660: 2235704,
|
||||
2235308: 2235352,
|
||||
2235440: 2235484,
|
||||
2235704: 2235748,
|
||||
2235792: 2235836,
|
||||
2235220: 2235264,
|
||||
2235748: 2235792,
|
||||
2235352: 2235396,
|
||||
2235572: 2235616,
|
||||
2235836: 0,
|
||||
2235484: 2235528
|
||||
},
|
||||
'capacity': 15,
|
||||
'address': 2157624,
|
||||
'next': 2157672,
|
||||
'memory_size': 660,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2235220,
|
||||
'memory': 2235220,
|
||||
'buffer_size': 40,
|
||||
'prev': 2121304,
|
||||
'list_length': 15,
|
||||
'thread_waitlist': 0
|
||||
},
|
||||
{
|
||||
'index': 6,
|
||||
'buffer_headers': {
|
||||
2236096: 2236132,
|
||||
2236240: 2236276,
|
||||
2236132: 2236168,
|
||||
2236384: 0,
|
||||
2235880: 2235916,
|
||||
2236204: 2236240,
|
||||
2236348: 2236384,
|
||||
2235916: 2235952,
|
||||
2235952: 2235988,
|
||||
2236168: 2236204,
|
||||
2236312: 2236348,
|
||||
2235988: 2236024,
|
||||
2236024: 2236060,
|
||||
2236276: 2236312,
|
||||
2236060: 2236096
|
||||
},
|
||||
'capacity': 15,
|
||||
'address': 2157672,
|
||||
'next': 2121160,
|
||||
'memory_size': 540,
|
||||
'waitlist_length': 0,
|
||||
'buffer_list': 2235880,
|
||||
'memory': 2235880,
|
||||
'buffer_size': 32,
|
||||
'prev': 2157624,
|
||||
'list_length': 15,
|
||||
'thread_waitlist': 0
|
||||
}]
|
||||
|
||||
trace = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
'traces/adbcore/dictionary_tests/info_heap_old.trace')
|
||||
args = _parse_argv('')
|
||||
args.device = 'adb_replay'
|
||||
args.replay = trace
|
||||
|
||||
data_directory = os.path.expanduser('~') + '/.internalblue'
|
||||
|
||||
if not os.path.exists(data_directory):
|
||||
os.mkdir(data_directory)
|
||||
|
||||
from internalblue.socket_hooks import hook, ReplaySocket
|
||||
hook(ADBCore, ReplaySocket, filename=args.replay)
|
||||
|
||||
connection_methods = [ADBCore(log_level='info', data_directory=data_directory, replay=True)]
|
||||
|
||||
devices = [] # type: List[DeviceTuple]
|
||||
devices = connection_methods[0].device_list()
|
||||
|
||||
device = devices[0]
|
||||
reference = device[0]
|
||||
reference.interface = device[1]
|
||||
reference.connect()
|
||||
|
||||
information = reference.readHeapInformation()
|
||||
print(information)
|
||||
|
||||
nose.tools.assert_equal(information, dummy)
|
||||
|
||||
reference.shutdown()
|
||||
@@ -1,24 +1,30 @@
|
||||
from __future__ import print_function
|
||||
from internalblue.cli import _parse_argv
|
||||
from internalblue.adbcore import ADBCore
|
||||
from internalblue.objects.connection_information import ConnectionInformation
|
||||
|
||||
import os
|
||||
import nose
|
||||
|
||||
try:
|
||||
from typing import List, Optional, Any, TYPE_CHECKING, Tuple
|
||||
from internalblue import DeviceTuple
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def test_info_conn_7():
|
||||
dummy = ConnectionInformation(7, bytearray.fromhex('0023023a1a2e'), 0, True, 0xc,
|
||||
bytearray.fromhex('e98a5eaaff39ecb5ce4447590dfb73a4'), 16,
|
||||
bytearray.fromhex('dbea2d9c47bc1aa6afe664ff31591aa6'), -87,
|
||||
bytearray.fromhex('0a00c821ffff8ffa'), bytearray.fromhex('9bff598701000000'),
|
||||
bytearray.fromhex('00'))
|
||||
dummy = {
|
||||
'connection_handle': 0xc,
|
||||
'connection_number': 7,
|
||||
'master_of_connection': True,
|
||||
'remote_name_address': 0,
|
||||
'remote_address': '0023023a1a2e'.decode('hex'),
|
||||
'id': '00'.decode('hex'),
|
||||
'public_rand': 'e98a5eaaff39ecb5ce4447590dfb73a4'.decode('hex'),
|
||||
'extended_lmp_feat': '0a00c821ffff8ffa'.decode('hex'),
|
||||
'link_key': 'dbea2d9c47bc1aa6afe664ff31591aa6'.decode('hex'),
|
||||
'tx_pwr_lvl_dBm': -87,
|
||||
'effective_key_len': 16,
|
||||
'host_supported_feat': '9bff598701000000'.decode('hex')
|
||||
}
|
||||
|
||||
trace = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
'traces/adbcore/dictionary_tests/info_conn_7.trace')
|
||||
@@ -47,6 +53,6 @@ def test_info_conn_7():
|
||||
information = reference.readConnectionInformation(7)
|
||||
print(information)
|
||||
|
||||
nose.tools.assert_dict_equal(vars(information), vars(dummy))
|
||||
nose.tools.assert_dict_equal(information, dummy)
|
||||
|
||||
reference.shutdown()
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
from __future__ import print_function
|
||||
from internalblue.cli import _parse_argv
|
||||
from internalblue.adbcore import ADBCore
|
||||
from internalblue.objects.connection_information import ConnectionInformation
|
||||
|
||||
import os
|
||||
import nose
|
||||
@@ -13,10 +11,20 @@ except ImportError:
|
||||
|
||||
|
||||
def test_info_conn_9():
|
||||
dummy = ConnectionInformation(9, bytearray.fromhex('000000000000'), 0, False, 12,
|
||||
bytearray.fromhex('00000000000000000000000000000000'), 0, b'', -87,
|
||||
bytearray.fromhex('0000000000000000'),
|
||||
bytearray.fromhex('0000000000000000'), bytearray.fromhex('00'))
|
||||
dummy = {
|
||||
'connection_handle': 12,
|
||||
'connection_number': 9,
|
||||
'master_of_connection': False,
|
||||
'remote_name_address': 0,
|
||||
'remote_address': '000000000000'.decode('hex'),
|
||||
'id': '00'.decode('hex'),
|
||||
'public_rand': '00000000000000000000000000000000'.decode('hex'),
|
||||
'extended_lmp_feat': '0000000000000000'.decode('hex'),
|
||||
'link_key': '',
|
||||
'tx_pwr_lvl_dBm': -87,
|
||||
'effective_key_len': 0,
|
||||
'host_supported_feat': '0000000000000000'.decode('hex')
|
||||
}
|
||||
|
||||
trace = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
'traces/adbcore/dictionary_tests/info_conn_9.trace')
|
||||
@@ -45,6 +53,6 @@ def test_info_conn_9():
|
||||
information = reference.readConnectionInformation(9)
|
||||
print(information)
|
||||
|
||||
nose.tools.assert_dict_equal(vars(information), vars(dummy))
|
||||
nose.tools.assert_dict_equal(information, dummy)
|
||||
|
||||
reference.shutdown()
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
from __future__ import print_function
|
||||
from internalblue.cli import _parse_argv
|
||||
from internalblue.adbcore import ADBCore
|
||||
from internalblue.objects.queue_element import QueueElement
|
||||
|
||||
import os
|
||||
import nose
|
||||
|
||||
try:
|
||||
from typing import List, Optional, Any, TYPE_CHECKING, Tuple
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
def test_info_queue():
|
||||
dummy = [
|
||||
QueueElement(0, 2123152, 4, 16, 0, 16, 2123208, 2123272, 2123268, 2123268, 0, 0, 2123332, 2141676, 'tran_HCIEvent'),
|
||||
QueueElement(1, 2123332, 8, 31, 0, 31, 2123388, 2123636, 2123436, 2123436, 0, 0, 2123636, 2123152, 'tran_ACLData'),
|
||||
QueueElement(2, 2123636, 4, 3, 0, 3, 2123692, 2123704, 2123692, 2123692, 0, 0, 2123704, 2123332, 'tran_SCOData'),
|
||||
QueueElement(3, 2123704, 4, 31, 0, 31, 2123760, 2123884, 2123760, 2123760, 0, 0, 2123884, 2123636, 'tran_UartBridgeNonHCIEvent'),
|
||||
QueueElement(4, 2123884, 4, 20, 0, 20, 2123940, 2124020, 2124000, 2124000, 0, 0, 2124020, 2123704, 'tran_DiagData'),
|
||||
QueueElement(5, 2124020, 8, 8, 0, 8, 2124076, 2124140, 2124076, 2124076, 0, 0, 2124140, 2123884, 'tran_HIDUsbKBEvt'),
|
||||
QueueElement(6, 2124140, 8, 6, 0, 6, 2124196, 2124244, 2124196, 2124196, 0, 0, 2124244, 2124020, 'tran_HIDUsbMSEvt'),
|
||||
QueueElement(7, 2124244, 8, 1, 0, 1, 2100496, 2100504, 2100496, 2100496, 0, 0, 2124300, 2124140, 'tran_HIDUsbMSCtrl'),
|
||||
QueueElement(8, 2124300, 8, 1, 0, 1, 2100504, 2100512, 2100504, 2100504, 0, 0, 2124356, 2124244, 'tran_HIDUsbKBCtrl'),
|
||||
QueueElement(9, 2124356, 8, 32, 0, 32, 2124412, 2124668, 2124412, 2124412, 0, 0, 2110352, 2124300, 'tran_HidAuxData'),
|
||||
QueueElement(10, 2110352, 8, 12, 0, 12, 2192284, 2192380, 2192300, 2192300, 0, 0, 2120560, 2124356, 'lm_Cmd'),
|
||||
QueueElement(11, 2120560, 4, 8, 0, 8, 2192380, 2192412, 2192400, 2192400, 0, 0, 2110408, 2110352, 'hci_HciCommand'),
|
||||
QueueElement(12, 2110408, 8, 19, 0, 19, 2192412, 2192564, 2192412, 2192412, 0, 0, 2118068, 2120560, 'lm_deferredAction'),
|
||||
QueueElement(13, 2118068, 8, 6, 0, 6, 2192564, 2192612, 2192564, 2192564, 0, 0, 2141588, 2110408, 'lrmmsm_cmd'),
|
||||
QueueElement(14, 2141588, 4, 8, 0, 8, 2141644, 2141676, 2141644, 2141644, 0, 0, 2141676, 2118068, 'liteHostEvent'),
|
||||
QueueElement(15, 2141676, 4, 16, 0, 16, 2141732, 2141796, 2141732, 2141732, 0, 0, 2123152, 2141588, 'litehostRcvdL2capData')
|
||||
]
|
||||
|
||||
trace = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
'traces/adbcore/dictionary_tests/info_queue.trace')
|
||||
args = _parse_argv('')
|
||||
args.device = 'adb_replay'
|
||||
args.replay = trace
|
||||
|
||||
data_directory = os.path.expanduser('~') + '/.internalblue'
|
||||
|
||||
if not os.path.exists(data_directory):
|
||||
os.mkdir(data_directory)
|
||||
|
||||
from internalblue.socket_hooks import hook, ReplaySocket
|
||||
hook(ADBCore, ReplaySocket, filename=args.replay)
|
||||
|
||||
connection_methods = [ADBCore(log_level='info', data_directory=data_directory, replay=True)]
|
||||
|
||||
devices = [] # type: List[DeviceTuple]
|
||||
devices = connection_methods[0].device_list()
|
||||
|
||||
device = devices[0]
|
||||
reference = device[0]
|
||||
reference.interface = device[1]
|
||||
reference.connect()
|
||||
|
||||
information = reference.readQueueInformation()
|
||||
print(information)
|
||||
|
||||
nose.tools.assert_equal([vars(element) for element in information], [vars(element) for element in dummy])
|
||||
|
||||
reference.shutdown()
|
||||
@@ -1,7 +1,5 @@
|
||||
from __future__ import print_function
|
||||
from __future__ import absolute_import
|
||||
|
||||
from .testwrapper import trace_test, get_trace_path_cmd_tuple
|
||||
from testwrapper import trace_test, get_trace_path_cmd_tuple
|
||||
|
||||
|
||||
import os
|
||||
@@ -36,7 +34,7 @@ def generate_test_suite_from_traces():
|
||||
if os.path.isdir(os.path.join(tracedir,core)):
|
||||
core_suite = unittest.TestSuite()
|
||||
for tracefile in os.listdir(os.path.join(tracedir, core)):
|
||||
if tracefile.endswith(".trace"):
|
||||
if tracefile != '.gitkeep' and tracefile != 'dictionary_tests':
|
||||
core_suite.addTest(
|
||||
unittest.FunctionTestCase(generate_test_from_file(core, tracefile), description=tracefile))
|
||||
suite.addTest(core_suite)
|
||||
|
||||
@@ -1,685 +0,0 @@
|
||||
# info heap
|
||||
TX 010300011000
|
||||
RX 0000000400000004000000020000000000e269c200a6dc56
|
||||
RX 01011000
|
||||
RX 0000000f0000000f000000030000000000e269c2
|
||||
RX 00a717ec
|
||||
RX 04
|
||||
RX 0e0c01011000075301070f000961
|
||||
TX 070200f001
|
||||
TX 0108004dfc059430200004
|
||||
RX 000000030000000300000003
|
||||
RX 0000000000e269c200a87965
|
||||
RX 07f001
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200a8e193
|
||||
RX 01
|
||||
RX 4dfc059430200004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c2
|
||||
RX 00a918e2
|
||||
RX 040e08014dfc00c85d2000
|
||||
TX 0108004dfc05c85d200030
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200aab793
|
||||
RX 014dfc05c85d200030
|
||||
RX 00000037
|
||||
RX 000000370000000300000000
|
||||
RX 00e269c200aaf0ec
|
||||
RX 04
|
||||
RX 0e34014dfc00434f4c42000000000700000008000000a4792100a479210020010000200000000000000000000000f85d200068ec2000
|
||||
TX 0108004dfc05a479210004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200acb1ba
|
||||
RX 014dfc05a479210004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c200ace5c2
|
||||
RX 04
|
||||
RX 0e08014dfc00c85d2000
|
||||
TX 0108004dfc05c879210004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200ae2501
|
||||
RX 014dfc05c879210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200ae5915
|
||||
RX 04
|
||||
RX 0e08014dfc00587a2100
|
||||
TX 0108004dfc05ec79210004
|
||||
RX 0000000900000009000000020000000000e269c200b01eae
|
||||
RX 01
|
||||
RX 4dfc05ec79210004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c200b04d6c
|
||||
RX 04
|
||||
RX 0e08014dfc007c7a2100
|
||||
TX 0108004dfc05107a210004
|
||||
RX 0000000900000009000000020000000000e269c200b19061
|
||||
RX 014dfc05107a210004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c200b1c4f3
|
||||
RX 04
|
||||
RX 0e08014dfc00c8792100
|
||||
TX 0108004dfc05347a210004
|
||||
RX 0000000900000009000000020000000000e269c200b38d00
|
||||
RX 01
|
||||
RX 4dfc05347a210004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c200b3bbaa
|
||||
RX 040e08014dfc00c85d2000
|
||||
TX 0108004dfc05587a210004
|
||||
RX 0000000900000009000000020000000000e269c200b58252
|
||||
RX 014dfc05587a210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00b5b18b
|
||||
RX 040e08014dfc00ec792100
|
||||
TX 0108004dfc057c7a210004
|
||||
RX 0000000900000009000000020000000000e269c200b6f455
|
||||
RX 014dfc057c7a210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00b728c4
|
||||
RX 040e08014dfc00a07a2100
|
||||
TX 0108004dfc05a07a210004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200b8f1d6
|
||||
RX 014dfc05a07a210004
|
||||
RX 0000000b0000000b000000030000000000e269c2
|
||||
RX 00b92612
|
||||
RX 040e08014dfc0000000000
|
||||
TX 0108004dfc05f85d200030
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00ba65be
|
||||
RX 014dfc05f85d200030
|
||||
RX 00000037000000370000000300000000
|
||||
RX 00e269c200ba9b76
|
||||
RX 04
|
||||
RX 0e34014dfc00434f4c42000000000700000008000000087b2100c47a210020020000400000000000000000000000285e2000c85d2000
|
||||
TX 0108004dfc05c47a210004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200bc6390
|
||||
RX 014dfc05c47a210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00bc987e
|
||||
RX 04
|
||||
RX 0e08014dfc00087b2100
|
||||
TX 0108004dfc05087b210004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 00bdd708
|
||||
RX 014dfc05087b210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200be075f
|
||||
RX 04
|
||||
RX 0e08014dfc004c7b2100
|
||||
TX 0108004dfc054c7b210004
|
||||
RX 0000000900000009000000020000000000e269c200bfd07f
|
||||
RX 014dfc054c7b210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00bfffe2
|
||||
RX 040e08014dfc00907b2100
|
||||
TX 0108004dfc05907b210004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200c1c264
|
||||
RX 014dfc05907b210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00c1fba1
|
||||
RX 040e08014dfc00d47b2100
|
||||
TX 0108004dfc05d47b210004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c200c339f3
|
||||
RX 014dfc05d47b210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00c36f64
|
||||
RX 040e08014dfc00187c2100
|
||||
TX 0108004dfc05187c210004
|
||||
RX 0000000900000009000000020000000000e269c200c53386
|
||||
RX 014dfc05187c210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00c56249
|
||||
RX 040e08014dfc005c7c2100
|
||||
TX 0108004dfc055c7c210004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 00c6a64c
|
||||
RX 014dfc055c7c210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200c6d51e
|
||||
RX 04
|
||||
RX 0e08014dfc00a07c2100
|
||||
TX 0108004dfc05a07c210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00c8a176
|
||||
RX 014dfc05a07c210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200c8daef
|
||||
RX 04
|
||||
RX 0e08014dfc0000000000
|
||||
TX 0108004dfc05285e200030
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00ca1661
|
||||
RX 014dfc05285e200030
|
||||
RX 000000370000003700000003
|
||||
RX 0000000000e269c200ca4c0b
|
||||
RX 040e34014dfc00434f4c42000000000a0000000a000000e47c2100e47c2100780a0000080100000000000000000000885e2000f85d2000
|
||||
TX 0108004dfc05e47c210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00cc13aa
|
||||
RX 014dfc05e47c210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200cc49c8
|
||||
RX 04
|
||||
RX 0e08014dfc00f07d2100
|
||||
TX 0108004dfc05f07d210004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200ce084a
|
||||
RX 014dfc05f07d210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00ce3d02
|
||||
RX 040e08014dfc00fc7e2100
|
||||
TX 0108004dfc05fc7e210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00cf7abc
|
||||
RX 014dfc05fc7e210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200cfafff
|
||||
RX 04
|
||||
RX 0e08014dfc0008802100
|
||||
TX 0108004dfc050880210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00d1718e
|
||||
RX 014dfc050880210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200d1ad02
|
||||
RX 040e08014dfc0014812100
|
||||
TX 0108004dfc051481210004
|
||||
RX 0000000900000009000000020000000000e269c200d2e49d
|
||||
RX 01
|
||||
RX 4dfc051481210004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c200d313fc
|
||||
RX 040e08014dfc0020822100
|
||||
TX 0108004dfc052082210004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 00d4dfc6
|
||||
RX 014dfc052082210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200d50e59
|
||||
RX 040e08014dfc002c832100
|
||||
TX 0108004dfc052c83210004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200d65308
|
||||
RX 01
|
||||
RX 4dfc052c83210004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c2
|
||||
RX 00d68806
|
||||
RX 040e08014dfc0038842100
|
||||
TX 0108004dfc053884210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00d84aba
|
||||
RX 014dfc053884210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200d88584
|
||||
RX 040e08014dfc0044852100
|
||||
TX 0108004dfc054485210004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 00da42d6
|
||||
RX 014dfc054485210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200da7651
|
||||
RX 040e08014dfc0050862100
|
||||
TX 0108004dfc055086210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00dbba9e
|
||||
RX 014dfc055086210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200dbf538
|
||||
RX 04
|
||||
RX 0e08014dfc0000000000
|
||||
TX 0108004dfc05885e200030
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200ddb037
|
||||
RX 01
|
||||
RX 4dfc05885e200030
|
||||
RX 000000370000003700000003
|
||||
RX 0000000000e269c200dde9b6
|
||||
RX 040e34014dfc00434f4c4200000000040000000400000024c6210024c62100b0100000280400000000000000000000585e2000285e2000
|
||||
TX 0108004dfc0524c6210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00df268a
|
||||
RX 014dfc0524c6210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200df5cd7
|
||||
RX 040e08014dfc0050ca2100
|
||||
TX 0108004dfc0550ca210004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 00e11eb6
|
||||
RX 01
|
||||
RX 4dfc0550ca210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200e15819
|
||||
RX 040e08014dfc007cce2100
|
||||
TX 0108004dfc057cce210004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200e29334
|
||||
RX 01
|
||||
RX 4dfc057cce210004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c2
|
||||
RX 00e2c73e
|
||||
RX 040e08014dfc00a8d22100
|
||||
TX 0108004dfc05a8d2210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00e4925e
|
||||
RX 014dfc05a8d2210004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c200e4c673
|
||||
RX 040e08014dfc0000000000
|
||||
TX 0108004dfc05585e200030
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00e5ff65
|
||||
RX 014dfc05585e200030
|
||||
RX 000000370000003700000003
|
||||
RX 0000000000e269c200e63326
|
||||
RX 040e34014dfc00434f4c42000000001000000010000000d4d62100d4d621008044000044040000000000000000000038ec2000885e2000
|
||||
TX 0108004dfc05d4d6210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00e7fcce
|
||||
RX 014dfc05d4d6210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200e8313f
|
||||
RX 040e08014dfc001cdb2100
|
||||
TX 0108004dfc051cdb210004
|
||||
RX 0000000900000009000000020000000000e269c200e9f3c0
|
||||
RX 014dfc051cdb210004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c2
|
||||
RX 00ea223f
|
||||
RX 040e08014dfc0064df2100
|
||||
TX 0108004dfc0564df210004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200eb6947
|
||||
RX 01
|
||||
RX 4dfc0564df210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200eb9dc8
|
||||
RX 04
|
||||
RX 0e08014dfc00ace32100
|
||||
TX 0108004dfc05ace3210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00ed6025
|
||||
RX 014dfc05ace3210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00edb820
|
||||
RX 040e08014dfc00f4e72100
|
||||
TX 0108004dfc05f4e7210004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200eeaa84
|
||||
RX 014dfc05f4e7210004
|
||||
RX 0000000b0000000b000000030000000000e269c200eeb23c
|
||||
RX 04
|
||||
RX 0e08014dfc003cec2100
|
||||
TX 0108004dfc053cec210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c200ef25f0
|
||||
RX 01
|
||||
RX 4dfc053cec210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c200ef2e26
|
||||
RX 04
|
||||
RX 0e08014dfc0084f02100
|
||||
TX 0108004dfc0584f0210004
|
||||
RX 0000000900000009000000020000000000e269c200efa285
|
||||
RX 014dfc0584f0210004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c200efa979
|
||||
RX 040e08014dfc00ccf42100
|
||||
TX 0108004dfc05ccf4210004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00f0207c
|
||||
RX 014dfc05ccf4210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200f028c8
|
||||
RX 04
|
||||
RX 0e08014dfc0014f92100
|
||||
TX 0108004dfc0514f9210004
|
||||
RX 0000000900000009000000020000000000e269c200f0b8fd
|
||||
RX 014dfc0514f9210004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200f0bf4a
|
||||
RX 040e08014dfc005cfd2100
|
||||
TX 0108004dfc055cfd210004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200f11c7d
|
||||
RX 01
|
||||
RX 4dfc055cfd210004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200f12aa4
|
||||
RX 040e08014dfc00a4012200
|
||||
TX 0108004dfc05a401220004
|
||||
RX 0000000900000009000000020000000000e269c200f1946c
|
||||
RX 014dfc05a401220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200f19f40
|
||||
RX 040e08014dfc00ec052200
|
||||
TX 0108004dfc05ec05220004
|
||||
RX 0000000900000009000000020000000000e269c200f20f44
|
||||
RX 01
|
||||
RX 4dfc05ec05220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200f21b6a
|
||||
RX 04
|
||||
RX 0e08014dfc00340a2200
|
||||
TX 0108004dfc05340a220004
|
||||
RX 0000000900000009000000020000000000e269c200f29be7
|
||||
RX 014dfc05340a220004
|
||||
RX 0000000b
|
||||
RX 0000000b000000030000000000e269c2
|
||||
RX 00f2b3bd
|
||||
RX 040e08014dfc007c0e2200
|
||||
TX 0108004dfc057c0e220004
|
||||
RX 00000009
|
||||
RX 00000009
|
||||
RX 0000000200000000
|
||||
RX 00e269c200f3a7c6
|
||||
RX 01
|
||||
RX 4dfc057c0e220004
|
||||
RX 0000000b0000000b000000030000000000e269c2
|
||||
RX 00f4951f
|
||||
RX 040e08014dfc00c4122200
|
||||
TX 0108004dfc05c412220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c200f637e5
|
||||
RX 014dfc05c412220004
|
||||
RX 0000000b0000000b000000030000000000e269c200f63f91
|
||||
RX 040e08014dfc000c172200
|
||||
TX 0108004dfc050c17220004
|
||||
RX 00000009
|
||||
RX 000000090000000200000000
|
||||
RX 00e269c200f6f156
|
||||
RX 014dfc050c17220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200f6f966
|
||||
RX 04
|
||||
RX 0e08014dfc0000000000
|
||||
TX 0108004dfc0538ec200030
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200f76de0
|
||||
RX 014dfc0538ec200030
|
||||
RX 0000003700000037000000030000000000e269c200f7757d
|
||||
RX 040e34014dfc00434f4c42000000000f0000000f000000541b2200541b22009402000028000000000000000000000068ec2000585e2000
|
||||
TX 0108004dfc05541b220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00f8133d
|
||||
RX 014dfc05541b220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c200f83a20
|
||||
RX 04
|
||||
RX 0e08014dfc00801b2200
|
||||
TX 0108004dfc05801b220004
|
||||
RX 0000000900000009000000020000000000e269c200f909ee
|
||||
RX 014dfc05801b220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c200f935e2
|
||||
RX 04
|
||||
RX 0e08014dfc00ac1b2200
|
||||
TX 0108004dfc05ac1b220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 00fb146c
|
||||
RX 014dfc05ac1b220004
|
||||
RX 0000000b
|
||||
RX 0000000b00000003
|
||||
RX 0000000000e269c200fb4327
|
||||
RX 040e08014dfc00d81b2200
|
||||
TX 0108004dfc05d81b220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 00fd0682
|
||||
RX 014dfc05d81b220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c200fd3fca
|
||||
RX 04
|
||||
RX 0e08014dfc00041c2200
|
||||
TX 0108004dfc05041c220004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c200fe7d8e
|
||||
RX 01
|
||||
RX 4dfc05041c220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c200feb0d4
|
||||
RX 040e08014dfc00301c2200
|
||||
TX 0108004dfc05301c220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 010074cc
|
||||
RX 014dfc05301c220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c20100a76b
|
||||
RX 04
|
||||
RX 0e08014dfc005c1c2200
|
||||
TX 0108004dfc055c1c220004
|
||||
RX 0000000900000009000000020000000000e269c20101eacb
|
||||
RX 014dfc055c1c220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c201021779
|
||||
RX 04
|
||||
RX 0e08014dfc00881c2200
|
||||
TX 0108004dfc05881c220004
|
||||
RX 0000000900000009000000020000000000e269c20103e6c3
|
||||
RX 014dfc05881c220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c201041515
|
||||
RX 04
|
||||
RX 0e08014dfc00b41c2200
|
||||
TX 0108004dfc05b41c220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 01055aa2
|
||||
RX 014dfc05b41c220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c201058f0e
|
||||
RX 040e08014dfc00e01c2200
|
||||
TX 0108004dfc05e01c220004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c201075199
|
||||
RX 014dfc05e01c220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c201078a8c
|
||||
RX 04
|
||||
RX 0e08014dfc000c1d2200
|
||||
TX 0108004dfc050c1d220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 010948a2
|
||||
RX 014dfc050c1d220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c201097c0d
|
||||
RX 04
|
||||
RX 0e08014dfc00381d2200
|
||||
TX 0108004dfc05381d220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2010ac2b3
|
||||
RX 014dfc05381d220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c2010afeef
|
||||
RX 04
|
||||
RX 0e08014dfc00641d2200
|
||||
TX 0108004dfc05641d220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 010cbc41
|
||||
RX 014dfc05641d220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c2010cefe5
|
||||
RX 040e08014dfc00901d2200
|
||||
TX 0108004dfc05901d220004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c2010e2df1
|
||||
RX 01
|
||||
RX 4dfc05901d220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c2010e61ea
|
||||
RX 040e08014dfc00bc1d2200
|
||||
TX 0108004dfc05bc1d220004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c20110231e
|
||||
RX 014dfc05bc1d220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c201105c92
|
||||
RX 04
|
||||
RX 0e08014dfc0000000000
|
||||
TX 0108004dfc0568ec200030
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 01119816
|
||||
RX 014dfc0568ec200030
|
||||
RX 00000037000000370000000300000000
|
||||
RX 00e269c20111c667
|
||||
RX 04
|
||||
RX 0e34014dfc00434f4c42000000000f0000000f000000e81d2200e81d22001c020000200000000000000000000000c85d200038ec2000
|
||||
TX 0108004dfc05e81d220004
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c201138f25
|
||||
RX 01
|
||||
RX 4dfc05e81d220004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c20113c768
|
||||
RX 040e08014dfc000c1e2200
|
||||
TX 0108004dfc050c1e220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 011507e7
|
||||
RX 014dfc050c1e220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c201153d26
|
||||
RX 04
|
||||
RX 0e08014dfc00301e2200
|
||||
TX 0108004dfc05301e220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 0116fe0e
|
||||
RX 014dfc05301e220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c201173734
|
||||
RX 04
|
||||
RX 0e08014dfc00541e2200
|
||||
TX 0108004dfc05541e220004
|
||||
RX 0000000900000009000000020000000000e269c20118f296
|
||||
RX 014dfc05541e220004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c2011926ef
|
||||
RX 040e08014dfc00781e2200
|
||||
TX 0108004dfc05781e220004
|
||||
RX 0000000900000009000000020000000000e269c2011a6bbe
|
||||
RX 014dfc05781e220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c2011a9958
|
||||
RX 04
|
||||
RX 0e08014dfc009c1e2200
|
||||
TX 0108004dfc059c1e220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 011c676b
|
||||
RX 014dfc059c1e220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c2011c9b6e
|
||||
RX 040e08014dfc00c01e2200
|
||||
TX 0108004dfc05c01e220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 011dda94
|
||||
RX 014dfc05c01e220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c2011e0829
|
||||
RX 04
|
||||
RX 0e08014dfc00e41e2200
|
||||
TX 0108004dfc05e41e220004
|
||||
RX 0000000900000009000000020000000000e269c2011fd393
|
||||
RX 014dfc05e41e220004
|
||||
RX 0000000b0000000b
|
||||
RX 0000000300000000
|
||||
RX 00e269c201200234
|
||||
RX 040e08014dfc00081f2200
|
||||
TX 0108004dfc05081f220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 012145f7
|
||||
RX 014dfc05081f220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c20121a431
|
||||
RX 04
|
||||
RX 0e08014dfc002c1f2200
|
||||
TX 0108004dfc052c1f220004
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c201230eec
|
||||
RX 014dfc052c1f220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c201231658
|
||||
RX 040e08014dfc00501f2200
|
||||
TX 0108004dfc05501f220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c20124484f
|
||||
RX 014dfc05501f220004
|
||||
RX 0000000b0000000b0000000300000000
|
||||
RX 00e269c201244f7a
|
||||
RX 040e08014dfc00741f2200
|
||||
TX 0108004dfc05741f220004
|
||||
RX 00000009
|
||||
RX 00000009000000020000000000e269c201250543
|
||||
RX 01
|
||||
RX 4dfc05741f220004
|
||||
RX 0000000b0000000b000000030000000000e269c2
|
||||
RX 01250d7b
|
||||
RX 040e08014dfc00981f2200
|
||||
TX 0108004dfc05981f220004
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 0125e492
|
||||
RX 014dfc05981f220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c201260ab3
|
||||
RX 040e08014dfc00bc1f2200
|
||||
TX 0108004dfc05bc1f220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 01276da0
|
||||
RX 014dfc05bc1f220004
|
||||
RX 0000000b
|
||||
RX 0000000b0000000300000000
|
||||
RX 00e269c201279c46
|
||||
RX 040e08014dfc00e01f2200
|
||||
TX 0108004dfc05e01f220004
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 0128e461
|
||||
RX 014dfc05e01f220004
|
||||
RX 0000000b0000000b00000003
|
||||
RX 0000000000e269c2012914b3
|
||||
RX 040e08014dfc0000000000
|
||||
Socket closed
|
||||
@@ -1,148 +0,0 @@
|
||||
# info queue
|
||||
TX 010300011000
|
||||
RX 0000000400000004000000020000000000e269c2663770fc
|
||||
RX 01011000
|
||||
RX 0000000f0000000f000000030000000000e269c26637a4a7
|
||||
RX 040e0c01011000075301070f000961
|
||||
TX 070200f001
|
||||
TX 0108004dfc057c30200004
|
||||
RX 00000003000000030000000300000000
|
||||
RX 00e269c266390c8a
|
||||
RX 07f001
|
||||
RX 00000009
|
||||
RX 000000090000000200000000
|
||||
RX 00e269c2663974da
|
||||
RX 01
|
||||
RX 4dfc057c30200004
|
||||
RX 0000000b0000000b
|
||||
RX 000000030000000000e269c26639ac63
|
||||
RX 040e08014dfc0090652000
|
||||
TX 0108004dfc059065200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c2
|
||||
RX 663b4f1a
|
||||
RX 014dfc059065200038
|
||||
RX 0000003f0000003f0000000300000000
|
||||
RX 00e269c2663b83d8
|
||||
RX 040e3c014dfc00554555510000000001000000100000000000000010000000c8652000086620000466200004662000000000000000000044662000ecad2000
|
||||
TX 0108004dfc054466200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c2663d419c
|
||||
RX 014dfc054466200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 663d7aab
|
||||
RX 040e3c014dfc005545555100000000020000001f000000000000001f0000007c66200074672000ac662000ac66200000000000000000007467200090652000
|
||||
TX 0108004dfc057467200038
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 663ebb9e
|
||||
RX 014dfc057467200038
|
||||
RX 0000003f0000003f00000003
|
||||
RX 0000000000e269c2663eeac6
|
||||
RX 040e3c014dfc00554555510000000001000000030000000000000003000000ac672000b8672000ac672000ac6720000000000000000000b867200044662000
|
||||
TX 0108004dfc05b867200038
|
||||
RX 0000000900000009000000020000000000e269c26640af70
|
||||
RX 01
|
||||
RX 4dfc05b867200038
|
||||
RX 0000003f0000003f
|
||||
RX 000000030000000000e269c2
|
||||
RX 6640e3ed
|
||||
RX 040e3c014dfc005545555100000000010000001f000000000000001f000000f06720006c682000f0672000f067200000000000000000006c68200074672000
|
||||
TX 0108004dfc056c68200038
|
||||
RX 0000000900000009000000020000000000e269c26642a534
|
||||
RX 014dfc056c68200038
|
||||
RX 0000003f
|
||||
RX 0000003f0000000300000000
|
||||
RX 00e269c26642d8cd
|
||||
RX 04
|
||||
RX 0e3c014dfc00554555510000000001000000140000000000000014000000a4682000f4682000e0682000e06820000000000000000000f4682000b8672000
|
||||
TX 0108004dfc05f468200038
|
||||
RX 0000000900000009000000020000000000e269c266441bec
|
||||
RX 014dfc05f468200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 6644504f
|
||||
RX 040e3c014dfc005545555100000000020000000800000000000000080000002c6920006c6920002c6920002c69200000000000000000006c6920006c682000
|
||||
TX 0108004dfc056c69200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c2
|
||||
RX 664611cc
|
||||
RX 014dfc056c69200038
|
||||
RX 0000003f
|
||||
RX 0000003f0000000300000000
|
||||
RX 00e269c266464b12
|
||||
RX 04
|
||||
RX 0e3c014dfc00554555510000000002000000060000000000000006000000a4692000d4692000a4692000a46920000000000000000000d4692000f4682000
|
||||
TX 0108004dfc05d469200038
|
||||
RX 00000009000000090000000200000000
|
||||
RX 00e269c266478916
|
||||
RX 01
|
||||
RX 4dfc05d469200038
|
||||
RX 0000003f0000003f00000003
|
||||
RX 0000000000e269c26647be39
|
||||
RX 040e3c014dfc00554555510000000002000000010000000000000001000000100d2000180d2000100d2000100d200000000000000000000c6a20006c692000
|
||||
TX 0108004dfc050c6a200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c2664987ae
|
||||
RX 014dfc050c6a200038
|
||||
RX 0000003f0000003f
|
||||
RX 000000030000000000e269c2
|
||||
RX 6649bc49
|
||||
RX 040e3c014dfc00554555510000000002000000010000000000000001000000180d2000200d2000180d2000180d20000000000000000000446a2000d4692000
|
||||
TX 0108004dfc05446a200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c2664af918
|
||||
RX 014dfc05446a200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 664b2d9b
|
||||
RX 040e3c014dfc005545555100000000020000002000000000000000200000007c6a20007c6b20007c6a20007c6a20000000000000000000903320000c6a2000
|
||||
TX 0108004dfc059033200038
|
||||
RX 0000000900000009000000020000000000e269c2664cf025
|
||||
RX 014dfc059033200038
|
||||
RX 0000003f0000003f
|
||||
RX 000000030000000000e269c2
|
||||
RX 664d236e
|
||||
RX 040e3c014dfc005545555100000000020000000c000000000000000c0000009c732100fc732100ac732100ac7321000000000000000000705b2000446a2000
|
||||
TX 0108004dfc05705b200038
|
||||
RX 0000000900000009000000020000000000e269c2
|
||||
RX 664ee493
|
||||
RX 014dfc05705b200038
|
||||
RX 0000003f0000003f0000000300000000
|
||||
RX 00e269c2664f184e
|
||||
RX 04
|
||||
RX 0e3c014dfc00554555510000000001000000080000000000000008000000fc7321001c74210010742100107421000000000000000000c833200090332000
|
||||
TX 0108004dfc05c833200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c2665059ac
|
||||
RX 014dfc05c833200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 6650912f
|
||||
RX 040e3c014dfc005545555100000000020000001300000000000000130000001c742100b47421001c7421001c7421000000000000000000b4512000705b2000
|
||||
TX 0108004dfc05b451200038
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c266525485
|
||||
RX 014dfc05b451200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 6652883b
|
||||
RX 040e3c014dfc00554555510000000002000000060000000000000006000000b4742100e4742100b4742100b4742100000000000000000094ad2000c8332000
|
||||
TX 0108004dfc0594ad200038
|
||||
RX 000000090000000900000002
|
||||
RX 0000000000e269c26653c77b
|
||||
RX 014dfc0594ad200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 6653fcfb
|
||||
RX 040e3c014dfc00554555510000000001000000080000000000000008000000ccad2000ecad2000ccad2000ccad20000000000000000000ecad2000b4512000
|
||||
TX 0108004dfc05ecad200038
|
||||
RX 0000000900000009
|
||||
RX 000000020000000000e269c2
|
||||
RX 6655bd0f
|
||||
RX 014dfc05ecad200038
|
||||
RX 0000003f
|
||||
RX 0000003f000000030000000000e269c2
|
||||
RX 6655f6b7
|
||||
RX 040e3c014dfc0055455551000000000100000010000000000000001000000024ae200064ae200024ae200024ae200000000000000000009065200094ad2000
|
||||
Socket closed
|
||||
@@ -1,310 +0,0 @@
|
||||
# info heap
|
||||
TX 01011000
|
||||
RX 040e0c010110000900100931010e42
|
||||
TX 07f001
|
||||
EX '[Errno 22] Invalid argument'
|
||||
TX 014dfc057c0c200004
|
||||
RX 040e08014dfc009c0c2000
|
||||
TX 014dfc059c0c200030
|
||||
RX 040e34014dfc00bc0c200020002000106e2100706e21001c02dff600000000000000001800ac67dc0c2000600032001072210010722100
|
||||
TX 014dfc05106e210004
|
||||
RX 040e08014dfc0000000000
|
||||
TX 014dfc05346e210004
|
||||
RX 040e08014dfc003f700000
|
||||
TX 014dfc05586e210004
|
||||
RX 040e08014dfc000e060112
|
||||
TX 014dfc057c6e210004
|
||||
RX 040e08014dfc00fc000e06
|
||||
TX 014dfc05a06e210004
|
||||
RX 040e08014dfc0000000000
|
||||
TX 014dfc05c46e210004
|
||||
RX 040e08014dfc000e425bf2
|
||||
TX 014dfc05e86e210004
|
||||
RX 040e08014dfc0050e4f62a
|
||||
TX 014dfc050c6f210004
|
||||
RX 040e08014dfc0037ff97bb
|
||||
TX 014dfc05306f210004
|
||||
RX 040e08014dfc00506f2100
|
||||
TX 014dfc05546f210004
|
||||
RX 040e08014dfc00b549d45c
|
||||
TX 014dfc05786f210004
|
||||
RX 040e08014dfc0058f0be2b
|
||||
TX 014dfc059c6f210004
|
||||
RX 040e08014dfc00a0903c96
|
||||
TX 014dfc05c06f210004
|
||||
RX 040e08014dfc00e2c5ca58
|
||||
TX 014dfc05e46f210004
|
||||
RX 040e08014dfc00ce7076b6
|
||||
TX 014dfc050870210004
|
||||
RX 040e08014dfc00bb595b16
|
||||
TX 014dfc052c70210004
|
||||
RX 040e08014dfc00169268ea
|
||||
TX 014dfc055070210004
|
||||
RX 040e08014dfc0070702100
|
||||
TX 014dfc057470210004
|
||||
RX 040e08014dfc0027ac3478
|
||||
TX 014dfc059870210004
|
||||
RX 040e08014dfc00a4f59995
|
||||
TX 014dfc05bc70210004
|
||||
RX 040e08014dfc005f841056
|
||||
TX 014dfc05e070210004
|
||||
RX 040e08014dfc00d87169c0
|
||||
TX 014dfc050471210004
|
||||
RX 040e08014dfc007a987779
|
||||
TX 014dfc052871210004
|
||||
RX 040e08014dfc00b66dc568
|
||||
TX 014dfc054c71210004
|
||||
RX 040e08014dfc0019511209
|
||||
TX 014dfc057071210004
|
||||
RX 040e08014dfc0090712100
|
||||
TX 014dfc059471210004
|
||||
RX 040e08014dfc00f34fbf0f
|
||||
TX 014dfc05b871210004
|
||||
RX 040e08014dfc0013e150a9
|
||||
TX 014dfc05dc71210004
|
||||
RX 040e08014dfc008248b026
|
||||
TX 014dfc050072210004
|
||||
RX 040e08014dfc00f604397f
|
||||
TX 014dfc052472210004
|
||||
RX 040e08014dfc002000106e
|
||||
TX 014dfc054872210004
|
||||
RX 040e08014dfc0021001072
|
||||
TX 014dfc056c72210004
|
||||
RX 040e08014dfc00e515f282
|
||||
TX 014dfc05bc0c200030
|
||||
RX 040e34014dfc00dc0c20006000320010722100107221003202924d000000000000000031000dc5ac1921000c010c00d0842100d0842100
|
||||
TX 014dfc051072210004
|
||||
RX 040e08014dfc0070722100
|
||||
TX 014dfc057472210004
|
||||
RX 040e08014dfc00959a9ec8
|
||||
TX 014dfc05d872210004
|
||||
RX 040e08014dfc0030a9ed59
|
||||
TX 014dfc053c73210004
|
||||
RX 040e08014dfc003bbab2b5
|
||||
TX 014dfc05a073210004
|
||||
RX 040e08014dfc0086fd5a51
|
||||
TX 014dfc050474210004
|
||||
RX 040e08014dfc00d50c8a3b
|
||||
TX 014dfc056874210004
|
||||
RX 040e08014dfc0004638b3f
|
||||
TX 014dfc05cc74210004
|
||||
RX 040e08014dfc0030ac8deb
|
||||
TX 014dfc053075210004
|
||||
RX 040e08014dfc0005dee8ca
|
||||
TX 014dfc059475210004
|
||||
RX 040e08014dfc00383cb12b
|
||||
TX 014dfc05f875210004
|
||||
RX 040e08014dfc00712477a2
|
||||
TX 014dfc055c76210004
|
||||
RX 040e08014dfc00042f27e2
|
||||
TX 014dfc05c076210004
|
||||
RX 040e08014dfc0060e84efd
|
||||
TX 014dfc052477210004
|
||||
RX 040e08014dfc00c4ea8546
|
||||
TX 014dfc058877210004
|
||||
RX 040e08014dfc006568c849
|
||||
TX 014dfc05ec77210004
|
||||
RX 040e08014dfc0020f8d1c2
|
||||
TX 014dfc055078210004
|
||||
RX 040e08014dfc0006c1b1bd
|
||||
TX 014dfc05b478210004
|
||||
RX 040e08014dfc00094d843c
|
||||
TX 014dfc051879210004
|
||||
RX 040e08014dfc008e76a50c
|
||||
TX 014dfc057c79210004
|
||||
RX 040e08014dfc00eab79187
|
||||
TX 014dfc05e079210004
|
||||
RX 040e08014dfc00c244eb84
|
||||
TX 014dfc05447a210004
|
||||
RX 040e08014dfc00096bb2fa
|
||||
TX 014dfc05a87a210004
|
||||
RX 040e08014dfc0095ba6e8e
|
||||
TX 014dfc050c7b210004
|
||||
RX 040e08014dfc00c93437cf
|
||||
TX 014dfc05707b210004
|
||||
RX 040e08014dfc00d07b2100
|
||||
TX 014dfc05d47b210004
|
||||
RX 040e08014dfc00aa7e35ec
|
||||
TX 014dfc05387c210004
|
||||
RX 040e08014dfc001427f85b
|
||||
TX 014dfc059c7c210004
|
||||
RX 040e08014dfc0043ec3098
|
||||
TX 014dfc05007d210004
|
||||
RX 040e08014dfc002b962090
|
||||
TX 014dfc05647d210004
|
||||
RX 040e08014dfc00e1e50a13
|
||||
TX 014dfc05c87d210004
|
||||
RX 040e08014dfc00890b643f
|
||||
TX 014dfc052c7e210004
|
||||
RX 040e08014dfc008f1285f5
|
||||
TX 014dfc05907e210004
|
||||
RX 040e08014dfc00992f618e
|
||||
TX 014dfc05f47e210004
|
||||
RX 040e08014dfc00a224eb13
|
||||
TX 014dfc05587f210004
|
||||
RX 040e08014dfc001617b045
|
||||
TX 014dfc05bc7f210004
|
||||
RX 040e08014dfc00c343e48e
|
||||
TX 014dfc052080210004
|
||||
RX 040e08014dfc0059330458
|
||||
TX 014dfc058480210004
|
||||
RX 040e08014dfc006f72bcfd
|
||||
TX 014dfc05e880210004
|
||||
RX 040e08014dfc00b41d6c1a
|
||||
TX 014dfc054c81210004
|
||||
RX 040e08014dfc00c8c49d5e
|
||||
TX 014dfc05b081210004
|
||||
RX 040e08014dfc000a3b3001
|
||||
TX 014dfc051482210004
|
||||
RX 040e08014dfc00d81de738
|
||||
TX 014dfc057882210004
|
||||
RX 040e08014dfc00f687b753
|
||||
TX 014dfc05dc82210004
|
||||
RX 040e08014dfc00d1c2a441
|
||||
TX 014dfc054083210004
|
||||
RX 040e08014dfc001d6a3d74
|
||||
TX 014dfc05a483210004
|
||||
RX 040e08014dfc00eb59e393
|
||||
TX 014dfc050884210004
|
||||
RX 040e08014dfc002bac49b0
|
||||
TX 014dfc056c84210004
|
||||
RX 040e08014dfc00531c7cdb
|
||||
TX 014dfc05d084210004
|
||||
RX 040e08014dfc00e8862100
|
||||
TX 014dfc053485210004
|
||||
RX 040e08014dfc0000000000
|
||||
TX 014dfc05dc0c200030
|
||||
RX 040e34014dfc00ac1921000c010c00d0842100d08421000b01c7f400000000000000000a009ddee562af6e7340e80466ef0ffb070ae8b4
|
||||
TX 014dfc05d084210004
|
||||
RX 040e08014dfc00e8862100
|
||||
TX 014dfc05e085210004
|
||||
RX 040e08014dfc007066626f
|
||||
TX 014dfc05f086210004
|
||||
RX 040e08014dfc0080d97cfe
|
||||
TX 014dfc050088210004
|
||||
RX 040e08014dfc00cc25c8a4
|
||||
TX 014dfc051089210004
|
||||
RX 040e08014dfc0014cf1027
|
||||
TX 014dfc05208a210004
|
||||
RX 040e08014dfc009b023589
|
||||
TX 014dfc05308b210004
|
||||
RX 040e08014dfc003f2478b0
|
||||
TX 014dfc05408c210004
|
||||
RX 040e08014dfc00789c4ff0
|
||||
TX 014dfc05508d210004
|
||||
RX 040e08014dfc001653cd1c
|
||||
TX 014dfc05608e210004
|
||||
RX 040e08014dfc000bf3677b
|
||||
TX 014dfc05708f210004
|
||||
RX 040e08014dfc00127f44bb
|
||||
TX 014dfc058090210004
|
||||
RX 040e08014dfc006abc559f
|
||||
TX 014dfc05ac19210030
|
||||
RX 040e34014dfc00cc1921002c040400609121006091210004000000000000000000000004000000ec1921004404100010a2210010a22100
|
||||
TX 014dfc056091210004
|
||||
RX 040e08014dfc008c952100
|
||||
TX 014dfc059095210004
|
||||
RX 040e08014dfc001939e2d2
|
||||
TX 014dfc05c099210004
|
||||
RX 040e08014dfc0093582076
|
||||
TX 014dfc05f09d210004
|
||||
RX 040e08014dfc00604ad39e
|
||||
TX 014dfc05cc19210030
|
||||
RX 040e34014dfc00ec1921004404100010a2210010a22100100000000000000000000000100000000c1a210008010f0050e6210050e62100
|
||||
TX 014dfc0510a2210004
|
||||
RX 040e08014dfc0054a62100
|
||||
TX 014dfc0558a6210004
|
||||
RX 040e08014dfc0052cdef92
|
||||
TX 014dfc05a0aa210004
|
||||
RX 040e08014dfc0017c2abb7
|
||||
TX 014dfc05e8ae210004
|
||||
RX 040e08014dfc000596b2ce
|
||||
TX 014dfc0530b3210004
|
||||
RX 040e08014dfc005ad23383
|
||||
TX 014dfc0578b7210004
|
||||
RX 040e08014dfc000b251dde
|
||||
TX 014dfc05c0bb210004
|
||||
RX 040e08014dfc009aa77767
|
||||
TX 014dfc0508c0210004
|
||||
RX 040e08014dfc005e949cc9
|
||||
TX 014dfc0550c4210004
|
||||
RX 040e08014dfc00e819e1ac
|
||||
TX 014dfc0598c8210004
|
||||
RX 040e08014dfc00a348e7b5
|
||||
TX 014dfc05e0cc210004
|
||||
RX 040e08014dfc009f139f97
|
||||
TX 014dfc0528d1210004
|
||||
RX 040e08014dfc00fed3ec24
|
||||
TX 014dfc0570d5210004
|
||||
RX 040e08014dfc0088440ccb
|
||||
TX 014dfc05b8d9210004
|
||||
RX 040e08014dfc008bed1d44
|
||||
TX 014dfc0500de210004
|
||||
RX 040e08014dfc00cf7e0977
|
||||
TX 014dfc0548e2210004
|
||||
RX 040e08014dfc00769b88ce
|
||||
TX 014dfc05ec19210030
|
||||
RX 040e34014dfc000c1a210008010f0050e6210050e621000f00000000000000000000000f0000000000000008010f00c8f52100c8f52100
|
||||
TX 014dfc0550e6210004
|
||||
RX 040e08014dfc0058e72100
|
||||
TX 014dfc055ce7210004
|
||||
RX 040e08014dfc00af56f59e
|
||||
TX 014dfc0568e8210004
|
||||
RX 040e08014dfc00e76f973a
|
||||
TX 014dfc0574e9210004
|
||||
RX 040e08014dfc00dee5cb64
|
||||
TX 014dfc0580ea210004
|
||||
RX 040e08014dfc00e4ed9cf9
|
||||
TX 014dfc058ceb210004
|
||||
RX 040e08014dfc0007ee18ae
|
||||
TX 014dfc0598ec210004
|
||||
RX 040e08014dfc00c490cf87
|
||||
TX 014dfc05a4ed210004
|
||||
RX 040e08014dfc000c8f0f7f
|
||||
TX 014dfc05b0ee210004
|
||||
RX 040e08014dfc00f5414004
|
||||
TX 014dfc05bcef210004
|
||||
RX 040e08014dfc00db7f4b5a
|
||||
TX 014dfc05c8f0210004
|
||||
RX 040e08014dfc007dda224f
|
||||
TX 014dfc05d4f1210004
|
||||
RX 040e08014dfc00c1bf8fbf
|
||||
TX 014dfc05e0f2210004
|
||||
RX 040e08014dfc001b97e5ff
|
||||
TX 014dfc05ecf3210004
|
||||
RX 040e08014dfc00c868fa27
|
||||
TX 014dfc05f8f4210004
|
||||
RX 040e08014dfc0013b920ef
|
||||
TX 014dfc050c1a210030
|
||||
RX 040e34014dfc000000000008010f00c8f52100c8f521000f00000000000000000000000f00000000000000000000000000000000000000
|
||||
TX 014dfc05c8f5210004
|
||||
RX 040e08014dfc00d0f62100
|
||||
TX 014dfc05d4f6210004
|
||||
RX 040e08014dfc00bcb62189
|
||||
TX 014dfc05e0f7210004
|
||||
RX 040e08014dfc0075612293
|
||||
TX 014dfc05ecf8210004
|
||||
RX 040e08014dfc00e99a2e01
|
||||
TX 014dfc05f8f9210004
|
||||
RX 040e08014dfc002b2c920c
|
||||
TX 014dfc0504fb210004
|
||||
RX 040e08014dfc009d6ffeb2
|
||||
TX 014dfc0510fc210004
|
||||
RX 040e08014dfc009e978b78
|
||||
TX 014dfc051cfd210004
|
||||
RX 040e08014dfc000a9dde86
|
||||
TX 014dfc0528fe210004
|
||||
RX 040e08014dfc002b8f97a2
|
||||
TX 014dfc0534ff210004
|
||||
RX 040e08014dfc00c03cc4bc
|
||||
TX 014dfc054000220004
|
||||
RX 040e08014dfc0001e7a7e0
|
||||
TX 014dfc054c01220004
|
||||
RX 040e08014dfc0046622e6e
|
||||
TX 014dfc055802220004
|
||||
RX 040e08014dfc00aa83d071
|
||||
TX 014dfc056403220004
|
||||
RX 040e08014dfc00acf9b776
|
||||
TX 014dfc057004220004
|
||||
RX 040e08014dfc008978fab6
|
||||
Socket closed
|
||||
@@ -1,4 +1,3 @@
|
||||
from builtins import object
|
||||
import argparse
|
||||
|
||||
from internalblue.cli import internalblue_cli, _parse_argv
|
||||
@@ -14,7 +13,7 @@ except ImportError:
|
||||
tracedir = os.path.dirname(__file__)
|
||||
|
||||
|
||||
class Fakeargs(object):
|
||||
class Fakeargs():
|
||||
def __init__(self):
|
||||
self.data_directory = None
|
||||
self.verbose = False
|
||||
|
||||
Reference in New Issue
Block a user