[iOS]iOS 어플의 프로텍션(보안) 구조[iOS]iOS 어플의 프로텍션(보안) 구조

Posted at 2012. 3. 5. 23:26 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
유용한 정보 게시물 - iOS 앱에 대해 알아보자!
 
안녕하세요. 오랜만에 쓰는 정보글입니다.
오늘은 iOS 어플리케이션의 프로텍션(보안) 구조에 대해 알려드리려고 합니다.

애플 앱스토어에서 판매되고 있는 iOS 어플리케이션은 무단 복제,리버싱 방지와 구매자 인증 장치를 탑재하고 있습니다. 또한 iOS 자체의 샌드박스 시스템으로 어플의 권한도 제한하고 있는데 이에 대해 자세히 알아보도록 하겠습니다.

Code Signature  

일단 처음으로 iOS 어플리케이션은 Code Signature(코드 무결성 사인) 이라는 방식으로 보호되고 있습니다.
이 Code Signature는 일종의 해쉬값으로서 어플리케이션을 개발한다음 패키징할때 생성되는 사인입니다.
XCode를 다뤄보신 분이라면 아시겠지만.. XCode 설치시 기본적으로 제공되는 codesign 이라는 유틸리티가 애플 개발자 등록을 한 사람에게 지급되는 개발자 인증서(Provisioning Profile)를 이용하여 이 사인을 작성해주고 있습니다.
이 Code Signature는 파일의 해쉬값을 담고 있으므로.. ipa 패키지 내부의 파일(메타 데이터와 아트워크는 제외)이 단 1바이트라도 변형되면 iOS의 설치 데몬인 installd에서 바로 체크하여 설치가 불가능하게 됩니다.

구매자 정보 인증와 암호화(SC_Info)

두번째로.. iOS 어플리케이션에는 구매자 인증 정보 시스템이 존재하며 메인 바이너리에 암호화가 되어 있습니다. 이는 앱스토어에서 어플을 다운 받을때 삽입되는 고유 코드로.. 구매자의 계정정보(회원코드 및 이름 등)와 이에 따른 해쉬값이 들어 있습니다. 이 인증 정보는 ipa 패키지 내부의 SC_Info 폴더에 저장됩니다. (이 인증장치는 ipa 파일 생성 혹은 앱스토어에 올릴 때 자동으로 적용됩니다.)
또한 이 SC_Info 폴더에는 암호화 키값이 저장되는데 iOS 에서 앱을 실행할때 마다 이 암호화 키를 이용하여 메인 바이너리(어플 명과 같으며 확장자가 없는 파일)의 암호화를 푼뒤 메모리에 올리게 됩니다.
참고로 iTunesMetadata.plist 파일의 경우 아이튠즈에서 표시하기 위한 임시 파일로 이 파일은 보안에 아무런 영향이 없습니다. iTunesArtwork도 마찬가지로 어플리케이션 아이콘을 빠르게 표시하기 위해 들어있는 파일입니다.

샌드박스 시스템 

세번째로 샌드박스 시스템이 존재합니다.
이 샌드박스 시스템은 일종의 격리 장소로.. 어플리케이션이 시스템 폴더나 파일접근하지 못하도록 제공되는 가상 공간입니다.
(이 샌드박스가 XCode에서는 컨테이너라는 단어로 표시됩니다.)

iOS 어플리케이션은 두가지 종류가 존재하는데 바로 시스템 어플리케이션(연락처, 사진, 사파리, 음악, 앱스토어 등의 기본 어플리케이션)과 사용자 어플리케이션(앱스토어에서 다운받는 어플리케이션)으로 나뉘어집니다.
시스템 어플리케이션은 샌드박스 시스템이 적용되지 않고.. 시스템의 모든 부분에 접근이 가능합니다.
(참고로.. iOS를 탈옥하면 설치되는 Cydia 및 Cydia에서 다운받아서 설치되는 어플리케이션 역시 이 시스템 어플리케이션 분야에 속하며 시스템 어플리케이션으로 설치되었기 때문에 Cydia는 애플이 승인하지 않는 앱들을 설치할 수 있고 Cydia에서 받은 어플리케이션들이 테마 적용, 기능 개선 등의 시스템적인 부분에 접근이 가능한 것이죠..)

