From 531602a395b8c087ff6e920aaa4bccc21c01bcc9 Mon Sep 17 00:00:00 2001 From: Giulio Date: Mon, 21 Dec 2020 14:58:02 +0100 Subject: [PATCH] Improved client; added recusrive fs functions --- client.py | 102 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/client.py b/client.py index e472075..f494a2e 100644 --- a/client.py +++ b/client.py @@ -1,29 +1,109 @@ from adb import adb_commands from adb import sign_m2crypto +import stat import sys +import os +import time +import json -queue = list() +port = '/dev/ttyS3,115200' -# Connect to the device -device = adb_commands.AdbCommands() -# XCB over wifi -#device.ConnectDevice(port_path=None, serial="192.168.43.168:5555") -# XCB over serial port -device.ConnectDevice(port_path=None, serial="/dev/ttyS11,115200") +def init_device(addr): + device = adb_commands.AdbCommands() + device.ConnectDevice(port_path=None, serial=addr) + #device.ConnectDevice(port_path=None, serial="192.168.43.168:5555") + #device.ConnectDevice(port_path=None, serial="/dev/ttyS4,115200") + return device +def scandir(path, device): + files = [] + directories = [] + unknowns = [] + result = device.List(path) + for i in result[2:]: + if stat.S_ISDIR(i[1]): + directories.append(i[0]) + if stat.S_ISREG(i[1]) and ((i[1] & stat.S_IRUSR) or (i[1] & stat.S_IRGRP) or (i[1] & stat.S_IROTH)): + files.append(i[0]) + else: + unknowns.append(i[0]) + return files, directories, unknowns +def tree(path, device): + exclude = ["proc", "sys", "dev"] + all_files = [] + all_directories = [] + all_unknowns = [] + queue = [] + current = path + while True: + files, directories, unknowns = scandir(current, device) + for file in files: + all_files.append(current + file.decode('utf-8')) + for directory in directories: + all_directories.append(current + directory.decode('utf-8') + '/') + if directory.decode('utf-8') not in exclude: + queue.append(current + directory.decode('utf-8') + '/') + if not queue: + break + current = queue.pop() + #print(current) + + return all_files, all_directories, all_unknowns + +device = init_device(port) if sys.argv[1] == 'ls': root = device.List(sys.argv[2]) for i in root: print(i[0].decode('utf-8') + ' Perm: ' + str(oct(i[1])) + ' Size: ' + str(i[2])) -if sys.argv[1] == 'download': +if sys.argv[1] == 'pull': root = device.Pull(sys.argv[2], sys.argv[2].replace('/', '_')) print(root) -if sys.argv[1] == 'upload': +if sys.argv[1] == 'push': root = device.Push(sys.argv[2], sys.argv[3]) - #root = device.Push(sys.argv[2], "/opt/testbin") - print(root) + +if sys.argv[1] == 'logcat': + logcat = device.Logcat() + print(logcat) + +if sys.argv[1] == 'forward': + print("For port forwarding (ie: for gdbserver) use the original XCB client. xcb.exe connect com:COM12; xcb.exe forward tcp:2020 tcp:2020") + print("The protocol for port forwarding should be ADB compatible. However python-adb doesn't support it as of now") + +if sys.argv[1] == 'dump': + name = sys.argv[2] + print("[+] Listing everything") + all_files, all_directories, all_unknowns = tree('/', device) + print("[+] Creating local structure") + target = "dumps/" + name + '/' + if not os.path.isdir(target): + os.mkdir(target) + for dir in all_directories: + if not os.path.isdir(target + dir): + os.mkdir(target + dir) + print("[+] Pulling all files") + for file in all_files: + if not os.path.isfile(target + file): + time.sleep(1) + try: + device.Pull(file, target + file) + print("[+] Downloading " + file) + except: + print("[-] Failed downloading " + file) + os.remove(target + file) + # This sucks but... + device = None + time.sleep(5) + device = init_device(port) + print("[+] Saving lists") + with open(target + 'files.txt', 'w') as f: + f.write(json.dumps(all_files)) + with open(target + 'directories.txt', 'w') as f: + f.write(json.dumps(all_directories)) + with open(target + 'unknowns.txt', 'w') as f: + f.write(json.dumps(all_unknowns)) +