Claude 24f816b6a3
Consolidate 22 sibling repos into layered organism structure
Place useful parts of the surrounding repos into sica-fondt by layer, per the
body model (Ada = membrane; brain/endocrine/capabilities/knowledge non-Ada):

- brain/        LLM reasoning + providers (dapr, hermes, MoMoA)
- capabilities/ REPRAG sidecars: hermes tools/skills, dapr tools, parallel
                dispatch, A51 channels, and the OSINT cluster
- knowledge/    LORAG corpus: 754 cyber-skills, agency personas, secure-coding,
                MITRE ATT&CK data
- reference/    defensive threat-reference (C3, shhbruh doc) + AdaYaml parser

License handling: AGPL sources (worldosint, advanced_evolution, mercury,
Reticulum) and GPL DeTTECT are SPEC-only clean-room/port descriptions — no
copyleft code copied. MIT/Apache/data parts copied as working trees.

Safety: shhbruh escape/persistence material and C3 covert-C2 kept as reference
only, not wired into the running organism. See CONSOLIDATION.md.

https://claude.ai/code/session_01UehUqEXXJJCsHoA4voCU5c
2026-06-10 06:53:01 +00:00

120 lines
4.0 KiB
Python

#!/usr/bin/env python3
"""
iOS Reverse Engineering Automation with Frida
Automates class enumeration, method tracing, and secret extraction from iOS apps.
Usage:
python process.py --app TargetApp [--output report.json]
"""
import argparse
import json
import subprocess
import sys
from datetime import datetime
ENUMERATE_SCRIPT = """
if (ObjC.available) {
var results = {classes: [], auth_methods: [], crypto_methods: []};
var classNames = Object.keys(ObjC.classes);
classNames.forEach(function(name) {
if (name.indexOf("Auth") !== -1 || name.indexOf("Crypto") !== -1 ||
name.indexOf("Token") !== -1 || name.indexOf("Key") !== -1 ||
name.indexOf("Secret") !== -1 || name.indexOf("Login") !== -1) {
var methods = ObjC.classes[name].$ownMethods;
results.classes.push({name: name, method_count: methods.length});
methods.forEach(function(m) {
if (m.toLowerCase().indexOf("auth") !== -1 || m.toLowerCase().indexOf("login") !== -1) {
results.auth_methods.push(name + " " + m);
}
if (m.toLowerCase().indexOf("encrypt") !== -1 || m.toLowerCase().indexOf("decrypt") !== -1 ||
m.toLowerCase().indexOf("key") !== -1 || m.toLowerCase().indexOf("cipher") !== -1) {
results.crypto_methods.push(name + " " + m);
}
});
}
});
send(JSON.stringify(results));
} else {
send(JSON.stringify({error: "ObjC runtime not available"}));
}
"""
def run_frida_script(app_name: str, script: str, timeout: int = 15) -> str:
"""Execute a Frida script and return output."""
cmd = ["frida", "-U", "-n", app_name, "-e", script, "--no-pause"]
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
return result.stdout
except (subprocess.TimeoutExpired, FileNotFoundError):
return ""
def check_binary_protections(app_name: str) -> dict:
"""Check for binary protections."""
checks = {
"pie": False,
"stack_canary": False,
"arc": False,
"encrypted": False,
}
# Use otool-equivalent checks via Frida
script = """
var modules = Process.enumerateModules();
var main = modules[0];
send(JSON.stringify({
name: main.name,
base: main.base.toString(),
size: main.size,
path: main.path
}));
"""
output = run_frida_script(app_name, script)
return checks
def main():
parser = argparse.ArgumentParser(description="iOS RE Automation with Frida")
parser.add_argument("--app", required=True, help="Target app process name")
parser.add_argument("--output", default="ios_re_report.json", help="Output report")
args = parser.parse_args()
print(f"[+] Enumerating classes and methods for {args.app}...")
enum_output = run_frida_script(args.app, ENUMERATE_SCRIPT)
# Parse results
try:
lines = [l for l in enum_output.split("\n") if l.startswith('{"') or l.startswith("[")]
results = json.loads(lines[0]) if lines else {}
except (json.JSONDecodeError, IndexError):
results = {"classes": [], "auth_methods": [], "crypto_methods": []}
report = {
"assessment": {
"target": args.app,
"type": "iOS Reverse Engineering",
"date": datetime.now().isoformat(),
},
"enumeration": {
"security_classes": results.get("classes", []),
"auth_methods": results.get("auth_methods", []),
"crypto_methods": results.get("crypto_methods", []),
},
"binary_protections": check_binary_protections(args.app),
}
with open(args.output, "w") as f:
json.dump(report, f, indent=2)
print(f"[+] Report saved: {args.output}")
print(f"[*] Found {len(results.get('classes', []))} security-related classes")
print(f"[*] Found {len(results.get('auth_methods', []))} auth methods")
print(f"[*] Found {len(results.get('crypto_methods', []))} crypto methods")
if __name__ == "__main__":
main()