Skip to content

blacktop/ipsw-py

Repository files navigation

ipsw-py

ipsw SDK for Python 🚧

PyPI - Downloads


NOTE: This is a work in progress ⚠️

Getting Started

Start the ipsw daemon:

macOS

brew install blacktop/tap/ipswd
brew services start blacktop/tap/ipswd

Linux

⚠️ UNTESTED ⚠️

sudo snap install ipswd

Docker

docker run -d -p 3993:3993 -v `pwd`:/data blacktop/ipswd start

Installing

The latest stable version is available on PyPI. Either add ipsw to your requirements.txt file or install with pip:

pip install ipsw

Geting Started

Get IPSW info

import ipsw

client = ipsw.IpswClient(base_url='tcp://127.0.0.1:3993')

info = client.info.get("iPhone15,2_16.5_20F5028e_Restore.ipsw")
print(f'{info.version} ({info.build})')
for device in info.devices:
    print(f'- {device}')
16.5 (20F5028e)
- iPhone 14 Pro

Get DSC info

import ipsw

client = ipsw.IpswClient(base_url='tcp://127.0.0.1:3993')

dsc = client.dsc.open("20F5028e__iPhone15,2/dyld_shared_cache_arm64e")
print(dsc)
print(dsc.dylibs[0])
<DSC: '(dyld_v1  arm64e) - iOS - FAEC7714-4CCD-3B99-B18F-F5EAB60DE31E'>
{
  "index": 1,
  "name": "/usr/lib/libobjc.A.dylib",
  "version": "876.0.0.0.0",
  "uuid": "085A190C-6214-38EA-ACCB-428C3E8AFA65",
  "load_address": 6443204608
}

Get dylib inside DSC info

libswiftCore = dsc.dylib("libswiftCore.dylib")
print(libswiftCore)
<Dylib: '64-bit MachO AARCH64 (ARM64e)'>

Get DSC symbol addresses

syms = dsc.sym_addrs([{'pattern': '.*zero.*', 'image': 'libsystem_c.dylib'}])
print(syms)

Convert between DSC offsets and addresses

off = dsc.a2o(7624591060)
adr = dsc.o2a(61146836)

Lookup DSC symbol by address

print(next(dsc.a2s([7624591060])))
{
  "address": 7624591060,
  "symbol": "__exit",
  "demanged": "__exit",
  "mapping": "__TEXT",
  "uuid": "3AB55994-1201-3908-BE27-52BB7EFA7573",
  "ext": ".21",
  "image": "/usr/lib/system/libsystem_kernel.dylib",
  "section": "__text",
  "segment": "__TEXT"
}

Get MachO info

import ipsw

client = ipsw.IpswClient(base_url='tcp://127.0.0.1:3993')

macho = client.macho.open("/bin/ls", arch="arm64e")
print(macho)
<Macho: '64-bit MachO AARCH64 (ARM64e)'>

Community

You have questions, need support and or just want to talk about ipsw-py?

Here are ways to get in touch with the ipsw-py community:

Join Discord Follow Twitter Follow Mastodon GitHub Discussions

License

MIT Copyright (c) 2023 blacktop