[fix] add python 3.x version

This commit is contained in:
AloneMonkey 2018-03-19 11:04:02 +08:00
parent 5a1992b52f
commit 4598333a18
2 changed files with 28 additions and 28 deletions

View File

@ -5,8 +5,9 @@ Pull a decrypted IPA from a jailbroken device
1. Install [frida](http://www.frida.re/) on device 1. Install [frida](http://www.frida.re/) on device
2. `sudo pip install -r requirements.txt --upgrade` (Python 2.7) 2. `sudo pip install -r requirements.txt --upgrade` (Python 2.7)
3. Run usbmuxd/iproxy SSH forwarding over USB (Default 2222 -> 22). e.g. `iproxy 2222 22` 3. `sudo pip3 install -r requirements.txt --upgrade` (Python 3.x)
4. Run ./dump.py `Display name` or `Bundle identifier` 4. Run usbmuxd/iproxy SSH forwarding over USB (Default 2222 -> 22). e.g. `iproxy 2222 22`
5. Run ./dump.py `Display name` or `Bundle identifier`
For SSH/SCP make sure you have your public key added to the target device's ~/.ssh/authorized_keys file. For SSH/SCP make sure you have your public key added to the target device's ~/.ssh/authorized_keys file.

51
dump.py
View File

@ -22,9 +22,6 @@ from scp import SCPClient
from tqdm import tqdm from tqdm import tqdm
import traceback import traceback
reload(sys)
sys.setdefaultencoding('utf8')
script_dir = os.path.dirname(os.path.realpath(__file__)) script_dir = os.path.dirname(os.path.realpath(__file__))
DUMP_JS = os.path.join(script_dir, 'dump.js') DUMP_JS = os.path.join(script_dir, 'dump.js')
@ -55,7 +52,7 @@ def get_usb_iphone():
while device is None: while device is None:
devices = [dev for dev in device_manager.enumerate_devices() if dev.type == 'tether'] devices = [dev for dev in device_manager.enumerate_devices() if dev.type == 'tether']
if len(devices) == 0: if len(devices) == 0:
print 'Waiting for USB device...' print('Waiting for USB device...')
changed.wait() changed.wait()
else: else:
device = devices[0] device = devices[0]
@ -68,7 +65,7 @@ def get_usb_iphone():
def generate_ipa(path, display_name): def generate_ipa(path, display_name):
ipa_filename = display_name + '.ipa' ipa_filename = display_name + '.ipa'
print 'Generating "{}"'.format(ipa_filename) print('Generating "{}"'.format(ipa_filename))
try: try:
app_name = file_dict['app'] app_name = file_dict['app']
@ -82,9 +79,8 @@ def generate_ipa(path, display_name):
zip_args = ('zip', '-qr', os.path.join(os.getcwd(), ipa_filename), target_dir) zip_args = ('zip', '-qr', os.path.join(os.getcwd(), ipa_filename), target_dir)
subprocess.check_call(zip_args, cwd=TEMP_DIR) subprocess.check_call(zip_args, cwd=TEMP_DIR)
shutil.rmtree(PAYLOAD_PATH) shutil.rmtree(PAYLOAD_PATH)
print
except Exception as e: except Exception as e:
print e print(e)
finished.set() finished.set()
def on_message(message, data): def on_message(message, data):
@ -92,7 +88,7 @@ def on_message(message, data):
last_sent = [0] last_sent = [0]
def progress(filename, size, sent): def progress(filename, size, sent):
t.desc = os.path.basename(filename) t.desc = os.path.basename(filename).decode("utf-8")
t.total = size t.total = size
t.update(sent - last_sent[0]) t.update(sent - last_sent[0])
last_sent[0] = 0 if size == sent else sent last_sent[0] = 0 if size == sent else sent
@ -104,7 +100,7 @@ def on_message(message, data):
dump_path = payload['dump'] dump_path = payload['dump']
scp_from = dump_path scp_from = dump_path
scp_to = PAYLOAD_PATH + u'/' scp_to = PAYLOAD_PATH + '/'
with SCPClient(ssh.get_transport(), progress = progress, socket_timeout = 60) as scp: with SCPClient(ssh.get_transport(), progress = progress, socket_timeout = 60) as scp:
scp.get(scp_from, scp_to) scp.get(scp_from, scp_to)
@ -114,7 +110,7 @@ def on_message(message, data):
try: try:
subprocess.check_call(chmod_args) subprocess.check_call(chmod_args)
except subprocess.CalledProcessError as err: except subprocess.CalledProcessError as err:
print err print(err)
index = origin_path.find('.app/') index = origin_path.find('.app/')
file_dict[os.path.basename(dump_path)] = origin_path[index + 5:] file_dict[os.path.basename(dump_path)] = origin_path[index + 5:]
@ -123,7 +119,7 @@ def on_message(message, data):
app_path = payload['app'] app_path = payload['app']
scp_from = app_path scp_from = app_path
scp_to = PAYLOAD_PATH + u'/' scp_to = PAYLOAD_PATH + '/'
with SCPClient(ssh.get_transport(), progress = progress, socket_timeout = 60) as scp: with SCPClient(ssh.get_transport(), progress = progress, socket_timeout = 60) as scp:
scp.get(scp_from, scp_to, recursive=True) scp.get(scp_from, scp_to, recursive=True)
@ -132,7 +128,7 @@ def on_message(message, data):
try: try:
subprocess.check_call(chmod_args) subprocess.check_call(chmod_args)
except subprocess.CalledProcessError as err: except subprocess.CalledProcessError as err:
print err print(err)
file_dict['app'] = os.path.basename(app_path) file_dict['app'] = os.path.basename(app_path)
@ -188,7 +184,7 @@ def get_applications(device):
try: try:
applications = device.enumerate_applications() applications = device.enumerate_applications()
except Exception as e: except Exception as e:
print 'Failed to enumerate applications: %s' % e print('Failed to enumerate applications: %s' % e)
return return
return applications return applications
@ -208,15 +204,15 @@ def list_applications(device):
header_format = '%' + str(pid_column_width) + 's ' + '%-' + str(name_column_width) + 's ' + '%-' + str( header_format = '%' + str(pid_column_width) + 's ' + '%-' + str(name_column_width) + 's ' + '%-' + str(
identifier_column_width) + 's' identifier_column_width) + 's'
print header_format % ('PID', 'Name', 'Identifier') print(header_format % ('PID', 'Name', 'Identifier'))
print '%s %s %s' % (pid_column_width * '-', name_column_width * '-', identifier_column_width * '-') print('%s %s %s' % (pid_column_width * '-', name_column_width * '-', identifier_column_width * '-'))
line_format = '%' + str(pid_column_width) + 's ' + '%-' + str(name_column_width) + 's ' + '%-' + str( line_format = '%' + str(pid_column_width) + 's ' + '%-' + str(name_column_width) + 's ' + '%-' + str(
identifier_column_width) + 's' identifier_column_width) + 's'
for application in sorted(applications, key=cmp_to_key(compare_applications)): for application in sorted(applications, key=cmp_to_key(compare_applications)):
if application.pid == 0: if application.pid == 0:
print line_format % ('-', application.name, application.identifier) print(line_format % ('-', application.name, application.identifier))
else: else:
print line_format % (application.pid, application.name, application.identifier) print(line_format % (application.pid, application.name, application.identifier))
def load_js_file(session, filename): def load_js_file(session, filename):
@ -238,11 +234,11 @@ def create_dir(path):
try: try:
os.makedirs(path) os.makedirs(path)
except os.error as err: except os.error as err:
print err print(err)
def open_target_app(device, name_or_bundleid): def open_target_app(device, name_or_bundleid):
print 'Start the target app {}'.format(name_or_bundleid) print('Start the target app {}'.format(name_or_bundleid))
pid = '' pid = ''
session = None session = None
@ -262,13 +258,13 @@ def open_target_app(device, name_or_bundleid):
else: else:
session = device.attach(pid) session = device.attach(pid)
except Exception as e: except Exception as e:
print e print(e)
return session, display_name, bundle_identifier return session, display_name, bundle_identifier
def start_dump(session, ipa_name): def start_dump(session, ipa_name):
print 'Dumping {} to {}'.format(display_name, TEMP_DIR) print('Dumping {} to {}'.format(display_name, TEMP_DIR))
script = load_js_file(session, DUMP_JS) script = load_js_file(session, DUMP_JS)
script.post('dump') script.post('dump')
@ -289,11 +285,14 @@ if __name__ == '__main__':
exit_code = 0 exit_code = 0
ssh = None ssh = None
if not len(sys.argv[1:]):
parser.print_help()
sys.exit(exit_code)
device = get_usb_iphone() device = get_usb_iphone()
if len(sys.argv[1:]) == 0: if args.list_applications:
parser.print_help()
elif args.list_applications:
list_applications(device) list_applications(device)
else: else:
name_or_bundleid = args.target name_or_bundleid = args.target
@ -312,10 +311,10 @@ if __name__ == '__main__':
if session: if session:
start_dump(session, output_ipa) start_dump(session, output_ipa)
except paramiko.ssh_exception.NoValidConnectionsError as e: except paramiko.ssh_exception.NoValidConnectionsError as e:
print e print(e)
exit_code = 1 exit_code = 1
except paramiko.AuthenticationException as e: except paramiko.AuthenticationException as e:
print e print(e)
exit_code = 1 exit_code = 1
except Exception as e: except Exception as e:
print('*** Caught exception: %s: %s' % (e.__class__, e)) print('*** Caught exception: %s: %s' % (e.__class__, e))