obad病毒整理汇总(最复杂精致的android病毒)


起源

该样本起源于一篇卡巴斯基实验室的报告 1,被誉为最复杂精致的android病毒。


特点

1、AndroidManifest使用非常规方法构造。

左为obad的AndroidManifest,右为普通的AndroidMainifest。
可以看出AndroidMainifest缺少 android:name这样的标签 。这是一个以前不可知的Android小漏洞引起,解析时正常,但不添加这些标签生成apk则会失败。
05114118_rnd4.png 05114119_yhzx.png




2、类名高度混淆

05114119_AvU6.jpg




3、字符串的使用均经过dexguard加密 2

1


解密脚本如下:
strings  = [0x4C, 0xE,  29- 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
05114121_fCds.png




4、Api方法调用均使用反射




5、利用一个当时未知的设备管理器漏洞获取不可卸载权限

诱导用户激活设备管理器,但之后不可取消。
05114121_0vRh.jpg  05114121_VhIw.jpg


漏洞原理 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“广播就行。




动态分析相关



检查网络链接

05114122_iMSA.png



申请设备管理器权限

05114122_8XOD.png
根据卡巴斯基的报告会接收服务器指令,但跑动态分析的时候没发现其接收指令,不知道是否现在已不起作用。




参考链接

其他:





转载于:https://my.oschina.net/u/1416685/blog/181682

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值