Android-手機防盜

SMS機制收發短信

發送短信

發短信比較簡單,我們可以定義一個類,通過傳參(包括號碼與內容)的方式進行進一步操作。

import android.telephony.SmsManager;
import java.util.ArrayList;

public class SendMsg {
    String message;
    String phone;

    public SendMsg(String message, String phone) {
        this.message = message;
        this.phone = phone;
        SmsManager smsManager = SmsManager.getDefault();
        ArrayList<String> list = smsManager.divideMessage(message);
        for (String text:list) {
            smsManager.sendTextMessage(phone, null, text, null, null);
        }
    }
}

在manifest清單文件中加入權限聲明:

  <uses-permission android:name="android.permission.SEND_SMS" />

以上權限屬於危險權限,需要在程序運行時動態申請。在主MainActivity中加入運行權限:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 1);
        }
    }

    //接着就是重寫onRequestPermissionsResult
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //這裏寫操作 如send(); send函數中New SendMsg (號碼,內容);
                } else {
                    Toast.makeText(this, "你沒啓動權限", Toast.LENGTH_SHORT).show();
                }
                break;
        default:
    }

接收短信

廣播需要創建一個Receiver進行監聽短信的查收。如下:

手機被盜應急措施

市面上流行了很多安全衛士軟件,它們在手機被盜之後,都擁有遠程操控手機的功能,如播放報警鈴聲、獲取手機位置、遠程鎖屏、恢復出廠設置等等,這次我們就來看看怎麼實現這些功能。

報警鈴聲的實現

說起所有的遠程操控的功能中,就屬於報警鈴聲最容易實現了,所以我們先實現這個。

首先建立一個Android project,然後建立一個SmsReceive廣播接收者,沒錯,就是這個,我們的目的就是使用廣播接收者接收到短信,然後通過解析短信的內容來遠程操控手機。

SmsReceive代碼:

public class SmsReceive extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        
    }
}

那麼如何才能解析短信呢?這其實非常簡單,只要用以下幾行代碼就行了:

Object[] objs = (Object[]) intent.getExtras().get("pdus");
    for (Object obj : objs) {
        // 獲得短信內容
        SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj); // 此方法已過時
        String smsbody = sms.getMessageBody();
        String sender = sms.getOriginatingAddress();
        System.out.println("發件人:" + sender + "  內容:" + smsbody);
}

我們將這段解析短信的代碼加入SmsReceive廣播接收者的onReceive()方法之中,這時我們就可以監聽到短信的信息了!

但是且慢,我們還必須在mainfest中註冊廣播接收者才能生效,要時刻牢記Android四大組件都是必須要註冊才能生效的。

<receiver android:name="com.example.controldevice.SmsReceive" >
        <intent-filter android:priority="1000" >
            <!-- 獲取短信接收事件 -->
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
 </receiver>

另外,接收短信是屬於用戶的隱私,所以還需要添加權限,如下:

  <uses-permission android:name="android.permission.READ_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />

OK,這時候我們就已經成功的監聽到了短信了,夠簡單吧!現在就打開模擬器嘗試着發一條短信看看有沒有輸出吧!

前期準備工作已經完成,那麼我們就來操控報警短信吧。在SmsReceive廣播接收者的onReceive()方法中添加以下代碼:

public void onReceive(Context context, Intent intent) {

    Object[] objs = (Object[]) intent.getExtras().get("pdus");
    ······
        System.out.println("發件人:" + sender + "  內容:" + smsbody);
        
        if ("#*music*#".equals(smsbody)){
            System.out.println("快點播放音樂");
            // 播放音樂(需要在res目錄下的raw文件夾添加bestfriend的歌曲)
            MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.bestfriend); 
            mediaPlayer.start();
        } 
        }
    }
}

妥妥的,現在當你發送"#music#到你的模擬器時,廣播接收者就會解析短信,然後播放報警鈴聲。
真的是很簡單的一個項目呀~~~哎,不要吐槽,我們只是先來一點簡單的東西但開胃菜,剩下的就稍微有些難度了。

遠程鎖屏與恢復出廠設置

響起報警鈴聲是如此的簡單,那麼擦除手機數據(恢復出廠設置)和遠程鎖屏呢?擦除手機信息和遠程鎖屏屬於手機的危險操作,所以一般情況下是無法使用手機應用直接使用這些功能的。

這些高危操作都屬於手機管理員的操作,所以我們必須要獲得手機的超級管理員權限才能夠操作。需要注意的是手機超級管理員與root是不同的,手機超級管理員指的是獲得手機最高的權限,而root則是獲得手機的所有權限

如何獲得手機超級管理員權限呢?

手機超級管理員權限是在Android2.3的時候提出來的,它可以設置開屏密碼,禁用攝像頭,鎖屏等等,具體可以查看Android官網:https://developer.android.com/guide/topics/admin/device-admin.html

