mobile-recon
Skill37 starsChanged 3 months agoMITView on GitHub
Load when mapping a mobile app attack surface before hunting starts, covering which recon tools to run per platform, the iOS and Android surface JSON contracts, Hermes bundle extraction for React Native apps, and ranking areas by signal density.
In this repository9 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- android-analysisSkill
- binary-reversingSkill
- ios-analysisSkill
- mobile-huntingSkill
- mobile-vuln-classesSkill
- report-writingSkill
- sdk-analysisSkill
- triage-validationSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 3 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 22
After extraction and decryption, map the .app bundle:
- Very specific: line 46
Run these tools and record results to recon/<target>/:
- Very specific: line 99
After apktool + jadx extraction, map:
- Distinctive: line 149
Run these regardless of platform:
- Very specific: line 190
If analysis.binary_analyzer is configured, run headless analysis:
- Distinctive: line 212
After all tools complete, rank areas for hunters by signal density:
- Distinctive: line 232
Before starting recon, verify:
- Very specific: line 244
All recon outputs go to recon/<target>/ as JSON files.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Mobile Recon: Attack Surface Mapping
This skill defines the methodology for static reconnaissance of mobile applications. It is loaded by /scope, /acquire, and /recon commands and used by the scope agent, acquisition agent, and orchestrator during the RECON phase.
Objective
Map every entry point, configuration surface, and embedded asset in the target app. Recon does NOT hunt for vulnerabilities; it catalogs what exists so hunters can prioritize.
iOS Recon Workflow
1. Structure Mapping
After extraction and decryption, map the .app bundle:
Payload/
AppName.app/
AppName ← main executable (Mach-O)
Info.plist ← app configuration
embedded.mobileprovision
Frameworks/ ← embedded frameworks/dylibs
PlugIns/ ← app extensions (widgets, share, etc.)
Assets.car ← compiled asset catalog
*.storyboardc ← compiled storyboards
*.momd ← Core Data models
*.lproj/ ← localization bundlesKey files to inventory:
- Main executable and all embedded framework binaries
Info.plist(app config, URL schemes, ATS, permissions)embedded.mobileprovision(entitlements, team ID)- Any
.plist,.json,.xml,.db,.sqlitefiles in the bundle
2. Entry Point Extraction
Run these tools and record results to recon/<target>/:
| Tool | What It Maps | Output Key |
url_scheme_extractor.py | Custom URL schemes, universal links, app extensions | ios_entry_points |
entitlements_extractor.py | Entitlements, app groups, capabilities | ios_entitlements |
info_plist_analyzer.py | ATS config, permissions, background modes | ios_plist_config |
framework_scanner.py | Embedded frameworks, SDK inventory | ios_frameworks |
3. Binary Surface
| Tool | What It Maps | Output Key |
string_extractor.py | URLs, endpoints, keys, interesting strings | ios_strings |
keychain_usage_analyzer.py | Keychain API patterns, protection levels | ios_keychain |
swift_metadata_parser.py | Swift types, class hierarchy, protocols | ios_swift_metadata |
4. Aggregate iOS Surface
Combine outputs into recon/<target>/ios_surface.json:
{
"entry_points": {
"url_schemes": ["myapp://", "myapp-auth://"],
"universal_links": ["applinks:example.com"],
"app_extensions": ["ShareExtension", "WidgetExtension"],
"background_modes": ["fetch", "remote-notification"]
},
"config_surface": {
"ats_status": "exceptions_present",
"ats_exceptions": ["api.example.com"],
"permissions_requested": ["camera", "location-always", "contacts"],
"dangerous_entitlements": []
},
"binary_surface": {
"frameworks_count": 12,
"debug_frameworks": [],
"sdk_inventory": [{"name": "Firebase", "version": "10.x"}],
"crypto_apis_used": ["CCCrypt", "SecKeyCreateEncryptedData"],
"keychain_protection_levels": ["kSecAttrAccessibleWhenUnlocked"],
"endpoints_found": 34,
"secrets_flagged": 2
}
}Android Recon Workflow
1. Structure Mapping
After apktool + jadx extraction, map:
extracted/
apktool/
AndroidManifest.xml ← decoded manifest (readable XML)
res/ ← decoded resources
assets/ ← raw assets
smali/ ← Dalvik bytecode
lib/ ← native libraries (.so)
arm64-v8a/
armeabi-v7a/
jadx/
sources/ ← decompiled Java source
resources/ ← resource filesKey files to inventory:
AndroidManifest.xml(components, permissions, intent filters, SDK versions)- All
.sofiles inlib/(native libraries to reverse) res/xml/network_security_config.xml(if present)- Any
.json,.xml,.db,.propertiesfiles inassets/
2. Component & Configuration Extraction
| Tool | What It Maps | Output Key |
manifest_analyzer.py | Security flags, SDK versions, permissions | android_manifest |
component_extractor.py | Activities, services, receivers, providers + export status | android_components |
intent_filter_analyzer.py | Intent filters, deep links, app links | android_intents |
network_security_config.py | Cleartext policy, pinning, CA trust | android_network_config |
3. Source & Binary Surface
| Tool | What It Maps | Output Key |
webview_analyzer.py | WebView configs, JS bridges, file access | android_webviews |
content_provider_scanner.py | Provider queries, SQL patterns, file paths | android_providers |
shared_prefs_analyzer.py | SharedPrefs usage, modes, sensitive data | android_storage |
string_extractor.py | URLs, keys, secrets in decompiled source | android_strings |
dex_class_analyzer.py | Class inventory by security relevance | android_classes |
4. Aggregate Android Surface
Combine into recon/<target>/android_surface.json following the same pattern as iOS.
Cross-Platform Recon
Run these regardless of platform:
| Tool | Purpose |
secret_scanner.py | Regex-based secret detection (AWS, Firebase, Stripe, etc.) |
cert_pinning_detector.py | Certificate pinning implementation detection |
crypto_analyzer.py | Cryptographic API usage and weakness detection |
api_endpoint_extractor.py | API URL and endpoint extraction |
sdk_fingerprinter.py | Third-party SDK identification and version extraction |
hermes_extractor.py | Parse Hermes bytecode bundles (main.jsbundle on iOS, assets/index.android.bundle on Android) and emit one clean string per string-table entry. Required for React Native / Hermes apps; strings(1) and hbctool both fail on HBC v96. |
React Native / Hermes Bundles
React Native apps with the Hermes engine ship a compiled bytecode bundle (magic bytes c6 1f bc 03). For these apps, the JavaScript business logic is in the bundle, not the native binary. Detect and extract first, then feed the extracted strings to secret_scanner.py and api_endpoint_extractor.py.
# Detect: check the magic bytes of main.jsbundle or index.android.bundle
python3 -c "import sys; print('hermes' if open(sys.argv[1],'rb').read(4) == b'\\xc6\\x1f\\xbc\\x03' else 'plain_js')" <bundle>
# Extract strings (one per line, one per string-table entry)
python3 tools/analysis/shared/hermes_extractor.py \
--bundle workspace/<target>/ios/extracted/Payload/<App>.app/main.jsbundle \
--out workspace/<target>/hermes/ios_strings.txt
python3 tools/analysis/shared/hermes_extractor.py \
--bundle workspace/<target>/android/extracted/apktool/assets/index.android.bundle \
--out workspace/<target>/hermes/android_strings.txt
# Scan the extracted strings for secrets and endpoints
python3 tools/analysis/shared/secret_scanner.py --path workspace/<target>/hermes/ios_strings.txt
grep -a '^https\?://' workspace/<target>/hermes/ios_strings.txt | sort -uhermes_extractor.py supports --json for structured output including the parsed HBC header fields. Hermes apps are identified during acquisition; if the acquisition report lists a js_bundle of format hermes_bytecode, the hunters must consult the extracted strings file rather than (or in addition to) the native binary.
Binary Analysis (Optional, Ghidra/BN)
If analysis.binary_analyzer is configured, run headless analysis:
# iOS: analyze the decrypted main executable
bash tools/binary_analysis/ghidra_analyze.sh \
--binary <decrypted_exec> --platform ios --output recon/<target>/
# Android: analyze each .so in lib/
bash tools/binary_analysis/ghidra_analyze.sh \
--binary <native.so> --platform android --output recon/<target>/Then classify functions:
python3 tools/binary_analysis/function_classifier.py \
--results recon/<target>/*_ghidra_results.json --output recon/<target>/Attack Surface Prioritization
After all tools complete, rank areas for hunters by signal density:
| Signal | Priority Boost |
| Custom URL schemes with OAuth callback patterns | HIGH |
| Exported components without permission protection | HIGH |
| Hardcoded API keys (validated by secret scanner) | HIGH |
| WebView with JS bridge + loadUrl from intent | HIGH |
| ATS exceptions for API domains | MEDIUM |
| Content providers with dynamic queries | MEDIUM |
| Native libraries with JNI exports | MEDIUM |
| Missing cert pinning (chain candidate only) | LOW |
allowBackup=true (chain candidate only) | LOW |
The orchestrator uses this ranking to decide which hunter instances to spawn and which areas to skip.
Scope Verification Checklist
Before starting recon, verify:
- Bundle ID / package name matches
scope.jsonexactly - App version is the current App Store / Play Store release
- iOS binary is decrypted (
cryptid == 0viaverify_decryption.py) - Android manifest is from the production build (not debug)
- Binary analysis is allowed by program scope
Output Contract
All recon outputs go to recon/<target>/ as JSON files. The orchestrator and hunter agents consume these files, so maintain the schema contracts defined above. Every tool outputs structured JSON with a top-level status field (success or error).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

