ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 리버싱 엔지니어링, 달빅(Dalvik)과 smali 코드에 대한 고찰
    정보통신에너지/스마트모바일 2016. 5. 6. 19:00


     

    요새 필요에 의해 안드로이드 apk 어플에 대한

     

    리버싱 엔지니어링을 조금 해보고 있다.

     

     

    혹시나 리버싱 엔지니어링이 뭔지 모르고 이 글을 보고 있는

     

    누군가를 위해..

     

     

    리버싱 엔지니어링이란 흔히 말해 프로그램을 뜯는 것을 말한다.

     

     

    컴파일이 완료된 프로그램으로부터 소스코드를 추출해서 분해한 후

     

    분석해서 뭔가 알고리즘을 알아내거나..

     

    아니면 아예 재조립해서 변형된 프로그램을 만드는 것을 뜻한다.

     

     

    어떻게 보면 해킹이라고도 볼 수 있는데

     

    여러모로 안 좋은 방향으로 활용되기 쉬운 것이 바로

     

    리버싱 엔지니어링이므로..

     

     

    그러나 상당히 개인적으로 중요하다 생각하는 부분이기도 하다.

     

     

    안드로이드 apk 어플 같은 경우..

     

    이론적으로는 100% 리버싱 엔지니어링이 가능하다.

     

     

    그 원리를 간단히 설명하겠다.

     

     

     

     

     

     

     

     

     

    안드로이드 apk 파일은 사실 zip 압축 파일인데

     

    확장자를 zip으로 바꾸면 압축이 풀리고

     

    압축을 풀면 하나의 셋이 나오는 것을 알 수 있다.

     

    여기서 핵심적인 실행 파일 부분, 소스 코드 부분은

     

    classes.dex 라는 파일에 다 들어있다고 보면된다.

     

     

    이 파일은 인터넷을 떠돌아다니는 다양한 디컴파일러들을 통해서

     

    자바 소스코드나 smail 형태의 달빅 소스로 디컴파일이 가능하다.

     

     

    자바는 흔히 알고 있을 것이고..

     

    이 smali 형태의 파일은 생소한 사람들이 많을 터인데

     

    소스코드를 살펴보면 어셈블리 언어 비스무레한데

     

     

    따로 달빅 오피코드라는 (한마디로 함수라고 보면 됨)

     

    셋에 의해서 작동이 되는 것을 알 수 있다.

     

     

    사실 안드로이드 리버싱 엔지니어링이 상당히 어려운 이유는

     

    거의 오픈소스 수준으로 모든 코드를 볼 수 있음에도

     

    자바 수준에서는 100% 디컴파일, 컴파일이 불가능해서

     

    오직 이 달빅 소스 코드 smali 레벨에서만 소스 코드 수정 및 재조립이 가능하다는 것이다.

     

     

     

     

     

     

     

     

     

     

    실제로 classes.dex 파일을 디컴파일러를 이용해

     

    자바 소스코드로 변환해보면 100% 변환이 안되는 것을 알 수 있고

     

    이 자바 소스를 다시 컴파일 해도

     

    아니면 수정해서 컴파일 해도

     

    완전히 단순한 코드가 아닌 이상

     

    컴파일이 안되는 것을 알 수 있다.

     

     

    아무래도 디컴파일러 들이 무료 배포인 만큼

     

    dex 파일로부터 100% 완벽하게

     

    자바 소스 코드를 해석해내거나 아니면

     

    해석해낸 코드를 dex 파일로 재조립하지 못하는게 아닐까 싶다.

     

     

     

     

     

     

     

     

     

     

    한 가지 가능한 전략은 바로

     

    smali 파일 수준의 달빅 소스 프로그래밍을

     

    배우는 것인데

     

    이 달빅 소스 레벨에서 소스를 수정해서

     

    다시 컴파일 하면

     

    잘되는 것을 볼 수 있다.

     

     

     

    허나 이것은 어셈블리 언어도 아니고

     

    반 어셈블리 언어...(오직 달빅을 위해서 만들어진 언어)

     

    이기 때문에 달빅 오피 코드라는 새로운 유니크한 언어를

     

    공부해야하고 원 소스는 자바 객체지향 프로그래밍이기 때문에

     

     

    결국 상당히 복잡하고 어려운 과정을 거쳐야

     

    리버싱 프로그래밍이 가능하다고 볼 수 있다.

     

     

    (apk 파일을 java로 변환해서 자바를 보면서

     

    파일 수정은 smali 레벨에서 해야하므로

     

    결국 자바 안드로이드도 알아야하고

     

    smali 반 어셈블리 언어도 알아야한다는 결론에 도달한다.)

     

     

    하지만 되는게 어디인가?

     

     

    간단한 크랙킹 정도는 아마 쉽게 할 수 있지 않을까 싶다.

     

     

     

     

     

    댓글