漫川笔记

自动化处理iOS脱壳IPA文件的Python脚本

代码 ·

在iOS砸壳后,经常需要处理IPA文件,或者进行一些定制化的修改。为了简化这个过程,我编写了一个Python脚本,通过该脚本可以轻松地对IPA文件进行解压、处理、再压缩的操作。本文将介绍该脚本的作用、使用方法以及相关的依赖。

代码功能

该Python脚本主要实现了以下功能:

  1. 解压IPA文件:将IPA文件解压缩到指定目录,以便后续处理。
  2. 处理IPA文件:对解压后的文件进行处理,去除指定的文件夹(如Plugins和WatchPlaceholder)。
  3. 重新压缩IPA文件:将处理后的文件夹重新压缩为新的IPA文件。
import os
import shutil
import zipfile
from tqdm import tqdm

def extract_zip(zip_path, extract_dir):
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        total_files = len(zip_ref.infolist())
        extracted_files = 0
        for member in tqdm(zip_ref.infolist(), desc='Extracting', unit='file', total=total_files):
            zip_ref.extract(member, extract_dir)
            extracted_files += 1

def create_zip(source_dir, zip_path):
    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
        total_files = sum(len(files) for _, _, files in os.walk(source_dir))
        added_files = 0
        for foldername, subfolders, filenames in tqdm(os.walk(source_dir), desc='Compressing', unit='file', total=total_files):
            for filename in filenames:
                file_path = os.path.join(foldername, filename)
                arcname = file_path[len(source_dir):].strip(os.path.sep)
                zipf.write(file_path, arcname)
                added_files += 1

def process_ipa(ipa_path):
    extract_dir = os.path.abspath('temp')
    if not os.path.exists(extract_dir):
        os.makedirs(extract_dir)

    extract_zip(ipa_path, extract_dir)
    payload_dir = os.path.join(extract_dir, 'Payload')

    for app_dir_name in os.listdir(payload_dir):
        app_dir = os.path.join(payload_dir, app_dir_name)

        plugins_folder = "PlugIns"
        watch_folder = "com.apple.WatchPlaceholder"

        if os.path.exists(app_dir):
            for folder_name in [plugins_folder, watch_folder]:
                folder_path = os.path.join(app_dir, folder_name)
                shutil.rmtree(folder_path, ignore_errors=True)

        new_ipa_name = ipa_path.replace('.ipa', f'_new.ipa')
        create_zip(extract_dir, new_ipa_name)

    shutil.rmtree(extract_dir)

def get_ipa_files():
    files = os.listdir()
    ipa_files = [file for file in files if file.endswith('.ipa')]
    return ipa_files

def main():
    ipa_files = get_ipa_files()

    if len(ipa_files) == 0:
        print("当前目录下没有找到IPA文件。")
        return

    for ipa_path in ipa_files:
        process_ipa(ipa_path)
        print(f"IPA文件 {ipa_path} 处理完成。")

if __name__ == "__main__":
    main()

脚本将自动处理所有找到的IPA文件,并在处理完成后生成新的IPA文件。

注意事项

请在运行脚本之前备份重要的IPA文件,以防意外情况发生。

修改脚本中的处理逻辑前,请确保理解代码的作用,以免造成不可逆的修改。

结语

通过这个简单的Python脚本,我们能够更方便地对脱壳的IPA文件进行处理。快速删除Plugins和com.apple.WatchPlaceholder