반면에 사용자 어플리케이션은 이 샌드박스 시스템이 적용되는데 이 샌드박스 외부의 공간으로 접근불가능합니다.
다만 음악 라이브러리, 사진 등에 제한적으로 접근이 가능한 경우가 있는데 이는 시스템 API를 이용한 것입니다. 음악 라이브러리 접근의 경우 iOS 3.0 에서 추가된 기능이기도 하며 그 전에는 이용이 불가능했습니다.
그리고 이 시스템 API를 이용하면 다른 어플리케이션의 폴더에도 파일을 옮기는 등.. 샌드박스 외부에 대한 제한적인 접근이 가능합니다.

앱스토어 심사 제도

마지막으로.. 앱스토어에 어플리케이션을 올릴 때 애플에서 자체 검열하는 앱스토어 심사 제도가 있습니다. 애플 앱스토어에 어플리케이션을 올릴 때에는 애플에서 이 어플리케이션이 자신들의 정책에 위반되지 않는지, 법적으로 문제가 되지 않는지, 코드 등에 해킹 코드는 없는지 등을 자체적으로 확인하게 됩니다.
이 심사 제도에도 몇가지 문제가 있긴 합니다.
비통과시에 이유를 말해주지도 않고.. 심사를 연기하는 등의 여러가지 문제가 있고.. 자신들의 이익에 이용하기도 하며 최근에는 저작권에 문제가 되거나 스팸 어플리케이션이 수차례 올라온적도 있습니다.
반면에 유용하던 어플리케이션(메모리 정리 어플 등)은 삭제가 되었죠..
하지만 몇가지 문제가 있다 하더라도 일차적으로 문제가 될 수 있는 앱들을 걸러주고 나중에 문제가 된다 싶을 때에는 앱스토어에서 삭제 조치 하기 때문에 어느정도는 보안에 도움을 준다고 볼 수 있겠습니다. 물론.. 앱스토어에서 삭제되기 전에 받았던 유저는 ipa 파일만 백업해 놓는다면 원할때 언제든지 다시 설치할 수 있긴 합니다..

필자의 한마디

애플 iOS 어플리케이션의 보안 구조에 대해 어느정도 이해가 되셨나요?
이렇게 많은 보안장치가 걸려있지만...
탈옥 하나로 모든게 무력화 될 수 있다는 점이 참 아쉽기도 합니다.
어플리케이션 개발자들이 힘들게 개발하고 심지어 비용을 내면서 무료로 어플리케이션을 배포하는 경우도 있습니다.
(개발자가 어플을 앱스토어에 등록하거나 기기에 올리기 위해서는 무료앱이든 유료앱이든 1년에 최소 99$를 지불하여야 합니다.)
그리고.. 모든 개발은 맥 OSX에서 이루어지며 애플에서 나온 컴퓨터를 이용하여야 하므로 비용이 추가적으로 들게 됩니다.

이렇게 힘들게 만들어진 어플리케이션인 만큼.. 꼭 정품구매하도록 합시다..!
감사합니다. 
//

[iOS 한글화]pList Converter[iOS 한글화]pList Converter

Posted at 2012. 1. 29. 19:50 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
iOS 한글화 툴 - pList Converter 

iOS 한글화 강좌에 쓰일 Apple Property List 변환 프로그램입니다.


바이너리 plist 파일을 xml 형태로 변환하거나 xml 파일을 다시 바이너리 plist로 변환할 수 있습니다.

이 툴은 오픈소스를 편집하여 유니코드 파일을 지원하도록 제작되었으며 프로그램 정보 창에서 확인하실 수 있습니다.

