Project apk 디컴파일과 난독화(with Proguard) 201310016 이준형
목차 Decompile 언어적특성(Java) 난독화의 종류 난독화 툴 결론
Decompile .jar .class .java .xml Decompile .apk Easy to Decompile !!
Decompile Jar
Decompile Jar
Decompile Exe(Embedded Jar)
Decompile Exe(Embedded Jar) Copy & Save (.zip) 그 다음은 Jar과 같음
Decompile apk
Decompile apk Dex2jar 이용 Jar을 추출한 이후부터 Java와 동일
난독화의 필요성 증가 언어적 특성 다음은 언어별 역공학과 관련된 특성이다. Android 역시 Managed code의 형태 이므로 난독화가 쉬움 CPU 명령어 체계로 컴파일되지 않고 중간 언어(Intermediate Language)로 컴파일이 되기 때문에 역공학에 필요한 유용한 정보를 많이 포함 때문에 Native code에 비해 역공학이 용이함. 난독화의 필요성 증가
난독화의 종류 구획 난독화(Layout obfuscation) 구획 난독화는 클래스, 변수, 메소드 등의 식별자명을 의미없는 문자열로 변경하거나 디버깅 정보를 제거하는 기술을 말함. 의미없는 이름들로 채워진 소스의 루틴을 직접 분석하는 것은 어려움. 이 기술의 장점을 난독화 적용 전과 후를 비교해 보았을 때 실행 성능을 저하시키지 않는 장점이 있음
난독화의 종류 제어 흐름 난독화(Control flow obfuscation) 제어 흐름 난독화는 메소드 등의 제어 흐름을 변경하는 난독화 기술로 조건문이나 반복문을 변형하여 루틴을 파악하기 어렵게 하거나 별도의 제어 루틴을 추가하는 방식의 기술임. 불투명 술부는 항상 참이거나 거짓인 조건문을 삽입하는 기술로 결과적으로 수행되지 않는 불필요한 루틴이 추가됨.
난독화의 종류 제어 흐름 난독화(Control flow obfuscation) - 계속 루프 변환은 반복 루틴의 인덱싱에 변화를 주어 반복 루틴 분석을 방해하는 방식 ex) 메소드 변환은 여러 메소드 호출 루틴을 하나의 메소드로 변환하거나 하나의 메소드 호출을 여러 개의 메소드 호출로 변경하는 방식 이들 제어 흐름 난독화는 추가적인 루틴이 삽입되거나 변형되므로 최적화된 루틴 흐름이 변경되어 난독화 후의 성능이 저하되는 단점이 있음
난독화의 종류 그 외의 난독화 기술들 앞서 설명한 구획 난독화와 제어 흐름 난독화를 제외한 두 분류의 난독화가 추가로 존재함. 하지만 이들 역시 암호화-복호화를 거친다던지 무결성을 검증하는 루틴 등이 추가되어 있기 때문에 모두 성능의 저하를 불러온다.
Proguard 난독화 전 난독화 후 안드로이드에서 기본적으로 제공해주는 난독화 툴인 Proguard의 난독화 전과 후의 모습이다. 코드의 루틴은 변경되지 않았지만, 메소드 명과 변수명이 의미없는 알파뱃인 a, b, c, d, … 로 변경된 것을 볼 수 있다.
그 외의 난독화 툴들 위와 같이 Proguard는 식별자 변환과 디버깅 정보 제거 만을 제공해 주지만, 다른 상용 소프트웨어들도 존재함. 더 많은 기능을 제공해 주긴 하지만, 유료라는 단점이 있음. 또한 구획 난독화를 제외한 다른 난독화들을 수행하기 때문에 성능 저하는 피할 수 없음 Proguard는 구획 난독화만 수행하기 때문에 성능저하를 가져오지 않아서 적절한 모바일 환경에서의 난독화 기법이라고 볼 수 있음
결론 안드로이드는 Java와 마찬가지로 중간언어의 형태로 컴파일 된다. 이는 Java가 가졌던 장점과 마찬가지로 호환성에 있어서 아주 큰 장점을 주지만 반대로 소스코드를 노출할 수 밖에 없는 단점을 지니고 있음. 이 때문에 어플리케이션을 배포할 때 난독화를 시켜서 배포해야한다. 안드로이드에서 자체적으로 지원해주는 난독화 툴인 Proguard는 식별자 변환 및 디버깅 정보를 제거해 주긴 하지만, 이는 메소드 흐름이 그대로 남아있고, API 호출 정보 역시 남아 있어 리버싱을 통해 여전히 코드 분석이 쉽게 이루어질 수 있다. 기존 다른 난독화 툴들이 제공하는 기능들을 같이 이용하거나, 실행 파일을 패킹하는 것처럼 Java 코드를 암호화한 후 실행시점에서 제대로된 코드 형태가 되도록 만드는 방법을 적용시키는 것도 좋아보임. 하지만, 난독화 기법들을 많이 적용 시킬수록 성능이 저하되기 때문에 앱의 특성에 맞는 적절한 수준의 난독화 기법을 적용시키는 것이 좋음. (이것은 보안에 있어서 항상 화두가 됨. 보안성과 사용성이 적절히 조화되는 지점)
[1] 모바일 난독화 기술 동향 - Piao Yuxue, 정진혁, 이정현(2012.8) 참고 [1] 모바일 난독화 기술 동향 - Piao Yuxue, 정진혁, 이정현(2012.8) [2] 프로가드 난독화 도구 구조 및 기능 분석 - 위와 동일(2013.8) [3] http://biig.tistory.com/11 - apk파일 디컴파일하기