[HACKING] APKInspector를 이용한 Android Malware 분석하기 2 - APKInspector를 이용한 Malware Analysis

[HACKING] APKInspector를 이용한 Android Malware 분석하기 1 - APKInspector 설치하기(Install APKInspector) [HACKING] APKInspector를 이용한 Android Malware 분석하기 2 - APKInspector를 이용한 Malware Analysis

이번 포스팅에선 APKInspector를 통해 악성앱 분석 시 어떠한 정보를 얻어낼 수 있는지에 대한 이야기를 할까 합니다.

분석을 위해 일단 APKInspector 를 실행합니다.

python startQT.py

아래와 같이 창이 열리게 됩니다.

분석할 APK를 불러오기 위해서는 File->New 를 선택하거나 아래 상자+ 버튼을 선택하면 불러올 수 있습니다. 맨 처음 로딩 시 주요 의심가는 퍼미션에 대해 alert을 발생시키고, Android Manifest와 APK 정보 창을 나타냅니다.

좌측의 Main View는 분석에서 주로 사용되는 창이며 각 클래스, 메소드 별 Java,Smali 및 흐름 그래프 call/out 등을 볼 수 있는 창 입니다.

오른쪽의 SideView는 메뉴판과 비슷한 역할을 합니다. APK 구성 정보부터 File List, 주요 Method 등의 정보 확인이 가능하며, 각 메소드 클릭 시 Main View에 적용되어 Main View에서 해당 메소드에 대한 정보를 나타내줍니다.

이 툴 단일로는 분석이 어려우나, dex2jar -> jd-gui를 통한 분석 방법과 함께 악성앱 분석 시 굉장히 도움이 될 수 있는 도구입니다. 특히 복잡하게 난독화가 되거나 네이티브 코드에 대해 리버싱이 필요할 경우 어느정도 참고하며 분석이 가능합니다.

일단 우측에 있는 APK Info로 패키지명, 퍼미션에 대해 확인이 가능합니다. (border=undefined height=undefined style=undefined width=undefined) 제가 선택한 앱에서는 아래와 같은 퍼미션이 확인되네요.

android.permission.INTERNET android.permission.ACCESS_WIFI_STATE android.permission.CHANGE_WIFI_STATE android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_COURSE_LOCATION android.permission.ACCESS_FINE_LOCATION android.permission.READ_PHONE_STATE android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.RECORD_AUDIO android.permission.CALL_PHONE android.permission.READ_CONTACTS android.permission.WRITE_CONTACTS android.permission.RECORD_AUDIO android.permission.WRITE_SETTINGS android.permission.CAMERA android.permission.READ_SMS android.permission.WRITE_EXTERNAL_STORAGE

Main View에서도 Android Manifest 파일을 통해 퍼미션 확인이 가능합니다.

CFG를 통해 흐름을 볼 수 있고 해당 메소드에서 Dalvik 단의 호출 데이터를 볼 수 있습니다.

0x0 const/4 v9 , [#+ 1] , {1}

0x2 const/4 v8 , [#+ 0] , {0}

0x4 const-string v4 , [string@ 163 https]

0x8 invoke-virtual v10 , v4 , [meth@ 57 Ljava/lang/String; (Ljava/lang/String;) Z startsWith]

0xe move-result v4

0x10 if-eqz v4 , [+ 57]

0x14 new-instance v4 , [type@ 43 Ljava/net/URL;]

0x18 invoke-direct v4 , v10 , [meth@ 77 Ljava/net/URL; (Ljava/lang/String;) V ]

0x1e invoke-virtual v4 , [meth@ 78 Ljava/net/URL; () Ljava/net/URLConnection; openConnection]

0x24 move-result-object v3

0x26 const-string v4 , [string@ 127 com.metasploit.stage.PayloadTrustManager]

0x2a invoke-static v4 , [meth@ 46 Ljava/lang/Class; (Ljava/lang/String;) Ljava/lang/Class; forName]

0x30 move-result-object v4

0x32 const-string v5 , [string@ 233 useFor]

0x36 new-array v6 , v9 , [type@ 62 [Ljava/lang/Class;]

0x3a const-class v7 , [type@ 44 Ljava/net/URLConnection;]

0x3e aput-object v7 , v6 , v8

0x42 invoke-virtual v4 , v5 , v6 , [meth@ 48 Ljava/lang/Class; (Ljava/lang/String; [Ljava/lang/Class;) Ljava/lang/reflect/Method; getMethod]

0x48 move-result-object v4

0x4a const/4 v5 , [#+ 0] , {0}

0x4c new-array v6 , v9 , [type@ 63 [Ljava/lang/Object;]

0x50 aput-object v3 , v6 , v8

0x54 invoke-virtual v4 , v5 , v6 , [meth@ 69 Ljava/lang/reflect/Method; (Ljava/lang/Object; [Ljava/lang/Object;) Ljava/lang/Object; invoke]

0x5a invoke-virtual v3 , [meth@ 80 Ljava/net/URLConnection; () Ljava/io/InputStream; getInputStream]

0x60 move-result-object v1

0x62 new-instance v2 , [type@ 21 Ljava/io/ByteArrayOutputStream;]

0x66 invoke-direct v2 , [meth@ 31 Ljava/io/ByteArrayOutputStream; () V ]

0x6c new-instance v0 , [type@ 22 Ljava/io/DataInputStream;]

0x70 invoke-direct v0 , v1 , [meth@ 32 Ljava/io/DataInputStream; (Ljava/io/InputStream;) V ]

0x76 sget-object v4 , [field@ 5 Lcom/metasploit/stage/Payload; [Ljava/lang/String; parameters]

0x7a invoke-static v0 , v2 , v4 , [meth@ 12 Lcom/metasploit/stage/Payload; (Ljava/io/DataInputStream; Ljava/io/OutputStream; [Ljava/lang/String;) V readAndRunStage]

0x80 return-void

0x82 new-instance v4 , [type@ 43 Ljava/net/URL;]

0x86 invoke-direct v4 , v10 , [meth@ 77 Ljava/net/URL; (Ljava/lang/String;) V ]

0x8c invoke-virtual v4 , [meth@ 79 Ljava/net/URL; () Ljava/io/InputStream; openStream]

0x92 move-result-object v1

0x94 goto [+ -25]

동일한 내용을 ByteCode로도 볼 수 있구요.

Call/out 기능에서는 메소드의 호출 순서를 볼 때 도움이 됩니다. 문자열 난독화로 따라가기 힘든 소스에서 조금 도움이 될 것 같네요.

마지막으로 APK 내 포함되어 있는 String 리스트에 대해서도 확인할 수 있습니다.

이러한 정보를 통해 dex2jar,jdgui 조합의 분석에서 좀 더 심도있는 분석을 진행할 때 도움이 될 수 있는 좋은 툴 입니다.