메뉴 건너뛰기

조회 수 8336 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

안드로이드 소스 코드 보호 기법

 

안드로이드 애플리케이션은 디컴파일을 위한 다양한 도구가 공개되어 있습니다. 설치파일인 APK 파일 또한 비교적 쉽게 획득이 가능합니다. 또한 APK 파일은 일반적인 ZIP 압축포맷으로 묶여 있습니다. 컴파일된 자바 클래스는 압축을 풀면 나오는 Classes.dex 파일에 있으며 이는 dex2jar JD_GUI등을 이용하여 비교적 쉽게 소스 코드로 변환 할 수 있습니다. 사실 디컴파일은 안드로이드 프로그래밍을 배우는 좋은 방법 중 하나라 할 수 도 있습니다. 스마트폰에서 실행되는 다양한 APK의 소스코드를 분석하고 따라 해보는 것만큼 좋은 방법이 어디 있겠습니까? 또한 디컴파일은 또한 프로그램 코드의 버그를 고치는 경우에도 유용하게 사용될 수 있습니다. 반면 개발자들이 만든 프로그램 코드를 보호하는데 있어서 이런 디컴파일 기법들은 가장 큰 적이기도 합니다.


현재까지 완벽하게 안드로이드 애플리케이션을 보호하는 기법은 알려진 것이 없습니다 하기 인용구를 보시면 소스코드를 보호한다는 것이 어떠한 의미인지 이해하는데 도움이 될 것입니다

 

‘[We want] to protect [the] code by making reverse engineering so technically difficult that it becomes impossible or at the very least economically inviable.’

(우리가 원하는 것은 역공학을 기술적으로 매우 어렵게 만들어서 소스 코드를 보는 것이 불가능하거나 그 비용이 엄청나게 많이 소요되도록 함으로써 소스 코드를 보호하는 것이다.)

- Christian Collberg, Clark Thomborson, and Douglas Low1


, 안드로이드에서 소스코드를 보호한다는 것은 완벽하게 막는 것이 아닌, 디컴파일을 매우 어렵게 만들어서 해커가 역공학을 하려고 할 때 최대한 많은 비용이 들게 만드는 것을 뜻하는 말입니다. 그럼 APK에 포함되는 정보를 제한하고 디컴파일을 가능한 어렵도록 하는 방법에 대하여 정리하여 보도록 하겠습니다.

 


- 두 가지 버전의 안드로이드 애플리케이션 제작


소프트웨어 산업에서는 사용자에게 애플리케이션을 홍보하기 위하여 평가판을 제공하는 경우가 많이 있습니다. 사용자들은 모든 기능을 사용할 수 있는 평가판을 다운로드 받아 사용할 수 있고, 평가판이 특정 기간이 지나거나 지정된 횟수만큼 사용하게 되면 더 이상 사용할 수 없게 하는 정책을 일반적인 소프트웨어 개발사들은 적용하고 있습니다. 이 정책은 기본적으로 사용기간이 지나면 사용자가 기쁜 마음으로 합당한 금액을 지불하고 소프트웨어를 구매할 것이라고 가정하기 때문에 사용되는 정책입니다.


 하지만 대부분의 개발자들은 이것이 양날의 검임을 잘 알고 있습니다. 이렇게 전체 기능을 제공하는 평가판 프로그램은 보호하기가 많이 힘들기 때문입니다.  그렇다면 잠재적인 구매 고객에게 이런 전체 기능을 제공하기 않고도 프로그램이 얼마나 좋은지 테스트하게 할 수 있는 방법은 무엇이 있을까요? 간단하게 생각해서 기본적인 기능만 사용할 수 있는 데모 버전 프로그램을 배포하는 것이 있을 수 있습니다.

 

물론 이런 방법을 사용한다 하더라도 사용자가 프로그램을 사서 이를 디컴파일 하는 것을 막을 수는 없습니다. 하지만 프로그램을 구매해야 한다는 점에서 해커들에게 일종의 장애물이 될 수 있을 것입니다.


 

