之前拿到的几个恶意样本,简单分析来学习一下
冒充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,设备的手机号等