프로그램을 구동하려면 .Net Framework 3.5 이상이 필요합니다.
맥 OS에서는 구동되지 않으며 추후 프로그램을 제작할 예정입니다.

제작 : MG게이버(mingi2007@gmail.com)

프로그램 다운로드

[업데이트 내역]
버전 1.0 - 최초 공개

//

[iOS 한글화]어플리케이션 구조를 파악하자![iOS 한글화]어플리케이션 구조를 파악하자!

Posted at 2012. 1. 28. 15:15 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
 강좌 개요

이전 강좌에서 보셨듯이 어플리케이션의 텍스트를 불러올때 외부 파일을 이용하는지, 내부 바이너리에 내장되어 있는지 확인하는 것이 우선입니다.

이번 강좌에서는 어떤 방식으로 텍스트를 불러오는지 확인하는 방법에 대해 소개합니다. 물론 어플리케이션의 개발자가 모두 다르기 때문에 아래 방식으로 모든 어플리케이션의 한글화가 가능한지는 판단할 수는 없습니다.(일부 예외가 있음)

 본 강좌

iOS 어플리케이션의 텍스트 저장방식은 크게 5가지로 나눌 수 있습니다.

1. 외부 언어 파일 이용(lproj)
2. 외부 언어 바이너리 이용(어플리케이션 폴더 내에 내장)

3. 메인 바이너리 내장
4. DLC 파일에 포함(게임 에피소드 등을 인앱결제, iAP 사용하는 어플)
5. 서버 텍스트 이용(인터넷 연결되지 않았을 시 이용 불가한 일부 어플)

첫번째 방식인 외부 언어 파일을 이용할 경우 손쉽게 한글화를 할 수 있으며 순정에서도 패치가 가능합니다. 또한 이 방식을 xcode(ios 어플리케이션 개발 툴)에서 지원하기 때문에 대부분의 어플리케이션이 외부 언어 파일을 이용합니다.

두번째 방식은 외부 언어 바이너리를 사용하는 경우인데 lproj 폴더가 아닌 어플리케이션 메인 경로에 언어 파일들이 들어있는 경우입니다.
이 경우에는 한글화가 가능할 수도 있고 불가능할 수도 있는데 바이너리 파일의 인코딩에 따라 달라집니다. 만약 바이너리 파일이 아스키 코드만을 사용하거나 S-JIS, 중국어등 타국가의 인코딩을 사용할 경우 3번 방식과 같이 메인 바이너리를 수정하지 않으면 한글화가 불가능합니다.


남은 어플리케이션이 나머지 3,4,5번째 방식을 사용할 경우 한글화하기가 매우 어렵습니다.

두번째 방식은 이전 강좌에서 보셧듯이 한글화하려면 바이너리 덤프 과정(이 또한 탈옥 필수)을 거쳐야하며 탈옥을 하지 않으면 패치가 불가능합니다.
세번째 방식은 또 두가지 경우로 나뉘는데 iAP로 추가된 파일에서 텍스트 파일이 따로 분리되어 있으면 구입자에 한해서 패치가 가능할 수도 있습니다.
하지만 텍스트와 인증 파일이 같이 합쳐져 있는 경우 한글화가 어렵습니다.(패치자 자신만 사용 가능)
네번째 방식은 서버에 텍스트가 저장되어 있으므로 한글화가 아예 불가능합니다. hosts 파일 해킹을 통해서 한글화가 가능할 수도 있으나 서버를 직접 구축하여야하며 탈옥 하지 않으면 역시 패치가 불가합니다.

제 블로그의 강좌에서는 위의 방식을 구분하는 간단한 방법과 외부 언어 파일을 이용하는 경우에 한해서만 다루며, 탈옥이 필요한 경우는 다루지 않습니다.

그럼 AppZappPush 어플리케이션을 예로 들어 보겠습니다.

일단 i-Funbox 등의 프로그램을 이용해서 어플리케이션의 경로로 들어갑니다.



