본문으로 건너뛰기
AZ Tools

Plist 뷰어 (바이너리·XML)

속성 목록은 macOS와 iOS가 거의 모든 것을 저장하는 방식입니다. 앱 환경설정, Info.plist, 구성 프로파일, 백업 매니페스트까지요. 절반은 편집기로 읽을 수 있는 XML이지만, 나머지 절반은 bplist로 시작하는 바이트 덩어리로 열리는 애플의 바이너리 형식입니다. 이 도구는 둘 다 읽습니다. 바이너리는 문자열을 긁어모으는 대신 제대로 디코딩합니다. 파일 끝의 32바이트 트레일러가 오프셋과 참조 정수의 폭, 그리고 객체 테이블의 위치를 알려주고, 모든 값은 그 테이블을 통해 도달합니다. 헤더부터 앞으로 훑어서는 아무것도 읽을 수 없다는 뜻이죠. 1·2·4·8바이트 정수, 실수, 애플 고유 에포크 기준의 날짜, 원시 데이터, UID, 배열, 집합, 딕셔너리가 모두 타입을 유지한 채 나옵니다. 결과는 트리로 보여주고 JSON과 XML plist로도 제공합니다. 편집할 수 없던 바이너리 파일이 편집 가능한 형태가 되는 셈입니다. 파일이 NSKeyedArchiver 아카이브로 판명되면 — UID 참조로 연결된 평평한 객체 테이블로, iOS가 조금이라도 복잡한 것을 저장할 때 쓰는 방식입니다 — 그 사실을 알려줍니다. 내용이 앱이 저장하는 구조와 전혀 달라 보이는 이유가 바로 그것이니까요. 업로드되는 것은 없습니다.

사용법

  1. .plist나 .mobileconfig 파일을 끌어다 놓거나 XML plist 텍스트를 붙여넣으세요.
  2. 형식은 자동 감지되며, 바이너리 파일은 객체 개수를 함께 보여줍니다.
  3. 트리를 읽으세요. 각 행에 키, 타입, 값이 표시됩니다.
  4. 가공하려면 JSON을, 편집하려면 XML plist를 복사하세요.
  5. 데이터와 날짜는 문자열로 뭉뚱그리지 않고 타입을 표시합니다.

자주 묻는 질문

바이너리 plist와 XML plist의 차이는 뭔가요?
인코딩만 다릅니다. 담는 값은 같고 macOS는 둘을 같은 것으로 다룹니다. 바이너리가 더 작고 빠르게 읽히기 때문에, 문서에는 XML로 설명돼 있어도 기기 안의 파일은 대부분 바이너리입니다.
파일이 의미 없는 숫자와 $로 시작하는 키로만 보입니다.
NSKeyedArchiver 아카이브일 가능성이 큽니다. 객체들을 $objects에 평평하게 나열하고 중첩 대신 UID 참조로 연결하기 때문에, 보이는 구조는 아카이브의 것이지 앱의 것이 아닙니다. $archiver 키가 보이면 이 도구가 표시해 줍니다.
다른 데서는 날짜가 31년씩 어긋납니다.
애플은 1970-01-01이 아니라 2001-01-01부터 초를 셉니다. 978307200초 차이죠. plist의 날짜를 유닉스 타임스탬프로 읽으면 1970년대로 떨어집니다. 여기서는 이 오프셋을 적용해 올바른 날짜가 나옵니다.
바이너리 데이터는 어떻게 되나요?
데이터 타입 그대로 유지하고 길이를 함께 보여줍니다. JSON에는 바이트 문자열이 없으므로 __data_base64 키 아래 base64로 넣고, XML 출력에서는 다시 <data> 요소로 돌아갑니다.
바이너리 plist를 편집하거나 쓸 수도 있나요?
바이너리를 XML로 변환해 주므로, 그것을 편집한 뒤 plutil이나 plist 라이브러리로 되돌릴 수 있습니다. 바이너리 형식으로 쓰는 것은 이 도구의 기능이 아닙니다.
파일이 업로드되나요?
아니요. 브라우저에서 파싱되고 서버로 전송되지 않습니다. 환경설정 파일에는 계정 이름과 경로가 들어 있는 경우가 많아 특히 중요합니다.

관련 도구