獲取超級管理員,首先要創建一個Admin類繼承自DeviceAdminReceiver,當然了,裏面可以重寫很多方法,但是我們現在先不理。代碼如下:

 public class Admin extends DeviceAdminReceiver {

 }

然後我們要在res資源目錄下創建一個xml目錄,在裏面創建device_admin_sample.xml。這個文件是用來說明開啓超級管理員後用戶所擁有的權限,代碼如下:

 <device-admin
  xmlns:android="http://schemas.android.com/apk/res/android">
   <uses-policies>
       <limit-password />
       <watch-login />
       <reset-password />
       <force-lock />
       <wipe-data />
       <expire-password />
       <encrypted-storage />
       <disable-camera />
   </uses-policies>
 </device-admin>

在manifest中註冊DeviceAdminReceiver,添加代碼如下:

  <receiver
      android:name="com.example.controldevice.Admin"
      android:description="@string/sample_device_admin_description"
      android:label="@string/sample_device_admin"
      android:permission="android.permission.BIND_DEVICE_ADMIN" >
      <meta-data
          android:name="android.app.device_admin"
          android:resource="@xml/device_admin_sample" />

      <intent-filter>
          <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
      </intent-filter>
  </receiver>

前置工作已經完成了,我們就來正式獲取管理員權限吧。我們在MainActivity中添加兩個按鈕,一個register按鈕,點擊打開激活超級管理員權限,另一個unregister按鈕,點擊取消激活超級管理員權限。

要注意的是如果激活了超級管理員權限,那麼以後是不能夠直接卸載這個app的,必須要取消激活超級管理員權限之後才能正常卸載。

MainActivity代碼如下:

public class MainActivity extends Activity {

  private DevicePolicyManager devicePolicyManager;
  private ComponentName componentName;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      devicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
      componentName = new ComponentName(this, Admin.class);
      Button register = (Button) findViewById(R.id.register);
       // Launch the activity to have the user enable our admin.
      register.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
              Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
              intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
              intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                      "激活超級管理員中");
              startActivity(intent);
          }
      });
    
      Button unregister = (Button) findViewById(R.id.unregister);
      // 取消激活超級管理員
      unregister.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
              if (devicePolicyManager.isAdminActive(componentName)){
                  devicePolicyManager.removeActiveAdmin(componentName);
              }
          }
      });
    }
}

在這裏我們遇到兩個陌生的API,一個是DevicePolicyManager,這個是設備權限管理器,使用它才能夠管理鎖屏、擦出手機數據等等功能。另一個是ComponentName,它用於打開其他應用程序中的Activity或服務的,因爲啓動超級管理員權限是要啓動Android內置Activity才能激活的,所以需要使用ComponentName

但我們點擊register按鈕的時候,app會直接打開另一個活動,不要慌,這是正常現象,點擊Activate激活即可激活超級管理員,界面如下:

在這裏插入圖片描述
當然了,這是用代碼的方法來激活超級管理員,你也可以直接在設置中激活,方法是:Settings-security-Device administrators-我們的app。要注意的是隻有繼承了DeviceAdminReceiver,以及在manifest註冊過之後纔會出現我們創建的app。

現在我們終於可以遠程擦除手機信息和遠程鎖屏了!回到我們的SmsReceive,繼續在onReceive()中添加代碼:

 public class SmsReceive extends BroadcastReceiver {
 
    private DevicePolicyManager mDevicePolicyManager;
    private ComponentName mComponentName;
   
    @Override
    public void onReceive(Context context, Intent intent) {
        
        mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
        mComponentName = new ComponentName(context, Admin.class);
    
        Object[] objs = (Object[]) intent.getExtras().get("pdus");
        for (Object obj : objs) {
            // 獲得短信內容
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
            String smsbody = sms.getMessageBody();
            String sender = sms.getOriginatingAddress();
            System.out.println("發件人:" + sender + "  內容:" + smsbody);
        
            if ("#*music*#".equals(smsbody)){               
                // 播放音樂
                MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.bestfriend);
                mediaPlayer.start();
            } else if ("#*wipedata*#".equals(smsbody)){
                // 擦出手機數據
                if(mDevicePolicyManager.isAdminActive(mComponentName)) {
                mDevicePolicyManager.wipeData(0);
                }
            } else if ("#*lock*#".equals(smsbody)){
                // 鎖屏
                if (mDevicePolicyManager.isAdminActive(mComponentName)){
                    mDevicePolicyManager.lockNow();
                }
            } 
        }
    }
}

這時候你發送短信#wipedata#或者#lock#就能實現遠程擦除數據和鎖屏了。不過需要提示的是擦出數據在模擬器中不太好用,有可能會導致模擬器卡死,還有小心在真機測試,這可真是會恢復出廠設置的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章