win下使用frida-ios-dump出现FileNotFoundError: [WinError 2] 问题解决方法

news/2024/11/17 23:43:19/

出现FileNotFoundError: [WinError 2]的原因

是因为,使用了

target_dir = './' + PAYLOAD_DIRzip_args = ('zip', '-qr', os.path.join(os.getcwd(), ipa_filename), target_dir)subprocess.check_call(zip_args, cwd=TEMP_DIR)
 chmod_dir = os.path.join(PAYLOAD_PATH, os.path.basename(dump_path))chmod_args = ('chmod', '655', chmod_dir)try:subprocess.check_call(chmod_args)except subprocess.CalledProcessError as err:print(err)

这两处的代码
使用了 subprocess.check_call 去调用 chmod 和 zip指令 在win上 这两个都是没法这么使用的
所以就需要修改

IPA_PATH = os.path.join(os.getcwd(), ipa_filename)
shutil.make_archive(IPA_PATH, 'zip', os.path.dirname(PAYLOAD_PATH))
os.rename(IPA_PATH + ".zip", IPA_PATH)
TEMP_DIR = tempfile.gettempdir() #这一行修改成一个不需要权限的路径 比如修改成如下路径
TEMP_DIR = "D\\dump\\"

将 chmod的代码可以修改成如下

 chmod_dir = os.path.join(PAYLOAD_PATH, os.path.basename(dump_path))chmod_args = ('chmod', '655', chmod_dir)try:os.chmod(chmod_dir, 0o755)except subprocess.CalledProcessError as err:print(err)

修改 根据时间生成一个不同名称的ipa

time_now = time.strftime("%Y%m%d-%H%M", time.localtime())zip_args = ('zip', '-qr', os.path.join(os.getcwd(), ipa_filename), target_dir)

