본 문서는 안드로이드(Android) 기반에서의 APK 동적 디버깅 기법에 대해 작성하였습니다. 해당 내용은 아래와 같이 2개의 주제로 나눠 연재하겠습니다.
 

1. '안드로이드 기반 동적 디버깅 환경 구축'
2. '안드로이드 APP Code Patch 기법'



안드로이드 App Code Patch 기법


Android APP에서는 smali코드추출 후 수정과 새로운 코드의 첨부가 가능하여 APP의 기능 수정 및 첨부가 가능합니다. 이런 특징으로 인하여 genimi와 같이 타 APP에 악성 코드가 삽입되어 재 배포되는 악성코드가 발견되고 있습니다.
코드 패치 대상은 간단한 테트리스 게임이며, 게임을 위해 다음 블록이 내려 올 때 동일한 블록이 내려오도록 코드를 패치하는 것이 목표입니다.


1. Code Patch
코드 분석 결과 동일한 블록이 생성되도록 패치 해야 할 곳은 두 곳 입니다. 처음으로는 실제 블록이 발생하는 부분인 TetrisShape.java에서 spawn()함수입니다. 이 함수는 다음 전송되는 블록의 번호를 얻어 오며 그 결과를 v1레지스터에 반영하여 mNextType변수에 결과를 저장합니다.
 

다음은 TetrisShape.java에서 getNextType함수입니다. 이 함수는 다음 생성되는 블록의 그림값을 v0에 반영하여 NextType부분에 그려주어 게이머가 다음 블록을 예측하여 전략을 만들 수 있도록 합니다.

                                                   [그림 1] 다음 블록의 값을 얻어오는 부분


블록의 값을 확인해 보기 위하여 V0값을 2로 수정을 해봅니다. 그러면 에뮬레이터에서 [NEXT] 부분을 보면 다음 나올 블럭의 모양이 변경되는 것을 확인할 수 있습니다.

                                                                     [그림 2] v0값 변경


                                                            [그림 3] v0값이 2일 때 블록 값


다음은 긴 막대기에 해당되는 v0값을 0으로 수정하였습니다.

                                                             [그림 4] v0값 0으로 수정


                                                                [그림 5] 다음 블록 값 확인


긴 막대의 값을 확인 한 결과 v0값이 0으로 항상 일정 하다면 항상 긴 막대의 그림으로 표시 될 것이므로, 이 부분을 패치 합니다.

                                                                   [그림 6] 코드 패치


다음은 실제 생성되어 내려오는 블록의 값을 수정하는 부분입니다. NextInt()함수를 통해 다음 블록의 값을 얻어와 mNextType에 적용하는 부분으로 v1의 값이 항상 0으로 동일하다면 긴 막대가 내려 올 것이므로 이 부분을 패치 합니다.

                                                             [그림 7] v1값 동일하게 코드 패치


치 결과 긴 막대만 나오는 것을 확인할 수 있습니다.

                                                                       [그림 8] 에뮬레이터 결과

                                                                    [그림 9] 막대기만 생성됨

지금까지 안드로이드(Android) 기반에서의 APK 동적 디버깅 기법을 통해서 정상적인 어플리케이션을 조작하는 (Code Patch) 것까지 알아보았습니다. 공격자는 이런 기법들을 통해서 안드로이드 마켓 or 블랙 마켓 등에 등록되어 있는 정상적인 App에 악의적인 코드 삽입을 할 수 있습니다.


사용자들은 의심되는 어플레케이션(App)은 설치 하지 않아야 하며, 스마트폰 백신을 통해
보안을 할 수 있도록 해야 합니다.


참고 자료
[1] http://code.google.com/p/android-apktool/wiki/SmaliDebugging
[2] http://www.youtube.com/watch?v=P_Zyf7jFbx4
[3] http://code.google.com/p/android-apktool/issues/detail?id=88&colspec=ID Stars Type Status Priority Milestone Owner Summary
[4] http://pastebin.com/ge39wRZS