obad病毒整理彙總(最複雜精緻的android病毒)


起源

該樣本起源於一篇卡巴斯基實驗室的報告 1,被譽爲最複雜精緻的android病毒。


特色

一、AndroidManifest使用很是規方法構造。

左爲obad的AndroidManifest,右爲普通的AndroidMainifest。
能夠看出AndroidMainifest缺乏 android:name這樣的標籤 。這是一個之前不可知的Android小漏洞引發,解析時正常,但不添加這些標籤生成apk則會失敗。




二、類名高度混淆





三、字符串的使用均通過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




四、Api方法調用均使用反射




五、利用一個當時未知的設備管理器漏洞獲取不可卸載權限

誘導用戶激活設備管理器,但以後不可取消。
 


漏洞原理 4

       首先咱們來看一下Settings app如何造成設備管理器列表的:html

       相關類:java

       packages\apps\settings\src\com\android\settings\DeviceAdminSettings.java
android


   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「廣播就行。安全




動態分析相關



檢查網絡連接




申請設備管理器權限

根據卡巴斯基的報告會接收服務器指令,但跑動態分析的時候沒發現其接收指令,不知道是否如今已不起做用。




參考連接

其餘:



相關文章
相關標籤/搜索