경로로 들어가보면 여러 폴더가 보이는데 끝이 lproj 로 시작하는 폴더들이 보이실겁니다. 이 폴더들이 바로 외부 언어 파일을 저장하고 있는 폴더입니다.
lproj 앞에는 언어 약자가 붙는데
English(en).lproj 영어
ko.lproj 한국어
es.lproj 스페인어
fr.lproj 프랑스어
it.lproj 이태리어
ja.lproj 일본어
....
등등 입니다.(더 많은 언어 정보는 http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes 에서 639-1 항목을 보시면 됩니다.)

이 외부 언어 폴더 안에는 텍스트 파일 뿐만 아니라 각 언어별 이미지 파일 등도 들어있습니다. 그리고 언어 폴더가 있어도 텍스트가 포함되어 있지 않은 경우도 있습니다. 이걸 확인하는 방법은 간단합니다. lproj 폴더 내로 들어간다음 Localizable.strings 파일이 존재하는지 확인하시면 됩니다. 물론 이 파일이 있어도 내부 텍스트를 사용하는 경우도 있습니다..
그리고 lproj 폴더가 있음에도 Localizable.strings 파일이 없는 경우에는 lproj 폴더 안에 있는 모든 파일을 확인해서 텍스트가 존재하는지 확인하는 수 밖에는 없습니다. 만약 텍스트가 없는 경우로 확인되면 2,3,4,5번의 경우를 확인하셔야 합니다.
(만약 English.lproj 또는 en.lproj폴더 외에 다른 언어의 폴더도 있는 경우 1번 경우일 가능성이 높습니다.)

그럼 다시 AppZappPush 경로 내의 스크린샷을 보시면 ko.lproj 가 없는 것을 확인하실 수 있습니다. 바로 이 어플리케이션이 한국어 언어 파일을 제공하지 않고 있다는 뜻입니다. iOS의 언어 설정이 한국어로 되어 있지만 ko.lproj 폴더가 없기 때문에 기본 언어인 영어(English.lproj)에서 언어 파일을 불러오게 됩니다.
(* AppZappPush는 특이하게 English.lproj와 en.lproj 두 폴더가 모두 있습니다만 둘다 같은 폴더이므로 크게 상관 없습니다.) 
English.lproj 폴더로 들어가보겠습니다. 


폴더로 들어가보면 Localizable.strings 파일과 여러개의 이미지 파일이 있군요.
저 Localizable.strings 내에 텍스트가 저장되어 있을 가능성이 높아졌습니다.

그럼 이 Localizable.strings를 메모장으로 열어보겠습니다.

이런.. 이 어플리케이션은 바이너리 plist 파일을 사용하는군요.
파일의 맨 앞부분이 bplist로 시작하는 경우 바이너리 plist 파일이며 이 바이너리 plist 파일을 사용하는 경우에는 일반 텍스트 편집기로는 수정할 수 없고 일반 plist 파일로 변환을 하거나 바이너리 plist의 편집을 지원하는 에디터를 사용하여야 합니다.

자세한 수정 방법은 다음 강좌에서 다루겠습니다.


 강좌를 마치며

강좌 내용이 이해가 되셨나요?

오늘 강좌는 lproj를 이용하는 어플리케이션과 아닌 어플리케이션에 대해 소개하고 lproj를 사용하는 어플리케이션의 구조에 대해 알아보았습니다.
lproj를 사용하는 어플리케이션에 대한 강좌가 끝나면 두번째 방식인 외부 바이너리 텍스트 파일을 사용하는 경우에 대해서도 다룰 예정이며 3,4,5번째 방식은 일반적인 방법으로는 한글화가 불가능하므로 넘기도록 하겠습니다.

더 궁금하신 점이 있다면 메일 보내주시면 더 상세히 알려드리겠습니다. 

//

[iOS 한글화]i-Funbox를 이용해서 순정 iOS에서 한글패치 적용하기[iOS 한글화]i-Funbox를 이용해서 순정 iOS에서 한글패치 적용하기

