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

这篇具有很好参考价值的文章主要介绍了win下使用frida-ios-dump出现FileNotFoundError: [WinError 2] 问题解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

出现FileNotFoundError: [WinError 2]的原因

是因为,使用了

target_dir = './' + PAYLOAD_DIR
        zip_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.com

from __future__ import print_function
from __future__ import unicode_literals
import sys
import codecs

import 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 random

IS_PY2 = sys.version_info[0] < 3

script_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 = None

TEMP_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 = None
    while 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 device


def 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_DIR
        time_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 = baseName
        t.total = size
        t.update(sent - last_sent[0])
        last_sent[0] = 0 if size == sent else sent

    if 'payload' in message:
        payload = message['payload']
        if 'dump' in payload:
            origin_path = payload['path']
            dump_path = payload['dump']

            scp_from = dump_path
            scp_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_path
            scp_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 != 0
    b_is_running = b.pid != 0
    if a_is_running == b_is_running:
        if a.name > b.name:
            return 1
        elif a.name < b.name:
            return -1
        else:
            return 0
    elif a_is_running:
        return -1
    else:
        return 1


def cmp_to_key(mycmp):
    """Convert a cmp= function into a key= function"""

    class K:
        def __init__(self, obj):
            self.obj = obj

        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0

        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0

        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0

        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0

        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0

        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0

    return K


def get_applications(device):
    try:
        applications = device.enumerate_applications()
    except Exception as e:
        sys.exit('Failed to enumerate applications: %s' % e)

    return applications


def 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 = 0
        name_column_width = 0
        identifier_column_width = 0

    header_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 script


def 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 = None
    display_name = ''
    bundle_identifier = ''
    for application in get_applications(device):
        if name_or_bundleid == application.identifier or name_or_bundleid == application.name:
            pid = application.pid
            display_name = application.name
            bundle_identifier = application.identifier

    try:
        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_identifier


def 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 = 0
    ssh = None

    if 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.target
        output_ipa = args.output_ipa
        # update ssh args
        if args.ssh_host:
            Host = args.ssh_host
        if args.ssh_port:
            Port = int(args.ssh_port)
        if args.ssh_user:
            User = args.ssh_user
        if args.ssh_password:
            Password = args.ssh_password
        if args.ssh_key_filename:
            KeyFileName = args.ssh_key_filename

        try:
            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_name
            output_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 = 1
        except paramiko.AuthenticationException as e:
            print(e)
            print('Try specifying -u/--username and/or -P/--password')
            exit_code = 1
        except Exception as e:
            print('*** Caught exception: %s: %s' % (e.__class__, e))
            traceback.print_exc()
            exit_code = 1

    if ssh:
        ssh.close()

    if os.path.exists(PAYLOAD_PATH):
        shutil.rmtree(PAYLOAD_PATH)

    sys.exit(exit_code)

dump.js 以及其他代码没有变动文章来源地址https://www.toymoban.com/news/detail-524755.html

