该样本起源于一篇卡巴斯基实验室的报告
1,被誉为最复杂精致的android病毒。
特点
1、AndroidManifest使用非常规方法构造。
左为obad的AndroidManifest,右为普通的AndroidMainifest。
可以看出AndroidMainifest缺少
android:name这样的标签 。这是一个以前不可知的Android小漏洞引起,解析时正常,但不添加这些标签生成apk则会失败。
2、类名高度混淆
3、字符串的使用均经过dexguard加密
2
解密脚本如下:
strings = [0x4C, 0xE, 2, 9, - 7, 0x10, - 54, 0x3E, 0x17, - 9, - 44, 0x4C, 0xA, ...]
c0, c1, c2 = (0x199, 0x3E, - 8)
def decrypt(length, curChar, pos) :
length += c0
curChar += c1
r = ''
for i in range(length) :
r += chr(curChar & 0xFF)
curEncodedChar = strings[pos]
pos += 1
curChar = curChar + curEncodedChar + c2
return r
解密后显示如下
3:
4、Api方法调用均使用反射
5、利用一个当时未知的设备管理器漏洞获取不可卸载权限
诱导用户激活设备管理器,但之后不可取消。
漏洞原理
4:
首先我们来看一下Settings app如何形成设备管理器列表的:
相关类:
packages\apps\settings\src\com\android\settings\DeviceAdminSettings.java
public class DeviceAdminSettings extends ListFragment {
DevicePolicyManager mDPM;
final HashSet<ComponentName> mActiveAdmins = new HashSet<ComponentName>();
final ArrayList<DeviceAdminInfo> mAvailableAdmins = new ArrayList<DeviceAdminInfo>();
@Override
public void onResume() {
super.onResume();
updateList();
}
void updateList() {
mActiveAdmins.clear();
List<ComponentName> cur = mDPM.getActiveAdmins();
if (cur != null) {
for (int i=0; i<cur.size(); i++) {
mActiveAdmins.add(cur.get(i));
}
}
mAvailableAdmins.clear();
List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers(
new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
PackageManager.GET_META_DATA);//通过查询广播”android.app.action.DEVICE_ADMIN_ENABLED“来得到可用的设 //备管理器程序列表
int count = avail == null ? 0 : avail.size();
for (int i=0; i<count; i++) {
ResolveInfo ri = avail.get(i);
try {
DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri);
if (dpi.isVisible() || mActiveAdmins.contains(dpi.getComponent())) {
mAvailableAdmins.add(dpi);
}
//如果应用已激活设备管理器&&注册了”android.app.action.DEVICE_ADMIN_ENABLED“就出现在可用设备管理器列表
} catch (XmlPullParserException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
} catch (IOException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
}
}
getListView().setAdapter(new PolicyListAdapter());
}
.......
class PolicyListAdapter extends BaseAdapter {
.......
public void bindView(View view, int position) {
final Activity activity = getActivity();
ViewHolder vh = (ViewHolder) view.getTag();
DeviceAdminInfo item = mAvailableAdmins.get(position);//显示mAvailableAdmins中数据
vh.icon.setImageDrawable(item.loadIcon(activity.getPackageManager()));
vh.name.setText(item.loadLabel(activity.getPackageManager()));
vh.checkbox.setChecked(mActiveAdmins.contains(item.getComponent()));
try {
vh.description.setText(item.loadDescription(activity.getPackageManager()));
} catch (Resources.NotFoundException e) {
}
}
}
}
由Android Settings App源代码可以看出,如果想在设备管理器列表中”隐身“,只要不注册”android.app.action.DEVICE_ADMIN_ENABLED“广播就行。
动态分析相关
检查网络链接
申请设备管理器权限
根据卡巴斯基的报告会接收服务器指令,但跑动态分析的时候没发现其接收指令,不知道是否现在已不起作用。
参考链接
其他:
腾讯手机管家:
Android手机出现史上最强木马 感染后无法删除
360手机卫士:
“史上最强Android木马”现身?360手机安全专家全面剖析