메뉴 건너뛰기

조회 수 8386 추천 수 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
번호 제목 날짜 조회 수
217 prepend(),append(),before(),after() 메서드 2014.10.20 7442
216 TextureView를 이용한 카메라 Preview 좌우 반전 2015.06.10 14441
215 안드로이드 NDK 개발환경 만들기 / 이클립스 NDK 설정 file 2015.06.10 7945
» 안드로이드 소스 코드 보호 기법 2015.06.29 8386
213 Java Applet과 javascript와의 통신 2015.06.29 7826
212 android SMS 리시버 2015.06.29 6917
211 폰갭(PhoneGap) & jQuery Mobile 로 안드로이드 어플 개발 file 2015.06.29 7898
210 폰갭(PhoneGap) 에서 페이지들간의 이동 2015.06.29 8639
209 폰갭(PhoneGap) 플러그인 사용하기 2015.06.29 7449
208 폰갭(PhoneGap) 플러그인 만들기 2015.06.29 8586
207 안드로이드 - 소방시설바이블 어플 소스 ( 폰갭, 폰갭플러그인, assets 폴더안의 파일 이용, pdf 리더기 선택, 유튜브재생기 선택 ) file 2015.06.29 8025
206 안드로이드 소스 - 카메라 플래쉬(Flash, 후라시) 앱 file 2015.06.29 9039
205 안드로이드 맵 API key (배포용 맵키) file 2015.07.01 8145
204 [Android 2.3] spinner file 2015.07.01 7719
203 [Android 2.3] SharePreference 2015.07.01 7110
202 Invalid project description 문제 file 2015.07.01 7165
201 푸시 서비스(GCM)에 대해 알아보자 file 2015.07.01 7081
200 블루투스(Bluetooth) 통신에 대해 알아보자 file 2015.07.01 8028
199 문자를 음성으로 변환(TTS)에 대해 알아보자 file 2015.07.01 7816
198 다운로드 매니저(DownloadManager)에 대해 알아보자 file 2015.07.01 9312
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved