iOS apps and Mach-O binaries — Objective-C headers, Swift types, entitlements and the whole bundle.
The Payload/<Name>.app bundle is extracted and its binary Info.plist converted to JSON.
Architectures, linked libraries, entitlements and the FairPlay encryption flag, straight from the header.
Objective-C headers reconstructed from runtime metadata, plus a demangled Swift type listing.
headers/ — one Objective-C header per class, protocol and category, reconstructed from the binary's runtime metadata.swift/ — a demangled listing of the app's Swift types, fields and method signatures.app/ — the complete app bundle: nibs, compiled storyboards, Assets.car, localisations, embedded frameworks and app extensions.info/Info.plist.json — the binary property list converted to readable JSON: bundle identifier, version, URL schemes, ATS configuration, required capabilities.info/entitlements.plist — the entitlements the app was signed for, read out of its code signature.info/macho.txt — every architecture slice, its load commands, the libraries it links and whether it is encrypted.info/frameworks.txt — embedded frameworks, app extensions and companion watch apps.Objective-C recovers well. The Objective-C runtime resolves classes and selectors while the app is running, so the binary has to carry the full description of every class: its name, superclass, protocols, instance variables, properties and the type encoding of every method. A class dump reads that metadata back and writes out header files close to the ones the developer wrote.
Swift recovers partially. Swift resolves most calls at compile time, so there is no equivalent runtime table. What is left is type metadata and mangled symbol names, which demangle into type declarations, stored properties and method signatures. You get the shape of the code, not its interface documentation.
Method bodies are not recovered in either language. They are compiled ARM64 machine code. Reading them means disassembly, which is a different job from a class dump — but the headers tell you what to disassemble and where.
Everything outside the binary recovers completely. The Info.plist, entitlements, URL schemes, App Transport Security exceptions, the frameworks and SDKs the app links, its asset catalogue and its interface files are all plain data, and are often the reason for opening an app in the first place.
This is the one limit worth understanding before you upload. Apple applies FairPlay encryption to every binary distributed through the App Store: the executable's code is encrypted, and the key belongs to the device that downloaded it, not to the file. The Mach-O header records this in LC_ENCRYPTION_INFO as cryptid = 1.
Decrypting it means dumping the app's memory while it runs on a jailbroken device. That is out of scope here and is not attempted. The flag is read and reported instead, because a class dump of encrypted bytes does not fail — it quietly returns a handful of meaningless classes, which is far worse than being told why.
Binaries that are not encrypted, and analyse completely:
Either way the app/ and info/ output is produced, so an encrypted upload is never a wasted one.
You do not need the whole archive. The app executable on its own, a .dylib, or a framework binary pulled out of Frameworks/ is recognised from its header rather than its name — which matters, because an iOS app's executable has no extension at all.
Universal ("fat") binaries hold several architectures in one file. The arm64 slice is the one analysed, since that is what every current device runs; the others are still described in info/macho.txt.
An iOS application archive: a zip containing a single Payload/<Name>.app folder. Inside it are the Mach-O executable, the Info.plist, the provisioning profile, embedded frameworks and every compiled resource the app ships with.
Xcode compiles it to Apple's binary property list format. It is converted back to JSON here, so info/Info.plist.json is readable without any Apple tooling.
Upload it. info/macho.txt reports the cryptid value for every slice, and the notes explain what it means for that particular file.
It is the same intent with a very different ceiling. Android ships DEX bytecode, which decompiles back to readable Java. iOS ships native machine code, so what comes back is the app's interface — classes, methods, types — rather than its statements. For Android, use the APK decompiler.
No. The archive is unpacked and the binary is read as data. Nothing in it is ever run, loaded or mapped.