- 난독화 적용


난독화는 소스 코드를 사람이 읽기 힘든 형태로 변환하는 것을 의미합니다. , 난독화란 어떤 디컴파일러가 사용할 수도 있는 정보를 프로그램에서 최대한 많이 제거하거나 알아보기 힘들게 하는 것을 말합니다. 이는 난독화 도구를 사용할 수도 있지만 개발자가 프로그래밍을 하면서 적용할 수도 있습니다.


 몇몇 난독화 도구들은 개발자들에게 컴파일러의 최적화 단계를 거치면서 코드가 어떤 식으로 변경되는지 예상해서 보여주기도 하지만 해커가 원래의 소스코드를 알아내기 힘들도록 나쁜 코딩을 하게 하는 것이 대부분 입니다.

 

주의할 점은 난독화를 할 경우 유지보수가 어려운 측면이 있고 어떤 난독화 기법이 사용되었는지에 따라서 그 성능에도 영향이 미칠 수 있다는 점입니다. 따라서 난독화를 적용할 때는 항상 주위를 기울여야 할 것입니다.

대표적인 난독화 도구로는 Google에서 제공하는 Proguard가 있습니다.

 


- 웹 서비스와 서버를 통한 부분 실행


코드 보안을 위해 간단하고 가장 효과적일 수 있는 방법입니다. 바로 안드로이드 소스 코드에서 서버와 클라이언트의 기능을 분리하고 따로 유지하는 것입니다. 사용자의 디바이스에 설치되는 apk는 중요한 기능을 전부 배제하고 서버의 기능을 사용하기 위한 GUI 만을 제공하게 제작합니다. 서버 쪽은 굳이 자바로 작성될 필요도 없으며 웹 서비스는 간단한 API를 통해 제공할 수 있습니다.

 

하지만 이 방법에서 중요하게 생각해야 할 부분이 있습니다. 바로 서버측의 API를 사용하기 위한 어떠한 사용자 이름이나 비밀번호가 노출되어서는 안 된다는 것입니다. 또한 이 방법은 사용자의 디바이스가 네트워크에 연결되어 있는 않을 때에는 어떻게 해야 하는가에 대한 문제점도 가지고 있습니다.

 

- 코드에 지문 씌우기

이 방법은 실제로 코드를 보호하지는 않지만 이 소프트웨어의 개발자를 증거할 수는 있는 방법입니다. 이러한 전자 지문은 이 소프트웨어가 원 저작자의 소스코드에서 파생되었으며 다른 사람이 마치 자신이 이 소프트웨어를 만들 것처럼 속이는 것을 방지 할 수 있습니다. 일종의 워터마크(Watermark)인 셈입니다.

좋은 전자 지문의 요건은 다음과 같습니다.


1.   실행되지 않는 코드를 가지는 더미 메소드나 더미 변수를 사용하지 말아야 합니다.


2.   프로그램의 일부만 도용된다 하더라도 전자 지문은 여전히 유효해야 합니다.


3.   애플리케이션의 성능에 영향을 미치지 말아야 합니다.


4.   전자 지문은 디컴파일 과정이나 난독화 도구에도 버틸 수 있을 정도로 안정적이고 단단해야 합니다.


5.   전자 지문이 도입된 바이트 코드는 자바 검증 도구를 통과할 수 있어야 합니다.


6.   클래스 파일은 다른 사람이 원래 있던 전자 지문을 자신의 것으로 바꿔 칠 수 없어야 합니다.


7.   암호키 등을 이용해서 전자 지문을 복구하고 살펴 볼 수 있는 디코딩 도구가 있어야 합니다. 전자 지문은 그냥 그 상태로 다른 사람이나 해커들에게 확인되는 형태가 되어서는 안됩니다.

 