Posted at 2012. 1. 27. 13:08 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
이번 포스팅은 한글화를 하는 강좌가 아닌 실제로 배포된 한글패치를 순정에서
적용하는 방법에 대해 알려드리겠습니다~!

탈옥 iOS에서는 여러가지 방법으로 패치가 가능하지만 순정 iOS에서는
샌드박스 시스템 때문에 샌드박스 접근이 가능한 프로그램을 사용해야만 합니다.

이때 사용되는 프로그램이 iExplorer 와 i-Funbox인데 얼마 전까지만 해도 iExplorer 만이 샌드박스 접근을 지원했기 때문에 iExplorer을 주로 사용해왔습니다.
하지만 iExplorer는 불안정하고 5번 액세스 제한, 퀵타임을 설치해야 구동이 가능하는 등의 불편한 점이 많았습니다.
i-Funbox는 이전에는 탈옥 iOS에서만 어플리케이션에 접근이 가능했지만 1.7 버전부터는 순정 iOS에서도 샌드박스 접근이 가능해져서 패치도 가능해졌습니다.

아이펀 박스는 아래에서 받으실 수 있습니다.(물론 아이튠즈는 설치되어 있어야합니다.)
http://www.i-funbox.com

자 그럼 아이펀 박스를 이용해서 한글패치를 적용해보도록 하겠습니다.(필자는 아이패드2에 유비트 플러스를 한글패치 해보겠습니다.)



우선 iOS 기기를 연결하고 아이펀박스를 실행합니다.



왼쪽의 사용자 어플리케이션을 누르고 패치 하려는 어플리케이션 경로로 들어갑니다.(경로는 패치 마다 다르므로 패치 설명서를 참고하세요.)




패치 파일들을 아이펀박스로 드래그해서 어플리케이션 폴더 안으로 복사합니다.


패치가 잘 적용된 것을 확인할 수 있습니다!

//

[iOS 한글화]순정에서의 한글패치와 탈옥에서의 한글패치[iOS 한글화]순정에서의 한글패치와 탈옥에서의 한글패치

Posted at 2012. 1. 27. 12:32 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
정말 오랜만에 작성하는 한글화 강좌 포스팅입니다.
새해 들어서 처음 작성하네요~!

말재주가 없어서 설명이 부족했던 부분이 기존 강좌에는 상당히 많은데
궁금하신 사항이 있으시면 언제나 댓글 달아주시거나 메일 주시기 바랍니다.(메일이 확인,답장이 빠릅니다..)

이번 강좌는 순정(Jailed) 에서의 한글패치와 탈옥(Jailbreak) 에서의 한글패치의 차이라는 주제를 다루겠습니다.

처음 올라온 iOS 어플 한글화 강좌에서 보셨듯이 iOS 어플리케이션에는 기본적으로 3개의 폴더가 존재합니다.
이 3개의 폴더중 어플리케이션의 이름으로 된 폴더([APPNAME]) 에 들어가보시면
또 어플리케이션 이름으로 되어있는 확장자가 없는 파일이 존재합니다.


AppZappPush의 메인 바이너리 파일



이 파일은 메인 바이너리로 어플리케이션의 실행 코드가 저장되어 있는 파일입니다. (PC로 치면 exe 파일과 같습니다.)

어플리케이션에 따라 외부 언어 파일을 사용하지 않고 이 메인 바이너리에 텍스트를 저장하는 경우가
있는데.. 이 메인 바이너리를 수정하게 될 경우 순정에서는 구동이 되지 않습니다.

그 이유는 퍼미션에 관련된 문제 때문인데, 애플에서는 순정 iOS에서는 퍼미션을 수정할 수 없도록
막아두었기 때문에 이 메인 바이너리를 수정해서 다시 넣을 경우 executable 권한이 없어서
실행 조차 할 수 없게 됩니다.

