
iCloud 인증, CloudKit/MMCS 백업 다운로드, Octagon/PCS 복구(ADP, Recovery Key, Lockdown Mode)를 위한 실험적 .NET/WPF 포렌식 툴킷입니다. Forensis-Lab의 연구용 소프트웨어로, 매우 실험적이며 Apple 비공개 API는 하룻밤 사이에 변경될 수 있습니다.
공개 실험 단계 — iCloud 로그인, 기기 백업 목록 조회, CloudKit/MMCS를 통한 다운로드를 위한 WPF(.NET 10) 앱입니다.

연구 / 실험실 소프트웨어입니다. 완성된 제품이 아닙니다: 문서화되지 않은 Apple API, 계정 정지 위험, 보증 없음. 본인 소유의 Apple ID로만, 본인 책임 하에 사용하십시오.
제 이름은 Giordano Sconti입니다. 저는 포렌식 연구소 Forensis-Lab과 협업하고 있으며, 소프트웨어 연구원이자 기술 컨설턴트(Consulente Tecnico)로 일하고 있습니다.
이 소프트웨어는 MIT 라이선스로 배포되지만, Forensis-Lab 포렌식 연구소에 속합니다.
이 프로젝트는 Apple의 내부 API가 하룻밤 사이에 바뀔 수 있기 때문에 매우 실험적인 것으로 간주해야 합니다.
제가 이 프로젝트를 공개하는 이유는, 극단적인 경우 기기 자체를 통하지 않고서는 접근할 수 없는 백업과 CloudKit 데이터를 복구해야 할 때 포렌식 작업에 가치가 있기 때문입니다.
제가 사용해 본 상용 도구들과 달리, 저는 ADP가 활성화된 경우와 비활성화된 경우 모두에서 제 개인 백업을 안정적이고 완전하게 다운로드하는 데 성공했습니다(물론 활성화된 경우 기기의 Octagon PIN 또는 Recovery Key를 알고 있어야 합니다).
또한 Lockdown Mode와 같은 보호 기능이 활성화되어 있고 iCloud.com이 꺼져 있는 경우에도 작동합니다.
이 프로젝트에는 약 7개월의 연구가 소요되었습니다. Cursor 코딩 에이전트 모델이 없었다면 훨씬 더 오래 걸렸을 것입니다. 제가 쓸 수 있는 시간은 가능할 때의 업무 시간이나 늦은 밤뿐이었습니다. 저는 모듈식 코드 구성을 유지하려고 노력했으며, 잘 되었기를 바랍니다.
커피 한 잔 사주고 싶으시다면, 대신 Forensis-Lab에 감사를 표하시거나 다른 형태의 인정을 해주시면 좋겠습니다.
이 소프트웨어를 사용해 보고 싶거나, 개선 사항을 제안하거나, 남은 기능을 완성하는 데 도움을 주고 싶은 분은 환영합니다.
유료 코딩 에이전트 모델을 사용하셔도 됩니다(무료 모델은 코드 정확성 면에서 종종 신뢰할 수 없으니 피해 주십시오). 중요한 것은 생성된 코드를 항상 검토하고, 동의 없이 제3자 코드를 무단으로 도용하지 않는 것입니다. 풀 리퀘스트는 매우 신중하게 검토될 것입니다.
연락처: [email protected]
이 프로젝트의 모든 코드 한 줄은 제 직접적인 허가 하에 Forensis-Lab에 속합니다. 모든 사용 또는 수정은 Forensis-Lab에 귀속되어야 합니다.
자체 anisette 스택을 실행하기 전에 소프트웨어를 사용해 보고 싶으시다면, 제 Anisette Server 접근을 요청하기 위해 비공개로 연락해 주십시오.
https://giordanosconti.github.io/iCloudKitExtractor/

Recovery Key 잠금 해제는 암호화된 TLKShares의 전체 집합을 덤프할 수 있는 Octagon 엔드포인트를 사용합니다. 이 공유들로부터 Recovery Key 피어와 연관된 것들(Recovery Key에 서명하는 공개 키의 SHA-384)도 복구할 수 있습니다. 이를 통해 주어진 Recovery Key가 존재하는 것들 중 하나인지 검증할 수 있고, 존재한다면 CloudKit 존에 대한 Manatee/PCS KeySet을 복구할 수 있습니다—ADP로 보호된 백업과 Keychain을 포함하여.
src/iCloudKitExtractorsrc/PhotosViewer (IKE 빌드 시 viewer-payload로 복사됨)AnisetteServer (+ 선택적 브리지 프로젝트)docs/ 아래의 문서dotnet build src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
프로젝트 사이트는 docs/ (index.html + site.css) 아래에 있습니다.
main을 GitHub에 푸시합니다.main / folder: /docs를 선택합니다.https://giordanosconti.github.io/iCloudKitExtractor/와 유사합니다.일관된 iPhone/akd 아이덴티티를 위한 선호 경로: OTP는 Frida → AuthKit/akd를 통해 기기에서 생성된 후 AnisetteServer에 의해 제공됩니다.
pip install frida-tools)python으로 사용 가능한 Python 3 (또는 FRIDA_ANISETTE_PYTHON 설정)fetch_anisette.py (Frida 연결 스크립트). FRIDA_ANISETTE_FETCH_PY로 경로를 설정합니다.탈옥 설치 단계: 아래 **탈옥된 iPhone 준비**를 참조하세요 (세부 사항 추후 공개).
| 변수 | 필수 | 기본값 | 의미 |
|---|---|---|---|
ANISETTE_SERVER_BACKEND | 예 | coreadi | frida여야 함 (별칭: iphone-frida, jb-frida) |
ANISETTE_SERVER_URL / ANISETTE_SERVER_URLS | 아니오 | http://127.0.0.1:6969 | AnisetteServer가 수신하는 URL |
ANISETTE_SERVER_PORT | 아니오 | 6969 | URL이 설정되지 않은 경우의 포트 |
ICLOUD_AUTH_MODE | 권장 | iphone (config를 통해) | 전체 AuthKit iPhone SRP를 위해 iphone 사용 |
FRIDA_ANISETTE_HOST | 아니오 | 127.0.0.1:27042 | frida-server host:port (USB는 보통 iproxy 27042 27042를 통해) |
FRIDA_ANISETTE_PROCESS | 아니오 | akd | 연결할 프로세스 |
FRIDA_ANISETTE_FETCH_PY | 예* | 추론된 경로 | fetch_anisette.py의 절대 경로 |
FRIDA_ANISETTE_PYTHON | 아니오 | python | Python 실행 파일 |
FRIDA_ANISETTE_LITE | 아니오 | 1 / true | 라이트 연결 모드 |
FRIDA_ANISETTE_TIMEOUT | 아니오 | 60 | 생성 중단까지의 시간(초) |
*FRIDA_ANISETTE_FETCH_PY가 없으면 앱은 몇 가지 레거시 형제 경로만 검색하므로, 환경 변수를 명시적으로 설정하세요.
선택적 앱 구성 파일: %AppData%\iCloudKitExtractor\anisette.json (authMode, serverUrl). 환경 변수가 파일보다 우선합니다.
$env:ANISETTE_SERVER_BACKEND = "frida"
$env:ANISETTE_SERVER_PORT = "6971"
$env:FRIDA_ANISETTE_HOST = "127.0.0.1:27042"
$env:FRIDA_ANISETTE_PROCESS = "akd"
$env:FRIDA_ANISETTE_FETCH_PY = "C:\path\to\fetch_anisette.py"
$env:FRIDA_ANISETTE_PYTHON = "python"
$env:FRIDA_ANISETTE_LITE = "1"
$env:FRIDA_ANISETTE_TIMEOUT = "60"
dotnet run --project src/AnisetteServer/AnisetteServer.csproj -c Release -- --backend frida --port 6971
CLI --backend / --port는 환경 설정을 재정의합니다.
스모크 테스트:
curl http://127.0.0.1:6971/health
curl http://127.0.0.1:6971/
기계 데이터가 포함된 JSON을 예상합니다(X-Apple-I-MD-M, com.apple.akd를 포함하는 X-MMe-Client-Info).
$env:ANISETTE_SERVER_URL = "http://127.0.0.1:6971/"
$env:ICLOUD_AUTH_MODE = "iphone"
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
먼저 기기에서 Sileo를 통해 Frida(frida-server)와 OpenSSH를 설치하세요.
루트리스 탈옥(/var/jb/...)을 가정합니다. root로 SSH를 통해:
ls -l /var/jb/usr/sbin/frida-server
LaunchDaemon plist를 다시 생성합니다(LF 줄바꿈, rootless). 편집기는 필요 없습니다:
cat > /var/jb/Library/LaunchDaemons/re.frida.server.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>re.frida.server</string>
<key>ProgramArguments</key>
<array>
<string>/var/jb/usr/sbin/frida-server</string>
<string>-l</string>
<string>0.0.0.0:27042</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ThrottleInterval</key>
<integer>3</integer>
</dict>
</plist>
EOF
줄 바꿈을 정규화하고, plist를 바이너리로 변환한 다음, 데몬을 (다시) 로드합니다:
tr -d '\r' < /var/jb/Library/LaunchDaemons/re.frida.server.plist > /tmp/frida.plist
mv /tmp/frida.plist /var/jb/Library/LaunchDaemons/re.frida.server.plist
plutil -convert binary1 /var/jb/Library/LaunchDaemons/re.frida.server.plist
killall frida-server 2>/dev/null
launchctl bootout system /var/jb/Library/LaunchDaemons/re.frida.server.plist 2>/dev/null
launchctl bootstrap system /var/jb/Library/LaunchDaemons/re.frida.server.plist
launchctl enable system/re.frida.server
launchctl kickstart -k system/re.frida.server
ps aux | grep '[f]rida-server'
이것은 frida-server를 0.0.0.0:27042(모든 인터페이스)에 바인딩하고, 부팅 시 시작하며, 계속 살아 있도록 유지합니다. PC에서 USB 포트 포워딩(iproxy 27042 27042) 후 예를 들어 FRIDA_ANISETTE_HOST=127.0.0.1:27042를 설정하거나 기기의 LAN IP를 사용하세요.