-
안드로이드 리버싱 엔지니어링, 달빅(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 반 어셈블리 언어도 알아야한다는 결론에 도달한다.)
하지만 되는게 어디인가?
간단한 크랙킹 정도는 아마 쉽게 할 수 있지 않을까 싶다.