全部代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-# Author : AloneMonkey
# blog: www.alonemonkey.comfrom __future__ import print_function
from __future__ import unicode_literals
import sys
import codecsimport frida
import threading
import os
import shutil
import time
import argparse
import tempfile
import subprocess
import re
import paramiko
from paramiko import SSHClient
from scp import SCPClient
from tqdm import tqdm
import traceback
import randomIS_PY2 = sys.version_info[0] < 3script_dir = os.path.dirname(os.path.realpath(__file__))DUMP_JS = os.path.join(script_dir, 'dump.js')User = 'root'
Password = 'alpine'
Host = 'localhost'
Port = 22
KeyFileName = NoneTEMP_DIR = "d:\dump\\"
PAYLOAD_DIR = 'Payload'
PAYLOAD_PATH = os.path.join(TEMP_DIR, PAYLOAD_DIR)
file_dict = {}finished = threading.Event()def get_usb_iphone():Type = 'usb'if int(frida.__version__.split('.')[0]) < 12:Type = 'tether'device_manager = frida.get_device_manager()changed = threading.Event()def on_changed():changed.set()device_manager.on('changed', on_changed)device = Nonewhile device is None:devices = [dev for dev in device_manager.enumerate_devices() if dev.type == Type]if len(devices) == 0:print('Waiting for USB device...')changed.wait()else:device = devices[0]device_manager.off('changed', on_changed)return devicedef generate_ipa(path, display_name):ipa_filename = display_name + '.ipa'print('Generating "{}"'.format(ipa_filename))try:app_name = file_dict['app']for key, value in file_dict.items():from_dir = os.path.join(path, key)to_dir = os.path.join(path, app_name, value)if key != 'app':shutil.move(from_dir, to_dir)target_dir = './' + PAYLOAD_DIRtime_now = time.strftime("%Y%m%d-%H%M", time.localtime())zip_args = ('zip', '-qr', os.path.join(os.getcwd(), ipa_filename), target_dir)IPA_PATH = os.path.join(os.getcwd(),  time_now +ipa_filename)shutil.make_archive(IPA_PATH, 'zip', os.path.dirname(PAYLOAD_PATH))os.rename(IPA_PATH + ".zip", IPA_PATH)shutil.rmtree(PAYLOAD_PATH)except FileNotFoundError as e:print(e)finished.set()def on_message(message, data):t = tqdm(unit='B',unit_scale=True,unit_divisor=1024,miniters=1)last_sent = [0]def progress(filename, size, sent):baseName = os.path.basename(filename)if IS_PY2 or isinstance(baseName, bytes):t.desc = baseName.decode("utf-8")else:t.desc = baseNamet.total = sizet.update(sent - last_sent[0])last_sent[0] = 0 if size == sent else sentif 'payload' in message:payload = message['payload']if 'dump' in payload:origin_path = payload['path']dump_path = payload['dump']scp_from = dump_pathscp_to = PAYLOAD_PATH + '/'with SCPClient(ssh.get_transport(), progress = progress, socket_timeout = 60) as scp:scp.get(scp_from, scp_to)chmod_dir = os.path.join(PAYLOAD_PATH, os.path.basename(dump_path))chmod_args = ('chmod', '655', chmod_dir)#print("11111111111111111111111")try:print("222222222222222222")#subprocess.check_call(chmod_args)os.chmod(chmod_dir, 0o755)except subprocess.CalledProcessError as err:print(err)except FileNotFoundError as err:print("3333333333333333")index = origin_path.find('.app/')file_dict[os.path.basename(dump_path)] = origin_path[index + 5:]if 'app' in payload:app_path = payload['app']scp_from = app_pathscp_to = PAYLOAD_PATH + '/'with SCPClient(ssh.get_transport(), progress = progress, socket_timeout = 60) as scp:scp.get(scp_from, scp_to, recursive=True)chmod_dir = os.path.join(PAYLOAD_PATH, os.path.basename(app_path))chmod_args = ('chmod', '755', chmod_dir)try:subprocess.check_call(chmod_args)except FileNotFoundError:chmod_dir = os.path.join(PAYLOAD_PATH, os.path.basename(app_path))os.chmod(chmod_dir,0o655)except subprocess.CalledProcessError as err:print(err)file_dict['app'] = os.path.basename(app_path)if 'done' in payload:finished.set()t.close()def compare_applications(a, b):a_is_running = a.pid != 0b_is_running = b.pid != 0if a_is_running == b_is_running:if a.name > b.name:return 1elif a.name < b.name:return -1else:return 0elif a_is_running:return -1else:return 1def cmp_to_key(mycmp):"""Convert a cmp= function into a key= function"""class K:def __init__(self, obj):self.obj = objdef __lt__(self, other):return mycmp(self.obj, other.obj) < 0def __gt__(self, other):return mycmp(self.obj, other.obj) > 0def __eq__(self, other):return mycmp(self.obj, other.obj) == 0def __le__(self, other):return mycmp(self.obj, other.obj) <= 0def __ge__(self, other):return mycmp(self.obj, other.obj) >= 0def __ne__(self, other):return mycmp(self.obj, other.obj) != 0return Kdef get_applications(device):try:applications = device.enumerate_applications()except Exception as e:sys.exit('Failed to enumerate applications: %s' % e)return applicationsdef list_applications(device):applications = get_applications(device)if len(applications) > 0:pid_column_width = max(map(lambda app: len('{}'.format(app.pid)), applications))name_column_width = max(map(lambda app: len(app.name), applications))identifier_column_width = max(map(lambda app: len(app.identifier), applications))else:pid_column_width = 0name_column_width = 0identifier_column_width = 0header_format = '%' + str(pid_column_width) + 's  ' + '%-' + str(name_column_width) + 's  ' + '%-' + str(identifier_column_width) + 's'print(header_format % ('PID', 'Name', 'Identifier'))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(identifier_column_width) + 's'for application in sorted(applications, key=cmp_to_key(compare_applications)):if application.pid == 0:print(line_format % ('-', application.name, application.identifier))else:print(line_format % (application.pid, application.name, application.identifier))def load_js_file(session, filename):source = ''with codecs.open(filename, 'r', 'utf-8') as f:source = source + f.read()script = session.create_script(source)script.on('message', on_message)script.load()return scriptdef create_dir(path):path = path.strip()path = path.rstrip('\\')if os.path.exists(path):shutil.rmtree(path)try:os.makedirs(path)except os.error as err:print(err)def open_target_app(device, name_or_bundleid):print('Start the target app {}'.format(name_or_bundleid))pid = ''session = Nonedisplay_name = ''bundle_identifier = ''for application in get_applications(device):if name_or_bundleid == application.identifier or name_or_bundleid == application.name:pid = application.piddisplay_name = application.namebundle_identifier = application.identifiertry:if not pid:pid = device.spawn([bundle_identifier])session = device.attach(pid)device.resume(pid)else:session = device.attach(pid)except Exception as e:print(e) return session, display_name, bundle_identifierdef start_dump(session, ipa_name):print('Dumping {} to {}'.format(display_name, TEMP_DIR))script = load_js_file(session, DUMP_JS)script.post('dump')finished.wait()generate_ipa(PAYLOAD_PATH, ipa_name)if session:session.detach()if __name__ == '__main__':parser = argparse.ArgumentParser(description='frida-ios-dump (by AloneMonkey v2.0)')parser.add_argument('-l', '--list', dest='list_applications', action='store_true', help='List the installed apps')parser.add_argument('-o', '--output', dest='output_ipa', help='Specify name of the decrypted IPA')parser.add_argument('-H', '--host', dest='ssh_host', help='Specify SSH hostname')parser.add_argument('-p', '--port', dest='ssh_port', help='Specify SSH port')parser.add_argument('-u', '--user', dest='ssh_user', help='Specify SSH username')parser.add_argument('-P', '--password', dest='ssh_password', help='Specify SSH password')parser.add_argument('-K', '--key_filename', dest='ssh_key_filename', help='Specify SSH private key file path')parser.add_argument('target', nargs='?', help='Bundle identifier or display name of the target app')args = parser.parse_args()exit_code = 0ssh = Noneif not len(sys.argv[1:]):parser.print_help()sys.exit(exit_code)device = get_usb_iphone()if args.list_applications:list_applications(device)else:name_or_bundleid = args.targetoutput_ipa = args.output_ipa# update ssh argsif args.ssh_host:Host = args.ssh_hostif args.ssh_port:Port = int(args.ssh_port)if args.ssh_user:User = args.ssh_userif args.ssh_password:Password = args.ssh_passwordif args.ssh_key_filename:KeyFileName = args.ssh_key_filenametry:ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(Host, port=Port, username=User, password=Password, key_filename=KeyFileName)create_dir(PAYLOAD_PATH)(session, display_name, bundle_identifier) = open_target_app(device, name_or_bundleid)if output_ipa is None:output_ipa = display_nameoutput_ipa = re.sub('\.ipa$', '', output_ipa)if session:start_dump(session, output_ipa)except paramiko.ssh_exception.NoValidConnectionsError as e:print(e)print('Try specifying -H/--hostname and/or -p/--port')exit_code = 1except paramiko.AuthenticationException as e:print(e)print('Try specifying -u/--username and/or -P/--password')exit_code = 1except Exception as e:print('*** Caught exception: %s: %s' % (e.__class__, e))traceback.print_exc()exit_code = 1if ssh:ssh.close()if os.path.exists(PAYLOAD_PATH):shutil.rmtree(PAYLOAD_PATH)sys.exit(exit_code)

