Android锁屏勒索病毒分析
0x01 勒索病毒简介
勒索病毒是一种特殊的恶意软件,又被人归类为“阻断访问式攻击”(denial-of-access attack),其与其他病毒最大的不同在于手法以及中毒方式。其中一种勒索软件仅是单纯地将受害者的电脑锁起来,而另一种则系统性地加密受害者硬盘上的文件。所有的勒索软件都会要求受害者缴纳赎金以取回对电脑的控制权,或是取回受害者根本无从自行获取的解密密钥以便解密档案。
天下攘攘,皆为利往。自移动市场爆发式增长后,部分病毒制作者也瞄准这一块肥肉,针对性地开发各式各样伪装成辅助类的恶意软件,通过论坛、贴吧、Q群等途径广撒渔网,坐等受害者交付赎金。
0x02 样本信息
样本来源:ANVA反病毒联盟
应用名:刷赞小能手
包名:com.xcgdmmsj
SHA1:548B46CDF7D87849E3527AF87FE10A6AD29FC758

0x03 恶意行为分析
3.1 应用清单详情
从manifest.xml可得知该应用申请了发送短信、弹窗和震动等权限。分别注册了bbb和MyAdmin两个接收器,用于接收开机广播和激活设备管理器。
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xcgdmmsj" platformBuildVersionCode="23" platformBuildVersionName="6.0.1">
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<application android:debuggable="false" android:icon="@drawable/icon" android:label="刷赞小能手">
<activity android:name=".M" android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name="s"/>
<receiver android:name="bbb">
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver android:description="@string/hello" android:name=".MyAdmin">
<meta-data android:name="android.app.device_admin" android:resource="@xml/my_admin"/>
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
</intent-filter>
</receiver>
</application>
</manifest>
应用结构很简洁,没有涉及加固、混淆、加载so等防逆向手段。

3.2 诱导用户激活设备管理器及重置PIN密码
入口处使用ADRTLogCatReader记录软件运行期间所产生的日志,然后调用activiteDevice()。
@Override
public void onCreate(Bundle arg6) {
ADRTLogCatReader.onContext(this, "com.aide.ui");
super.onCreate(arg6);
this.activiteDevice();
}
activiteDevice()中通过隐式intent弹出激活设备管理器界面,然后反射调用MyAdmin()。

跟入MyAdmin,MyAdmin继承了DeviceAdminReceiver类(设备管理类)并重写onEnabled(),先从resource/raw/pin.txt
取出密文,然后通过M.getsss()
进行解密,再调用resetPassword()
重设PIN密码,最后反射启动s服务。

PIN密文:

解密算法:利用Base64加密自定义字符串转换的字节数组,使用subSequence()
截取字符串得到一个新的字符序列,再用Base64
进行解密得到明文。此处解密出的PIN密码为3366
。

04-27 18:31:56.700 5960-5960/me.yaorc.myapplication I/MainActivity: The plaintext is ->> 3366
3.3 置顶弹窗,勒索用户
跟入s服务,在onCreate()
中初始化弹窗,type
设置为2010
(最高级别,用户点击Home键也不会有反应),再调用addView()
置顶弹窗。

在界面留下解锁联系方式,解密内容为:加q2100311719

04-27 18:31:56.700 5960-5960/me.yaorc.myapplication I/MainActivity: The plaintext is ->> 加q2100311719
查看点击事件,逻辑是判断用户输入的内容,密钥正确则调用removeView()
删除置顶弹窗并结束线程。解密算法与解PIN码是一致的,都是获取raw下某个文件的内容后调用getsss()
进行解密。此处的解锁密码为336699
。

04-27 18:31:56.700 5960-5960/me.yaorc.myapplication I/MainActivity: The plaintext is ->> 336699
恶意行为逻辑整理:通过伪装成"刷赞"类软件进行传播,运行时诱导用户激活设备管理器,用户激活后修改PIN码和置顶弹窗,预留联系方式供用户联系或付款给制作者,对用户进行勒索。
另外,在代码中发现另外一种随机密钥,但没用上。回到s服务的onCreate()
方法,得知锁机码生成公式为:随机数+1010
。

然后采取DES算法通过密钥bah
解密内容c29fe56fa59ab0db
,实例化DU
类得到第二个密钥,对锁机码进行加密,保存在/data/data/com.xcgdmmsj/shared_prefs/bah.xml
中



解密锁机码,用于判断。

0x04 病毒清理及预防
4.1 前提:手机已root,开启usb调试。
-
连接配置好adb环境的电脑,通过dumpsys命令
adb shell dumpsys activity top
获取包名获取栈顶活动
-
进入su模式,再使用
am force-stop com.xcgdmmsj
便可强制杀掉这个进程强制停止活动
-
此时置顶弹窗已消失,但PIN密码也被重置了,需要删除
/data/system/password.key
删除PIN密码文件
-
最后在设置里取消激活设备管理器和卸载软件,重启手机即可。
4.2 手机无Root,未开启USB调试。建议备份数据后重新刷机。
4.3 预防建议
- 去正规的应用市场下载APP;
- 预装手机杀毒软件,锁机类病毒大部分能在运行前揪出来;
0x05 总结
- 这一类恶意软件通常会伪装成辅助软件,如刷钻、刷赞、抢红包。
- 诱导用户激活设备管理器,利用WindowManager和DeviceAdminReceiver实现置顶弹窗和PIN密码更改,加上震动、播放不良BGM等恶搞操作对不幸中招的用户施加心理压力。
- 据各大安全公司的报道,勒索软件从木马制作、传播、收款已经发展成一条较为完整的黑色产业链。可以从传播源、收款账号配合社工进行溯源,找到这条船的掌舵手。