到了这里,关于win下使用frida-ios-dump出现FileNotFoundError: [WinError 2] 问题解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iPhone X(iOS 14.6)在Win 10上使用iRemoval PRO v5.1.2进行越狱

    1.越狱前备份好重要的文件和数据,越狱有风险,刷机需谨慎,后果自负。 2.此处的越狱指不完美越狱,即重启会恢复到未越狱状态,设置锁屏密码也会导致机器强制关机重启并恢复到未越狱状态,重新越狱成功后,之前安装的插件会重新生效,不需要重新安装。 3.iRemoval P

    2024年02月04日
    浏览(43)
  • win11 使用 WSL2 安装 linux 子系统 ubuntu 出现错误:无法解析服务器的名称或地址

    解决方法: 记事本打开 C:WindowsSystem32driversetchosts 文件, 添加如下解析地址 #raw.githubusercontent.com 185.199.108.133 raw.githubusercontent.com 185.199.109.133 raw.githubusercontent.com 185.199.110.133 raw.githubusercontent.com 185.199.111.133 raw.githubusercontent.com ifconfig /flushdns 查看可安装的 WSL wsl --list --onlin

    2024年04月27日
    浏览(69)
  • Android Hook之Frida安装使用

    Frida 是一个动态检测框架,允许开发人员在 Windows、macOS、Linux、iOS 和 Android 上的原生应用程序中注入 JavaScript 或 Python 脚本。该框架可用于操纵应用程序的行为、从中提取信息或与其进行通信。Frida 通常被安全研究人员和渗透测试人员用来对应用程序进行动态分析,并执行钩

    2023年04月19日
    浏览(43)
  • 微信小程序 使用 vant-weapp 组件 van-field 类型为 textarea 在IOS端出现的问题记录

    在 IOS 端 出现 textarea 的 value 出现在最顶层, 上下滚动就消失, 此bug容易引起观感不适 出现该bug的原因 可能 是官方的原生组件的使用限制 微信小程序原生组件的使用限制 提供一个 showKey 布尔值去做限制, wx:if 为 false 时使用 text/text , 为 true 时使用回 van-field type=\\\"textarea\\\"/van-fi

    2024年02月13日
    浏览(67)
  • 在pycharm中使用ffmpeg库报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件 的解决方案

     我在Pycharm中运行  ffmpeg 库 以下代码时出现错误 报错内容为 以上报错主要可以看最后一句: FileNotFoundError: [WinError 2] 系统找不到指定的文件。 在模块安装正确的情况下,应该是电脑本地没有安装 ffmpeg软件 ,可以搜索 Windows下安装ffmpeg的教程,也可以直接参考以下链接:

    2023年04月14日
    浏览(56)
  • 【学习笔记】在Android使用Frida进行https抓包

    最近需要在Android进行https抓包,对数据解密,找了很多方法,终于成功了,不过原文一些步骤对于我这个小白还是有点不理解的地方,在此记录一下。 一台root手机 frida环境 该步骤全程参考: [Frida入门教程] 一文搞定Frida环境搭建,基于逍遥模拟器(虚拟设备)和ADB(Android Debug

    2024年02月16日
    浏览(43)
  • 关于安装win10系统的时候出现的提示,使用其他标明64位的安装光盘。在插入光盘时,将自动重新启动windows安装程序的解决办法。

    更换win10镜像文件,下载就好,win10 下载地址:https://next.itellyou.cn/Original/#cbp=Product?ID=f905b2d9-11e7-4ee3-8b52-407a8befe8d1

    2024年02月11日
    浏览(61)
  • .NET -- 使用Dump文件分析异常

    目录 1. Dump文件 2. 程序崩溃时自动生成Dump文件 2.1 注册表生成 2.2 代码生成 3. 手动生成Dump文件 3.1 任务管理器生成 3.2 VS生成 4. Dump文件调试分析 4.1 简易崩溃测试代码 4.2 VS2022调试 4.3 非本机测试 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

    2024年02月04日
    浏览(34)
  • Java的dump文件分析及JProfiler使用

    从软件开发的角度上,dump文件就是当程序产生异常时,用来记录当时的程序状态信息(例如堆栈的状态),用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 2.1 下载 JProfiler下载: 链接:https://pan.baidu.com/s/1WXCc4FMOC3QQtjkhY4Qeow 提取码:5xrm 版本:JProfiler 12.0.4

    2024年02月06日
    浏览(50)
  • Android Spider App逆向 Frida - 夜神模拟器安装配置 基本使用

    Frida 是一款基于 Python + JavaScript 的 Hook 与调试框架,实现app逆向的强大工具; 模拟器下载安装教程:https://blog.csdn.net/EXIxiaozhou/article/details/127767808 提示:以下是本篇文章正文内容,下面案例可供参考 Frida是一款易用的跨平 Hook 工具, Java 层到 Native 层的 Hook 无所不能,是一种

    2024年01月24日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包