Android/App개발2010. 10. 20. 11:20

상용이던 개인용이던 안드로이드는 자바코드를 사용하기 때문에 dex tool과 jad tool등을 이용하면 decompile을 통한 reverse engineering이 가능하다.
이를 해결하기 위해 코드난독화툴을 이용하여 reverse를 어렵게 하는 방법을 사용하게 된다. proguard는 코딩을 어떻게 하느냐에 따라 난독이 아니라 불독(?)하게도 가능하다. 즉 전혀 해독이 불가하게 할수도 있다는 것이다.

proguard툴은 stand-alone형태로 사용해도 되나 android project에 포함시켜서 구동시키면 좀더 쉽게 사용이 가능해진다. 
이 포스트는 그 방법에 대해 설명한다.

요구사항
1. Android SDK version 7이상을 사용해야 함
  -> ANT 빌드규칙에 컴파일이전과 이후단계에서 일정한 작업을 추가할 수 있는 구조를 지원한다.
2. Proguard 설치

절차
커맨드라인에서 수행함.
1. 특정프로젝트에 대한 build.xml을 만듦
    android update project --path ./MyAndroidProject
  build.xml파일이 생성됨. 실제 빌드를 아래와 같이 수행.
    ant release
  빌드가 되고 서명되지 않은 앱이 생성됨. 이 후 서명툴을 이용하여 서명된 앱을 만들수 있슴.
2. 서명된 앱 빌드하기
  ant release명령으로 빌드하면 빌드과정에서 생성된 local.properties파일을 수정
    key.store=/Path/to/my/keystore/MyKeystore.ks
    key.alias=myalias
  ant release
3. 코드 난독화과정 
  add-proguard-release.xml, procfg.txt파일을 build.xml파일 위치에 복사
  local.properties에 proguard설치 경로 지정
    proguard.dir=/Directory/Proguard/proguard4.5.1/lib
  build.xml에(최상단에위치) 아래 내용 추가
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project [
      <!ENTITY add-proguard-release SYSTEM "add-proguard-release.xml">
    ]>
  build.xml의 project tag안에 위에서 선언한 XML entity를 포함시킴
    <project name="MyProjectName" default="help">
    &add-proguard-release;
  위의 모든과정이 완료되었으면 빌드
    ant release

**  주의 사항  **
난독화 도구를 사용하는 경우 빌드후 앱이 정상적으로 동작하지 않을 수있다. 이는 난독화를 하지 않아야 하는 부분들까지도 난독화가 이루어져서 코드가 동작하지 못하는 경우가 발생하는 경우이다. 예를 들어 AndroidManifest나 class name, jni or reflection등을 통해 실제 메소드의 이름을 참조하고 있는 메소드들까지도 난독화를 통해서 작업이 이루어질 수 있다.
첨부된 procfg.txt에는 이런 룰을 지정할수가 있습니다. 이는 proguard 인자들중 keep인자 파라메터를 지정하는 방법에 따름인데 아래와 같은 명령을 추가하면 클래스이름을 찾지 못하는 문제는 방지 가능하다.

-keep public class * [my classname]

** 빌드중 obj directory가 생성되는데 여기에는 디버깅을 위한 다양한 출력파일들이 저장된다. 디버깅시 이용가능한다.
** mapping.txt 은 클래스가 어떤식으로 난독화 되었는지 기록한다.
** mac에서만 발생하는지 확인되지 않았으나 위 과정 진행중.. 아래와 같은 에러메세지가 나올수 있다.
add-proguard-release.xml:31: Expecting class path separator ':' before ';' in argument number 1
  이 경우 add-proguard-release.xml파일의 line35을 아래와 같이 수정하면 된다.
-libraryjars ${external.libs.dir};${libraryjarpath} -> -libraryjars ${external.libs.dir}:${libraryjarpath}


Posted by 삼스