之前拿到的几个恶意样本,简单分析来学习一下


冒充10086发过来的短信,要积分兑换现金,然后点进去链接要输入银行卡密码


这里我们点激活


然后退回桌面
一会儿这个app就自己消失了,隐藏自己


进入应用管理页面 可以看到无法卸载

我们将apk文件改后缀为rar并解压得到classes.dex文件
这里通过dex2jar
jar2smali可以将dex文件反编译为smali代码
得到classes-out文件夹
然后自己造了一个轮子,用来提取一些关键信息,比如url链接,手机号,邮箱等等,主要还是通过正则表达式来进行匹配
代码如下
脚本还很垃圾 师傅们轻喷~

# coding:utf-8
import os
import re
a = []
ips = []
emails = []
emails_fin = []
phones = []
def deleteSameNum(num):
    num.sort()
    last = num[-1]
    for i in range(len(num)-2, -1, -1):
        if last == num[i]:
            del num[i] 
        else:
            last = num[i]
    return num

def bianli(rootdir):
    for root,dirs,files in os.walk(rootdir):
        for file in files:
            b = os.path.join(root,file)
            a.append(b)
        for dir in dirs:
            bianli(dir)

rootdir = 'classes-out/'  # dex文件 dex2smali
bianli(rootdir)
for i in a:
    file = open(i,'r')
    con = file.read()
    con1 = re.findall(r'[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}',con)
    con2 = re.findall(r'1[35678]\d{9}',con)
    con3 = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+',con)
    ips.append(con3)
    phones.append(con2)
    emails.append(con1)

def zhuan_(ffff):
    ffff_fin = []
    ffff = [x for x in ffff if x]  # remove 空元素
    for i in ffff:
        for i2 in i:
            ffff_fin.append(i2)  # two 2 one
    return ffff_fin

print deleteSameNum(zhuan_(emails))
print deleteSameNum(zhuan_(phones))
print deleteSameNum(zhuan_(ips))


可以得到一个地址
['http://wap.dzf10086.com/kk/ch.php']
将apk文件直接载入jeb分析
查看manifest文件

<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="1" android:versionName="1.0" package="iuxkikw.zkjaksj.jhyvu" xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-permission android:name="android.permission.WRITE_SMS" />
  <uses-permission android:name="android.permission.SEND_SMS" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.READ_SMS" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/qqq" android:label="@string/app_name" android:theme="@style/AppTheme">
    <activity android:label="@string/app_name" android:name="com.fhgfd.heee.MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <receiver android:description="@string/app_name" android:label="@string/app_name" android:name="com.fhgfd.heee.kc" android:permission="android.permission.BIND_DEVICE_ADMIN">
      <meta-data android:name="android.app.device_admin" android:resource="@xml/xyz" />
      <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
      </intent-filter>
    </receiver>
    <receiver android:name="com.fhgfd.heee.kd">
      <intent-filter android:priority="2147483647">
        <action android:name="b.b.b" />
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.USER_PRESENT" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
      </intent-filter>
    </receiver>
    <service android:name="com.fhgfd.heee.kse" />
  </application>
</manifest>

可以看到一些比较危险恶意的权限


这里就是激活设备管理器了
还向病毒制作者发送的短信 来通知告诉病毒制作者

入口还是MainActivity
看看MainActivity


ksj类


kapi类


可以知道是通过aes加密
写个简单的脚本来解密一下

package com.example.lib.tttest1;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class tttest1 {
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }


    public static String decrypt(String content, String key) {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(2, new SecretKeySpec(tttest1.parseHexStr2Byte(key), "AES"));
            String v3 = new String(cipher.doFinal(tttest1.parseHexStr2Byte(content)));
            return v3;
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String a = decrypt("37349EC2F427A1AF812DA757988CB9DE", "AE920882F4F5818501AB6256F91691D5");
        System.out.println(a);
    }
}

得到一个手机号
13066310152
ksj.cvh 就是 手机号的值
传入kapi.s函数的第一个参数

这里是获取手机设备的IMEI
this.getSystemService("phone").getDeviced()

String number = telephonyManager.getLine1Number();
获取手机号码 获取用户本机号码

向制作病毒的人的手机发送拦截的短信
ka类


向这个地址发出http网络请求
把用户的手机信息回传到这个地址

ke类

监控用户收件箱变化
删除拦截到的短信在用户短信收件箱的记录

kd类

用来收到收短信received,然后停止广播
获取短信内容
message.getOriginatingAddress()
获取发信人的手机号
message.getMessageBody()
获取短信内容,然后就是把短信发送到病毒制作者的手机上

通过分析可以知道该apk程序具有以下恶意意图
1.拦截短信
2.隐藏图标 诱导激活设备管理器权限无法卸载
3.监控收件箱 删除拦截到的短信在用户短信收件箱的记录
4.向病毒制作者的一个手机号 和 网站 发送拦截到的短信包括发送者的手机号,设备信息IMEI,设备的手机号等

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