““XXX(机主姓名)看这个,ht://********XXshenqi.apk”最近一种手机病毒爆发,机主收到这样的短信,开头是以发送者手机通讯录存储的名字为开头,然后再让对方点开一个网页链接。


其实熟悉android的朋友一看就明白这个病毒原理其实很简单。下面就来谈谈这个病毒的原理和防范方法。


病毒的原理有两步:

1、获取通讯录联系人名称和号码。

2、以机主的语气自动发送短信。


一、通讯录联系人的获取。

Android中的联系人都保存在一个SQLite数据库中,有兴趣的可以用re文件管理器查看。

它的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db

一般我们只要关心这几张表

1.contacts 表
_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
times_contacted:通话记录的次数
last_time_contacted: 最后的通话时间
lookup :是一个持久化的储存 因为用户可能会改名子 但是它改不了lookup

2.data表

raw_contact_id:通过raw_contact_id可以找到 raw_contact表中相对的数据。

data1 到 data15 这里保存着联系人的信息 联系人名称 联系人电话号码 电子邮件 备注 等等。

3.raw_contact表
version :版本号,用于监听变化
deleted :删除标志, 0为默认 1 表示这行数据已经删除
display_name : 联系人名称
last_time_contacts : 最后联系的时间

<span style="font-size:14px;">/**得到手机通讯录联系人信息**/    private void getPhoneContacts() {  ContentResolver resolver = mContext.getContentResolver();    // 获取手机联系人  Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);      if (phoneCursor != null) {      while (phoneCursor.moveToNext()) {        //得到手机号码      String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);      //当手机号码为空的或者为空字段 跳过当前循环      if (TextUtils.isEmpty(phoneNumber))          continue;            //得到联系人名称      String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);            //得到联系人ID      Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);        //得到联系人头像ID      Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);            //得到联系人头像Bitamp      Bitmap contactPhoto = null;        //photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的      if(photoid > 0 ) {          Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);          InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);          contactPhoto = BitmapFactory.decodeStream(input);      }else {          contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contact_photo);      }            mContactsName.add(contactName);      mContactsNumber.add(phoneNumber);      mContactsPhonto.add(contactPhoto);      }        phoneCursor.close();  }     }  </span>

<span style="font-size:14px;">/**得到手机SIM卡联系人人信息**/     private void getSIMContacts() {  ContentResolver resolver = mContext.getContentResolver();  // 获取Sims卡联系人  Uri uri = Uri.parse("content://icc/adn");  Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,      null);    if (phoneCursor != null) {      while (phoneCursor.moveToNext()) {        // 得到手机号码      String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);      // 当手机号码为空的或者为空字段 跳过当前循环      if (TextUtils.isEmpty(phoneNumber))          continue;      // 得到联系人名称      String contactName = phoneCursor          .getString(PHONES_DISPLAY_NAME_INDEX);        //Sim卡中没有联系人头像            mContactsName.add(contactName);      mContactsNumber.add(phoneNumber);      }        phoneCursor.close();  }     }</span>

二、自动发送信息

下面是自动发送短信的代码,给了一个EditText框来编辑短信内容,一个发送按钮来用来发送短信,一个清除按钮用来清除刚刚编辑的EditText。当然,实际中病毒不会有这些界面的,它在获取了联系人后就直接用上面得到的姓名号码等信息编辑短信,然后发送出去。

<span style="font-size:14px;">public class SMSActivity extends Activity {      private EditText messageEditText;      private Button sendBtn;      private Button clearBtn;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.sms);          messageEditText = (EditText) findViewById(R.id.messageedittext);          sendBtn = (Button) findViewById(R.id.sendbtn);          clearBtn = (Button) findViewById(R.id.clearbtn);            sendBtn.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View v) {                  // 接收电话号码数据                  Bundle bundle = getIntent().getExtras();                  String phoneNum = bundle.getString("phoneNum");                  // 获取发送的内容                  String message = messageEditText.getText().toString();                  if (phoneNum == null || "".equals(phoneNum)) {                      Toast.makeText(SMSActivity.this,                              "Please input SMS Content!", Toast.LENGTH_SHORT)                              .show();                      return;                  }                  // 发送短信                  sendSMS(phoneNum, message);              }          });            // 置空message输入框          clearBtn.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View v) {                  messageEditText.setText("");              }          });      }        private void sendSMS(String phoneNum, String message) {          //初始化发短信SmsManager类          SmsManager smsManager = SmsManager.getDefault();          PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this,                  VoiceActivity.class), 0);          //如果短信内容长度超过70则分为若干条发          if (message.length() > 70) {              ArrayList<String> msgs = smsManager.divideMessage(message);              for (String msg : msgs) {                  smsManager.sendTextMessage(phoneNum, null, msg, pi, null);              }          } else {              smsManager.sendTextMessage(phoneNum, null, message, pi, null);          }          Toast.makeText(this, "Send Message Success!", Toast.LENGTH_SHORT)                  .show();      }  }  </span>


三、病毒防范
看到这里你会发现你的隐私可以随便被人窥探,是的,当你使用智能手机就不存在什么隐私了,现在随便一个app都会获取你的隐私数据。不是你不会被黑,只是你没有被黑的价值····

防范病毒最好的方法就是不要随便装来路不明的软件,不要轻易给软件root权限,这样可以保证你的数据只在正规的大公司手里,然后你只要祈祷你的数据不要哪天被他们泄露了就好····

看下面,我的手机上就有16款软件有权限发短信,30款有权限访问联系人和通话记录数据,甚至有15款可以监听手机通话!!算了,反正我就算被监听了也没什么价值= =!


END


参考:

http://blog.csdn.net/qq435757399/article/details/7947847

http://blog.csdn.net/zuolongsnail/article/details/6323513

更多相关文章

  1. Android聊天机器人
  2. Unity调用Android(安卓)jar包方法——(三、使用UnitySendMessage
  3. Android读取联系人的姓名及电话号码
  4. android Adapter体系
  5. Android(安卓)API :SMS短信服务处理和获取联系人
  6. ArcGIS for Android(安卓)离线数据图例加载
  7. Android数据类型之间相互转换系统介绍
  8. Android之异步任务加载网络数据
  9. Android(安卓)Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手

随机推荐

  1. android中关于class Build以及如何修改an
  2. android studio更新arr无效,API找不到
  3. Android TabHost两种实现方式
  4. No toolchains found in the NDK toolcha
  5. Android(安卓)Activity启动模式
  6. Android(安卓)SQLite数据库操作
  7. Android日志收集
  8. android屏幕适配建议 (二)
  9. Android中同时选择日期和时间
  10. Android初步了解入门