들어가며
‘아니 이런건 어떻게 발견하셨어요?’, ‘원리가 뭔가요?’
터미널 명령어를 통해 OS X과 맥용 소프트웨어의 숨겨진 기능을 끄집어 내는 글에 위와 같은 댓글이 으레 하나 둘 씩 달리곤 합니다. 정말 이런 팁들의 원리는 무엇이고 또 어떻게 발견되는 것일까요?
매번 터미널 명령어만 무작정 던져드렸는데, 오늘은 이런 터미널 명령어들의 원리는 무엇이고 또 어떻게 발견되는지 짧막하게 소개하는 시간을 가져봤습니다.
프로퍼티 리스트(plist)?
애플은 개발자들이 소프트웨어의 설계 및 구현에만 전념할 수 있도록 ’응용 프로그램 프레임워크(Application Frameworks)’라는 일종의 틀(프레임)을 제공합니다. 개발자들이 맥용 소프트웨어를 만들 때 완전히 백지상태에서 프로그램 코딩을 시작하는 것이 아니라, 애플이 마련한 이런 프레임워크에 소프트웨어 동작에 필요한 핵심적인 부분만 구현하여 올려놓게 되는 것입니다. 그 덕분에 소프트웨어 개발에 필수불가결하다고 여겨지는 지루하고 반복적인 코딩 작업을 상당 부분 건너뛸 수 있고, 소프트웨어의 핵심 기능과 편의성 향상에 보다 많은 시간을 투자해 소프트웨어의 퀄리티를 높일 수 있습니다.
이때 맥 OS X 소프트웨어 개발을 위해 애플이 제공하는 프레임워크는 코코아(Cocoa) API라 불리며, 여기에 터치 계층(Touch Layer)를 덧씌우는 등 모바일 환경에 최적화되서 나온 프레임워크가 아이폰 및 아이패드를 위한 코코아 터치(Cocoa Touch) API입니다.
코코아 API(코코아 터치 API 포함)를 기반으로 제작된 소프트웨어는 ’.plist’라는 확장자를 가진 ’프로퍼티 리스트(property list)’파일에 프로그램의 구동과 관련된 각종 정보를 저장해 놓습니다. 또, 사용자가 소프트웨어의 '환경설정(Preference) 패널에서 선택하거나 지정한 값도 통상 이런 plist 파일에 고스란히 저장되어 추후 프로그램이 실행될 때 참조하게 됩니다.
예를 들어, 웬만한 규모의 기업이나 관공서에 어떤 업무를 이런저런식으로 대처하라는 지침이나 메뉴얼이 있듯이, 소프트웨어의 특정 기능이 구현될 때 프로퍼티 리스트의 설정값을 최우선적으로 참고하도록 개발자가 설계해 놓는 경우가 많습니다. 프로퍼티 리스트 파일에 저장된 값은 소프트웨어에게는 유아독존 '진리'이기 때문에 프로퍼티 리스트가 소프트웨어에게 ’내가 하늘이 빨간색이다하면, 그 순간부터 하늘은 빨간색이고, 내가 현정화라면 현정화다.’가 되는 것입니다. 소프트웨어는 plist 파일에 저장된 값이 프로그램 실행에 에러를 일으킬 정도로 비정상적인 수준만 아니라면 이를 있는 그대로 불러들이고 사용자에게 구현합니다. 물론 정말 엉뚱한 값이 저장되어 있으면 기능이 제대로 작동하지 않거나 말 그대로 소프트웨어가 뻗는(crash) 상황이 벌어질 것입니다.
드물게 plist 없이 바이너리(실행) 단독으로 작동하는 프로그램도 있지만, 코코아 API를 기반으로 개발된 소프트웨어는 com.개발자도메인.소프트웨어명.plist 파일을 라이브러리 한켠에 저장하고 실행시마다 불러들이는 것이 일반적입니다. (예: com.apple.iTunes.plist, com.adobe.photoshop.plist)
맥 운영체제나 애플 소프트웨어의 숨겨진 기능의 봉인을 푸는 것은 이 plist를 사용자가 임의로 수정하는 것에서부터 시작합니다.
프로퍼티 리스트에서 기능 발견하기
개발자가 소프트웨어에 심어둔 숨겨둔 기능(혹은 혹시 몰라 만들어 두긴 했는데, 구현하지 않기로 결정한 기능)을 발견하는 프로세스는 '난이도'에 따라 크게 2가지로 나눌 수 있습니다.
첫째로, 프로퍼티 리스트에 이미 특정 기능에 대한 키(Key)가 있고, 여기에 지정된 값(Value)을 사용자가 임의로 변경해 소프트웨어의 기본 특성을 바꾸는 경우입니다. 작년에 아이튠즈 버전 11이 출시되었을 때 블로그에 ’아이튠즈 11의 한글 서체를 애플 SD 고딕으로 변경하는 방법’을 올린 적이 있는데, 이때 사용한 방법도 아이튠즈가 한글을 표시할 때 참조하는 키 값을 변경하는 방식이었습니다.
이런 방식은 단순히 프로퍼티 리스트 파일을 열어 기존에 존재하는 '키 값'만 변경하면 되기 때문에 해당 기능을 찾아내는데까지 많은 시간이 걸리지 않습니다. 즉, 엄밀히 말해 이런 방식은 소프트웨어의 숨겨져 있는 기능을 '발견'하는 것이 아니라, 소프트웨어가 기존과는 다른 방식으로 작동하도록 특정 특성을 '변조'한다고 봐야 정확할 것입니다.
정말 어려운 것은 두 번째 방법입니다. 소프트웨어의 바이너리를 직접 스캔해 프로퍼티 리스트에는 흔적도 없는 기능을 발견하는 방법입니다. 이 부분에 관해서는 아래 별도의 섹션에서 소개해 보도록 하겠습니다.
바이너리에서 ’스트링을 덤프’한 뒤 노가다 시작!
많은 분들의 이해를 돕기 위해 '아이튠즈'로 예를 들어보겠습니다.
아이튠즈가 텍스트를 표시할 때 어떤 서체를 참조할 것인지는 이미 특정 프로퍼티 리스트(TextStyle_Backup.plist )에 관련 키 값이 다 드러나 있기 때문에 변조가 쉽다고 말씀드렸습니다.
하지만 (맥을 오래 사용하고 계신 분들은 잘 알고 계실) 아이튠즈 보관함에 들어있는 미디어 파일에 1/2개짜리 별을 적용하는 방법(위 이미지)은 아이튠즈와 관련된 어떤 plist 파일에도 해당하는 키 값이 들어있지 않습니다. 말 그대로 무에서 유를 창조해 낸 것입니다. 과연 이 비밀을 발견했던 사람은 어떤 방법을 사용했던 것일까요? 아이튠즈에 숨겨져 있는 기능을 찾기 위한 탐사.. 아니 '노가다'가 본격적으로 시작됩니다.
1. 아이튠즈의 바이너리가 있는 폴더로 이동한 후, 바이너리에서 '인간이 읽을 수 있는 텍스트'를 모조리 추출해 냅니다.
cd /Applications/iTunes.app/Contents/MacOS strings - iTunes >~/Desktop/itunes.txt
2. 이런 과정에서 추출된 텍스트 파일을 편집기에서 열면... 소프트웨어가 참조하거나 사용하는 수천~수만개의 스트링(String)들이 쏟아져 나옵니다.
이중 어떤 스트링이 '숨겨져 있는 기능'과 관련되어 있을지는 며느리도 모를 일입니다. 추출된 스트링 중에서 소프트웨어 기능과 아무런 상관이 없을 것 같은 특이한 스트링들(URL 주소, 특수기호와 알파벳 등이 의미없이 조합되어 있는 스트링, plist의 파라미터로 사용되기엔 길이가 너무 긴 스트링, 반복되는 스트링 등)을 1차 적으로 제외시킨 후, 남은 나머지 스트링 중에서도 plist 키 이름으로 적합해 보이는 스트링들을 plist에 하나하나 추가하고 테스트 해보면서 '혹시 있을지 모를' 숨겨진 기능을 탐색해야 합니다. 말이 쉽지 수천, 수만번의 테스트가 요구되는 실로 엄청난 '노가다' 작업이 아닐 수 없습니다.
defaults write $$$.@@@.plist 테스트_스트링 키_값 X 테스트해 볼 스트링 개수 X 3 (키의 값(Value)이 불(Boolean) 방식일지, 숫자(Numeric)일지, 아니면 쌩 텍스트일찌에 따라)
하지만 맨땅에 헤딩하듯 스트링 하나하나를 테스트 해보기에 앞서 plist 키 이름에 적합한 스트링등을 우선적으로 테스트하게 됩니다. 예를 들어, GoToSchool이나 go-to-school 같이 대문자와 대시(-)등이 공백을 대신하는 스트링이라던가(개발자들의 습관이죠), allow, effect, value, show, hidden, position, width, height, style, path 같은 단어가 포함돼 단독으로는 제 역할을 못하고 어떤 부가적인 '값'을 필요로 할 것 같은 스트링이 그 대상입니다.
그런 면에서 아이튠즈의 1/2 별 지정 기능은 비교적 발견되기 쉬운(?) '숨겨진 기능'이라 할 수 있을까요... 하지만 결과론적으로는 쉬워보이지만 이런 이 키 값 발견에도 엄청난 시간과 노력을 들어갔을 것임은 틀림없는 사실입니다.
수많은 변수와 테스트 끝에 발굴된 이런 비밀 키 값들을 시스템에 적용해 보면 '애플이 소프트웨어를 개발하면서 상당히 다양한 사용자 인터페이스(UI)와 사용자 경험(UX) 실험을 했구나'하는 것도 엿볼 수 있고 '도대체 이렇게 유용한 기능을 왜 꽁꽁 숨겼을까' 하는 의문이 떠오를 때도 있습니다. 간혹 현직 애플 개발자들이 온라인에서 이런 키 값들을 은밀히 배포하고 사용자들의 의견을 청취하는게 아닌가 하는 우스갯 소리도 있는데, 글쎄요… 사실인지 아닌지는 당사자만 알겠죠? :-)
본문이 너무 방만하게 전개되는 것을 피하기 위해 범주를 아이튠즈로 한정했지만 닥(Dock)이나 미션 컨트롤(Mission Control) 등 OS X 속에 있는 각종 소프트웨어도 위와 동일하거나 유사한 방법으로 비밀 기능들을 탐색할 수 있습니다. 또 OS X 운영체제가 참조하는 NSGlobalDomain (AppleGlobalDomain) 프로퍼티 리스트는 약간 다른 방법을 사용하긴 하지만 내부를 해독하는 부분은 위에 소개해 드린 것과 큰 차이를 보이지 않습니다.
세계로 전파…
여러 경로를 통해 발견된 숨겨진 파라미터 값이 항상 유용한 것은 아니기에 사용자들에게 큰 인기를 끌지 못한채 그대로 사장되는 경우도 있습니다. 하지만 사용자의 선택권을 넓혀주거나, 기본 기능 보다 활용도가 뛰어난 기능의 경우 Stack Overflow나 Reddit, OS X Hints 등에 소개되면서 세계 만방으로 빠르게 전파됩니다.
아무튼 여러분들의 궁금증을 100% 완전히 해소해드리기엔 부족한 면이 있지만 'OS X에 숨겨진 기능을 찾는데 대략 이러한 방법이 사용되는구나' 하며 희미하게나마 감을 잡으셨을거라 생각합니다 :-)