- Native Method의 활용


 애플리케이션의 중요한 정보를 보호하는 또 하나의 방법은 이 정보들을 네이티브 라이브러리(.so)에 보관하는 것입니다. 네이티브 코드는 디컴파일되면 어셈블리 코드로 번역되며 어셈블리 코드는 디어셈블되지 않는 이상 읽기가 매우 힘듭니다.

 안드로이드 NDK는 안드로이드 SDK와 더불어 사용자가 안드로이드 애플리케이션 을 개발할 때 사용할 수 있는 도구로 특히 NDK는 애플리케이션을 네이티브 코드로 만들어 줍니다.


 한가지 알아야 할 점은 정적 문자열의 경우 단순이 네이티브 라이브러리 내부로 옮기는 것으로 문자열을 안전하게 보호할 수 는 없다는 것입니다. 간단한 문자열의 경우에는 so 파일을 텍스트 편집기를 통해 열어보면 금방 찾을 수 있습니다. 이와 같은 정보를 좀 더 안전하게 보관하기 위해서는 이 문자열 정보들을 여러 단위로 쪼갠 뒤에 서로 다른 위치에 보관하는 것이 좋습니다. 문자열을 따로 인코딩하여 넣는 방법도 있을 수 있습니다.

 

 

지금까지 개발자의 코드를 보호하는 몇 가지 방법에 대해 대해 알아 보았습니다. 서두에 기술 한 것처럼 현재 안드로이드 애플리케이션을 완전히 보호하는 기술은 존재하지 않습니다. 따라서 코드 보호에 관심이 있는 개발자라면 이를 위한 방법이 위와 같이 다양하게 있을 수 있다는 것을 생각하여 이에 대해 항상 고민하는 자세가 필요하다고 생각합니다.


List of Articles
번호 제목 날짜 조회 수
157 노티피케이션(Notification) 사용법 / Notification.Builder , NotificationManager file 2016.06.10 13470
156 어댑터 뷰(Adapter View) & 어댑터(Adapter) (1) file 2016.06.08 7852
155 Activity Data Transfor/ 액티비티 이동간에 데이터 전송하기 file 2016.06.07 7676
154 Activity Switching / 안드로이드 액티비티 전환 / 화면 전환 file 2016.06.07 8311
153 알아놓으면 좋은 내용정리 2016.06.07 7458
152 간단한 mp3 플레이어 만들기 , 음악넣기 , 노래재생 file 2016.06.07 14623
151 암시적 인텐트를 사용한 인터넷열기, 전화걸기, 문자보내기 [Intent (인텐트)] file 2016.06.07 7736
150 Intent (인텐트) 2016.06.07 7626
149 Android 와 JSP 간 파라미터 암복호화 (3) file 2016.05.26 8088
148 Android 와 JSP 간 파라미터 암복호화 (2) 2016.05.26 7735
147 Android 와 JSP 간 파라미터 암복호화 (1) file 2016.05.26 7474
146 카카오톡 대화내용 가져오기(sqlite3, chat_logs) file 2016.05.26 15116
145 카카오톡 분석하기 (2) - 카카오톡 암호화 함수 찾기 file 2016.05.26 9599
144 카카오톡 분석하기 (1) - sqlite 파해치기 file 2016.05.26 10063
143 안드로이드용 채팅프로그램 클라이언트(java), 서버(c#) 소스 file 2016.05.19 11722
142 네트워크 연결 상태 및 3G/WIFI 연결상태 체크하기 2016.03.18 7131
141 Android Push GCM 프로젝트 앱 적용 하기(2) file 2016.03.18 8953
140 안드로이드] 페이스북 같은 슬라이드 메뉴 만들기 file 2015.12.15 12536
139 Android TIP] strings.xml 에서 특수문자 사용하기 2015.12.15 6629
138 Android] Fragment 내부의adapter에서 startActivity 하기 2015.12.15 6487
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved