project/android / / 2016. 3. 17. 20:01

Android Code Obfuscation

코드난독화란 , 불법적인 소프트웨어 역공학(리버싱,etc)등으로 프로그램의 코드를 보호하기 위해 특정방식으로 변환하여 바이너리나 소스코드가 역공학에 의해 분석되는것을 어렵게 하기위한 기술이다.


그 코드난독화는 데스크탑 어플리케이션을 포함해 모바일 어플리케이션들도 다 대부분 사용되는 기술인데, 프로그램의 컴파일된 형태에 따라 분석할 수 있는 방법이 다른데 가령 C,Java,C# 들이 컴파일된 파일코드는 바이너리 코드라고 불리고 C의 바이너리 코드는 네이티브코드, JAVA,C#의 컴파일된 파일코드는 바이트코드(매니지드 코드)라고 불리는데 이들의 공통점은 중간언어로 컴파일된 바이너리 코드라는점이고, 보안상 역공학시 필요한정보가 많이 포함된 바이트코드는 네이티브코드보다 보안성이 떨어진다. 네이티브 코드인 Object-C를 사용하는 ios는 보안상 소스코드 유출의 문제가 크지않지만, 대부분 Java로 코딩하는 android는 보안상 취약하다. 이러한 이유로 android의 코드 난독화는 중요한 요구사항이라 볼 수 있다.


안드로이드의 난독화 도구는 'Proguard', 'DashOpro', 'Allatori', 'Dex Guard' 등이 있다.


우리는 이 툴들이 이용하는 난독화방법을 분석해볼것이다.


자바에서 주로 사용되는 난독화기법으로는 식별자변환, 제어흐름, 문자열 암호화, API은닉, 클래스 암호화를 들수있다.

(불리는 이름은 기법마다 다를 수 있음)



1. 식별자 변환 난독화 테크닉

난독화중 가장 많이 쓰이는 방법이며 'Proguard'프로그램을 돌리게되면 식별자가 변환되어 난독화된다.


Proguard에 쓰이는 난독화모듈을 예로 들어 설명하자면, 이 난독화 모듈은 읽기모듈, 초기화모듈에 의해 생성된 엔티티 객체들을 통해 식별자변환기법을 적용하는데 패키지, 클래스, 필드, 메소드의 파일포맷의 이름들을 무의미한 알파벳으로 바꾸어 버린다.

그리고 지역변수의 정보속성, 디버그속성들을 다 제거해버리기 때문에 디버깅(역컴파일툴) 했을 때, 코드 분석을 더 복잡하게 할 수 있다. 상세한 식별자변환 절차 과정을 세세하게 나누어보면


1) 엔티티 클래스들의 visitorInfo 필드를 null로 초기화시킨다.


2) 상속관계를 이룬 클래스들의 메소드를 연결시킨다.


3) 난독화를 보류할 클래스, 필드, 메소드, 속성들을 검사한다 [(선택적)?]


4) 제거 가능한 속성들을 제거한다.


5) 클래스, 필드, 메소드의 이름을 무의미한 알파벳으로 변환시킨다.


6) 상수 풀에서 사용되지 않는 상수 자료 구조들을 제거한다.

'project > android' 카테고리의 다른 글

class file format  (0) 2016.03.17
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유