이 메인 바이너리를 수정해야 할 경우가 몇 가지 더 존재하는데 대부분의 어플리케이션에서는 유니코드를 사용하지만 ASCII 코드나 일본 어플의 경우 S-JIS를 사용하는 경우가 있습니다.
ASCII 코드나 S-JIS에는 한글 코드가 없기 때문에 유니코드를 사용하도록 코드를 변경해주거나 대응하는 유니코드가 입력되어 있는 매핑 테이블이라는 것을 수정해줘야 하는데 종종 테이블이 실행 파일 안에 있는 경우가 있습니다. 그리고 어플 자체 폰트를 사용하는 게임의 경우에도 폰트가 이 파일 안에 있을 수가 있습니다.

물론 이 메인 바이너리 파일은 암호화가 되어 있기 때문에 그냥은 수정할 수가 없고 모종의 과정을 거쳐야합니다.(이는 저작권에 위반될 수 있으므로 자세히는 다루지 않겠습니다..)

실상 이 메인 바이너리를 수정해야되는 어플의 경우 한글화를 포기하시는것이 좋습니다.
탈옥을 해야만 구동되며, 여러가지 복잡한 과정을 거쳐야하기 때문입니다.

그럼 간단하게 순정과 탈옥에서의 한글패치 차이에 대해 알아보았습니다.
여러분도 한글화 하고 싶으신 어플이 있으시면 우선 외부 언어 파일을 사용하는가..
어플의 자체 폰트를 사용하는가 등을 먼저 체크해보시는 것이 좋을 것 같습니다 ^^
//

[iOS 한글화]iOS 어플리케이션의 구조[iOS 한글화]iOS 어플리케이션의 구조

Posted at 2011. 9. 6. 12:57 | Posted in 테마 기획/iOS 한글화 강좌 시즌 1
많은 분들이 기다리시던 iOS 어플리케이션 한글화 강좌..
그 첫번째 글입니다.

iOS어플을 한글화하기 위해서는 우선 iOS 어플의 구조를 알 필요가 있습니다.


iOS 어플의 구조는 위와 같은데 우선 Documents 폴더에는 저장 파일, 추가 다운로드(DLC) 데이터 등이 저장됩니다.
이 저장 데이터들은 iTunes에서 백업할때도 같이 백업되는 데이터이지요.

다음으로 Library 폴더에는 설정 데이터가 저장되는데 중요하지 않은 부분이므로 넘어갑니다.

[APPNAME]에는 실제 어플 데이터가 들어있는 폴더입니다.([APPNAME]라고 해둔 것은 폴더 이름이 어플 이름 약자로 되어있기 때문입니다.)
어플 구동 파일이나 리소스, 어플 정보 등의 중요한 데이터는 모두 이 안에 들어있습니다.
이 구동 파일안에 스크립트가 들어있거나 폰트가 들어있는 경우 이 구동파일도 수정을 해줘야합니다만, 이 경우 순정에서는 패치가 불가능하게 됩니다.(파일 교체시 권한 때문에 구동 불가능)

다음으로 [APPNAME]안에 Localizable라는 구역이 있는데, en.lproj, ko.lproj 등의 뒤에 lproj가 붙은 폴더가 이에 속합니다.
이 안에는 각 국가별 리소스, 언어 파일(Localizable.strings)이 들어있고, 어플리케이션을 실행하고 iOS의 언어와 맞는 lproj 폴더를 찾은 뒤 없다면 기본 lproj를 불러옵니다.
어플이 현지화를 지원하게 설계되어있다면 이 언어 파일만 수정하면 쉽게 한글화가 가능합니다.(lproj 폴더가 존재하는 경우 Localizable.strings를 수정한 뒤 ko.lproj 폴더를 생성하고 그 안에 넣어주면 한글 iOS에서는 이 파일을 불러오게 됩니다.)

iOS 어플의 구조에 대해 간단히 알아보았습니다.
다음 강좌에서는 실제로 어플과 게임을 하나씩 한글화 해보려고 하며, 실제 어플 내의 폴더를 보면서 한글화를 시도해보겠습니다.
많이 기대해주세요~ 
//