AccessibilityService實現今日校園自動簽到/守護進程/定時自動喚醒/自動解鎖/繞過Android系統解鎖

今日校園自動簽到/守護進程/定時自動喚醒/自動解鎖

本人是長江師範的大三狗,閒來無事,就對今日校園下了狠手,

寫這個app研究了大量地Android源碼,結構體系,弄了幾天真的是煞費苦心,

說實話對我這個大三狗的Android個人開發經驗提升蠻大的。

另外本人還發現了Android一個有趣的漏洞,在自動解鎖提到,

可以對這個漏洞進行一個自己想法拓展,有興趣的朋友可以看看。

以下內容僅供學習,切勿用於商業用途。

源碼地址:https://github.com/dingyadong/TodayScampusAutomaticSignIn

喜歡的老哥點個star吧!

本項目由AccessibilityService服務開發實現了一下幾大功能:

自動簽到:

功能主要通過AccessibilityService服務進行自動化操作,
每個同學的簽到過程可能不一,有些同學可能需要拍照或者點擊其他按鈕,可以在源代碼中適當修改一下。

保活進程/定時拉活

主要採用的BroadcastReceiver以及AlarmManager搭配定時廣播保活方式守護進程,
做這個保活進程的很大一部分原因是因爲,高版本的Android系統採用了進一步的優化省電策略,
用戶在一段時間沒有操作後,進程會被自動殺死,爲了保證我們的app能夠順利得進行自動化簽到,
就必須要進行進程保活。這個主要是到達指定的精確時間,自動拉活我們的程序。

定時自動喚醒

這個功能不用多解釋,主要是AlarmManager定時服務來喚醒手機,
android8.0及以上版本在對手機息屏後都CPU都會進入休眠狀態,
所有的線程、廣播、服務都會停止。
這一塊功能主要解決了AlarmManager定時不準確的問題,能適應手機相應的版本

自動解鎖

出現的問題

這一塊功能相當費勁,原本我想通過讓app自動解鎖打開第三方軟件的,
但是手機在有密碼鎖或者指紋鎖等鎖的權限時,息屏無法打開第三方(今日校園)的軟件,
只能打開本軟件的activity,主要是因爲android的安全性,無法完成這一些操作;
最後實驗無果,換了種思路就是手機在沒有密碼鎖(或人臉鎖等)實現自動解鎖,
但是在這種情況(沒有密碼鎖的時候)手機依然是需要上滑解鎖的,
爲了解決這個問題我想了很多的辦法。

失敗的思路

比如用adb shell命令, 或者用AccessibilityService服務的GestureDescription來實現鎖屏時上滑解鎖,
其實這裏有很大的坑,就是adb shell命令無法在手機息屏時執行,
需要root權限,而ROOT對於用戶體驗太差,就果斷放棄了這種思路;
利用GestureDescription手勢解鎖也有特別大的坑,因爲上滑解鎖的要求是非常高的。
因爲谷歌考慮到手機放在褲包裏或手提包裏時上滑解鎖可能會誤觸解鎖, 所以手勢解鎖解鎖必須要有一個加速度
也就是說滑動的時候要保持一個加速度的問題,但是GestureDescription無法設置加速度,換一種角度來說就是太麻煩了;
所以我又放棄了這種思路,程序員是幹什麼吃的?就是要有鑽研精神,就算翻互聯網一個底朝天我也要弄出來!
最後我又去CSDN和Android的源碼研究了一下解鎖過程。

解決的過程

功夫不負有心人,正當我快被這個崩潰時發現了KeyguardManager這個寶藏,來看以下代碼:

KeyguardManager km= (KeyguardManager) context.getSystemService(KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");
//解鎖
kl.disableKeyguard();

kl.disableKeyguard()的方法我去android API瞭解了一下,
他其實並不是解鎖屏幕,而是把鎖屏功能給禁用了。
鎖屏界面其實就是一個activity
CSDN很多博主都說disableKeyguard()是解鎖方法,其實這個是大錯特錯!
通過disableKeyguard()我們就可以實現在鎖屏中顯示我們的app,
但是disableKeyguard()有個很嚴重的問題就是,
使用此方法會禁用手機home鍵、菜單鍵、以及返回鍵。
爲什麼呢?因爲谷歌擔心你在使用此方法禁用鎖屏界面時,繞過鎖屏去觸犯用戶的隱私,
所以上滑解鎖其實也阻礙了很多APP繞過解鎖去執行一些違規操作,
但是谷歌他萬萬沒想到我是誰?長師界的Jon Skeet(國外很火的一個編程大神).
不好意思ヽ(≧□≦)ノ我這個人太自戀了。。。

我竟然發現了Android一個奇怪的漏洞:

我們讓app通過BroadcastReceiver自動喚醒手機以後禁用解鎖, 然後拉活我的app軟件加載到主界面中,
主界面跳轉到第三方今日校園app,
今日校園完成一系列自動簽到後是無法返回到home主界面的,
因爲home鍵是被disableKeyguard()方法給禁用了, 怎麼辦了?我又是翻遍了整個互聯網,
正當千鈞一髮之際,我腦袋裏突然來了靈感,
AccessibilityService不是有那個模擬的全局home鍵嗎?
他可不可以繞過disableKeyguard()去打開home呢?
說時遲那時快,吭吭吭代碼就已經打上去了。

AccessibilityService的GLOBAL_ACTION_HOME  

這個方法竟然能真的繞過disableKeyguard()去模擬home並回到主界面!
最神奇的還不是這個,第二天我鬧鐘響了,因爲鬧鐘是在鎖屏時顯示的,
當時我睡意朦朧打開手機盡然發現鎖屏鬧鐘不見了,只有鎖屏界面和鬧鐘的聲音,
等我解鎖後,我發現沒有地方可以關閉鬧鐘!?
這意味這什麼?意味着我們現在是處於盜夢空間的夢中夢
意思就是我們這個鎖屏之外還有一個鎖屏,
然後我再通知欄找到了鬧鐘的提醒,我單擊下去,竟然又回到了第一個鎖屏界面!
這太有意思了!那麼我們返回來想一想,那我們之前那個鎖屏又去哪裏了呢?
那麼我們在拓展一下思維,去做一些....
這個技術不可言喻,免得被你們拿去做羞羞的事情,
這個謎就等你們自己去探索吧,哈哈!

手機需要的權限

無障礙服務
鎖屏顯示
後臺彈出界面【這個權限貌似只有小米和紅米有】
如果沒有這個權限可能需要申請白名單,
因爲我手裏只有小米手機,白名單功能沒寫出來,
CSDN上有很多相關代碼。

可能出現的問題

這個軟件可能因爲不同品牌導致部分功能失效,
其實我在JumpPermissionManagement這個類裏面已經考慮了不同手機品牌,
但是還是有可能出現很多問題:比如某些手機的品牌不同系統可能還是不能兼容。
這個問題就需要程序員自己解決了,我只是提供一個大致的思路而已。
不懂得可以提問,我抽時間解答。
另外這個項目不定時更新,也可能會無限延期更新。
喜歡弄的老哥fork一下吧

喜歡本文的同學可以轉載本文章,提供原作者文章鏈接:https://blog.csdn.net/qq_37377691/article/details/105827526

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