| name | reverser-ios-static |
| description | iOS IPA static analysis — class-dump-z / class-dump-ng, Hopper / IDA / Ghidra for Mach-O ARM64, Objective-C runtime introspection, Swift demangling, App Transport Security check, plist analysis, embedded provisioning profile parse. For dynamic Frida/Objection see mobile/SKILL.md. |
| allowed-tools | Bash Read Write |
| metadata | {"when_to_use":"ios ipa ios app mach-o arm64 class-dump objective-c swift hopper ghidra plist provisioning profile entitlements","subdomain":"reverser","tags":"ios, mach-o, mobile, static-analysis","mitre_attack":"T1518.001"} |
iOS IPA Static Analysis
Acquire the IPA
ipatool download -b com.target.app
frida-ios-dump -o app.ipa "<bundle-id>"
Unpack the IPA
unzip app.ipa -d app/
Quick triage
plutil -p app/Payload/Foo.app/Info.plist
security cms -D -i app/Payload/Foo.app/embedded.mobileprovision | plutil -p -
file app/Payload/Foo.app/Foo
otool -hV app/Payload/Foo.app/Foo
otool -l app/Payload/Foo.app/Foo | grep -A4 LC_ENCRYPTION_INFO
Class-dump (Objective-C metadata)
class-dump-z -H app/Payload/Foo.app/Foo -o headers/
class-dump --arch arm64 -H app/Payload/Foo.app/Foo -o headers/
nm app/Payload/Foo.app/Foo | swift-demangle | head
Headers tell you:
- Class hierarchy (subclasses of NSObject, UIViewController, etc.)
- Method signatures (often reveal business logic intent)
- Properties (often reveal stored data)
- Use of
NSURLSession / NSURLConnection (network) / Security.framework (crypto)
Disassembly
r2 -A app/Payload/Foo.app/Foo
> afl
> s sym._-[FooViewController login:]
> pdf
Things to look for
Hardcoded secrets
strings app/Payload/Foo.app/Foo | grep -iE 'api[._-]?key|secret|token|password|bearer'
strings app/Payload/Foo.app/Foo | grep -iE '^[A-Za-z0-9+/]{40,}={0,2}$'
strings app/Payload/Foo.app/Foo | grep -iE 'sk_live|pk_live|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z\-_]{35}'
URLs / Endpoints
strings app/Payload/Foo.app/Foo | grep -iE 'https?://' | sort -u
Backend / firebase config
find app/Payload/Foo.app -name '*.plist' -exec plutil -p {} \; 2>/dev/null | grep -iE 'google|firebase|amazon|azure|api'
find app/Payload/Foo.app -name 'GoogleService-Info.plist'
Insecure ATS exceptions
plutil -p app/Payload/Foo.app/Info.plist | grep -A20 NSAppTransportSecurity
Insecure file storage
Search the binary for:
NSUserDefaults-stored secrets (no encryption)
kSecAttrAccessibleAlways (keychain item accessible always — no device-lock requirement)
NSFileProtectionNone (file readable when device locked)
URL scheme handlers
plutil -p app/Payload/Foo.app/Info.plist | grep -A4 CFBundleURLSchemes
Embedded JS bridge (WebView, React Native, Cordova)
find app/Payload/Foo.app -name '*.bundle' -o -name 'main.jsbundle'
find app/Payload/Foo.app -name 'cordova.js'
For dynamic analysis
See /skills/standard/mobile/SKILL.md (or /skills/standard/mobile/android/ for the Android counterpart). Use Frida + Objection on a jailbroken device for runtime hooking, SSL pinning bypass, jailbreak detection bypass.
OPSEC
- Static analysis is invisible to the target — analyze offline on a clean VM.
- App Store-acquired IPAs are FairPlay-encrypted — decryption requires a jailbroken device, which leaves an Apple-side fingerprint (don't use your personal Apple ID).
- Symbolicated dSYM files are sometimes shipped to App Store Connect — request from the vendor if you have a bug-bounty relationship.
References
- "iOS Application Security" — David Thiel (NCC Group book)
- OWASP MSTG (Mobile Security Testing Guide) — iOS chapter
- "The Mobile Application Hacker's Handbook"
- iphone-dev-wiki Mach-O / Objective-C runtime references