dump.js 以及其他代码没有变动


http://www.ppmy.cn/news/694668.html

相关文章

谈谈supreme潮牌的历史

Supreme潮牌的历史可以追溯到1994年&#xff0c;当时由James Jebbia创立于纽约曼哈顿的SOHO地区。它最初被认为是一个滑板和街头文化的品牌&#xff0c;但现在它已经成为一个国际知名的潮流品牌&#xff0c;拥有各种服装和配饰。Supreme的产品一直以其时尚性和质量而闻名&#…

Misc 图片中的图片

记录菜鸡生活的第二天02 题目叫图片中的图片&#xff0c;自己估摸着图片隐藏&#xff1f; 首先下载文件是一张图片&#xff0c; 扔进kali里面binwalk一下&#xff0c;发现有东西 分离出一个rar文件&#xff0c;打开有个加密文件emmmmm 难道是要暴力破解&#xff0c;试了一下…

SuperMap 地图裁剪

在使用SuperMap iDesktop9D进行地图制作时&#xff0c;有时候我们需要的数据是这幅地图的某个地方&#xff0c;那我们不想重新制作&#xff0c;那怎么办&#xff1f;这是我们就用到了地图裁剪。如图就是一幅完整的地图&#xff1a; 那么&#xff0c;现在我并不需要整一个地图的…

SuperMap 地图

SuperMap 地图 地理坐标系统&#xff1a;地理坐标系&#xff08;Geographic coordinate system&#xff0c;简称 GCS&#xff09;用来描述地球表面三维地物位置&#xff0c;地物的具体位置由它的经纬度坐标确定。一个地理坐标系统包括对经纬度坐标单位&#xff0c;本初子午线以…

HTML滚动背景图片视觉差特效——jquery.imageScroll.js

一、个人案例效果图 二、代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"css/default.css"><link rel"…

super-smack

我有个办法&#xff0c;不过不是用LR&#xff0c;是用super-smack&#xff0c;如果只对数据库进行抗压力测试&#xff0c;应该管用。 Super-smack 现在是1.3版&#xff0c;源码下载地址如下&#xff1a; http://vegan.net/tony/supersmack/super-smack-1.3.tar.gz 以下是在linu…