Android如何在免Root下自动Pay(非人为非无障碍),引起的深思?
一個方向,你能否改變世界?
先來看看效果圖:
由于 Pay 的效果圖被屏蔽,這里以刷文章的方式呈上。
注意:打開「某度」,輸入地址,瀏覽,點擊廣告等操作都是手機自動完成,非人為手指控制,同時手機非 Root 非無障礙并沒有連接 usb。
親測還能自動 Pay,自動回復,自動 Play Music 等等,用句夸大詞說:只有你想不到,沒有做不到。
前言
說來話長,那我就長話短說,在去年有個朋友讓我幫忙刷某度文章閱讀量,作為一名程序員,首先想到模擬接口訪問,經常一番折騰就放棄了,大廠的網絡傳輸加密不是那么好破解的,嘗試了幾種抓包,攔截,改變參數,再次發送的方式,測試并沒有成功。
同許多程序員一樣,喜歡一條路走到黑,不見南墻不回頭,通過網上搜索大量資料來破解加密,一次次失敗,最終還是失敗了,不得不佩服某度的網絡安全體系,不是我一個「嫩頭青」可以破解的。
那么問題還是回到起點,既然不能改變接口環境,那么只剩下一個笨辦法,手動輸入地址,查閱文章,來達到閱讀量的增加。不過接下來的問題就讓人太尷尬了,那就是效率問題,手動查閱太枯燥效率太低了,那能不能手機自動完成查閱文章的動作,并不需要人工操作呢。
答案是肯定的,雖然效率低了點,依舊是一種解決方案。說好的長話短說,這話又說多了。
實踐
大家都知道 Android 調試橋 (adb) 是一個通用命令行工具,其允許您與模擬器實例或連接的 Android 設備進行通信。它可為各種設備操作提供便利,如安裝和調試應用,并提供對 Unix shell(可用來在模擬器或連接的設備上運行各種命令)的訪問。
比如模擬按鍵點擊:
adb shell input tap 460 410點擊屏幕 (460 410) 這點,模擬輸入文本:
adb shell input text hello輸入文本「hello」,模擬滑動:
adb shell input swipe 300 1000 300 500參數 300 1000 300 500 分別表示起始點 x 坐標,起始點 y 坐標,結束點 x 坐標,結束點 y 坐標。模擬回車,返回鍵:
adb shell input keyevent 66adb shell input keyevent 466 表示回車,4 表示返回鍵。還有常見的 adb install ,adb push 錄屏截圖等等。想查看更多 adb 命令,請鏈接 awesome-adb。好了,具體看案例。
「某度」自動瀏覽文章
「某度」自動瀏覽文章為了以下幾步:
第一步,啟動應用 / 調起 Activity 的命令如下:
adb shell am start [options] <INTENT>例如:
adb shell am start -n com.tencent.mm/.ui.LauncherUI表示打開「微信」主界面。參數 com.tencent.mm 表示微信包名 .ui.LauncherUI 表示打開的 Activity 的名稱。查看當前界面 Activity 名稱的方式有許多,這里推薦 android-TopActivity。如下圖左上角:
獲取到「某度」的包名與主界面的名稱為,com.baidu.searchbox 與 .MainActivity ,那么打開「某度」的 adb 命令如下:
第二步,點擊頂部輸入框區域,那么需要獲取到點擊點的坐標位置,可以借助「開發者選擇」的「指針位置」來獲取:
那么我們通過模擬點擊 (431 380) 來模擬點擊輸入框:
第三步,輸入瀏覽文章的地址,adb 命令如下:
adb shell input text 'https://na.mbd.baidu.com/je3rqk2?f=cp'注意:如果你安裝了第三方輸入法,可能會導致輸入錯亂,請在「設置」「語言與輸入法」「虛擬鍵盤」下關閉第三方輸入法。
第四步,回車搜索,adb 命令如下:
adb shell input keyevent 66注意:文章搜索是異步,需延遲后續操作,在后文中會講到。
第五步,模擬滑動,adb 命令如下:
adb shell input swipe 200 1800 200 0起點 y 坐標 1800 與結束點 y 坐標 0 ,相差越大滑動越大,在每個機型上需要調整,同時滑動到廣告出現在屏幕內的次數可能也不一樣。具體請在真機上模擬調整。
第六步,點擊推薦廣告,同上獲取到廣告區域的坐標點:
對應的 adb 命令如下:
第七步,點擊返回鍵的 adb 命令:
adb shell input keyevent 4總共七步就完成了一次自動瀏覽文章,有小伙伴肯定會有疑問,不會每步都執行 DOS 命令吧,這樣比手動點擊還慢呢,那有沒有腳本可以批處理。
bat (批處理文件類型)就是解決這樣的問題。新建 xx.bat 文件,把以下代碼拷入:
ping 127.0.0.1 -n 2 adb shell am start -n com.baidu.searchbox/com.baidu.searchbox.MainActivity ping 127.0.0.1 -n 3 adb shell input tap 431 380 adb shell input text https://na.mbd.baidu.com/je3rqk2?f=cp ping 127.0.0.1 -n 1 adb shell input keyevent 66 ping 127.0.0.1 -n 3 adb shell input swipe 200 1800 200 0 ping 127.0.0.1 -n 2 adb shell input swipe 200 1800 200 0 ping 127.0.0.1 -n 2 adb shell input swipe 200 1800 200 0 ping 127.0.0.1 -n 2 adb shell input swipe 200 1200 200 0 ping 127.0.0.1 -n 2 adb shell input tap 583 339 ping 127.0.0.1 -n 5保存,確保手機連上電腦,雙擊 xx.bat 文件,發現手機自動打開百度,輸入地址,瀏覽文章,哈哈,這樣方便多了。但還有一個小小的不足,瀏覽完一次文章 xx.bat 就結束了,能不能加個循環語句,讓文章間斷性被瀏覽。由于并不熟悉 .bat 的寫法,研究了一下,功夫不負有心人,我們可以這么做:
:start ping 127.0.0.1 -n 2 adb shell am start -n com.baidu.searchbox/com.baidu.searchbox.MainActivity ping 127.0.0.1 -n 3 adb shell input tap 431 380 adb shell input text https://na.mbd.baidu.com/je3rqk2?f=cp ping 127.0.0.1 -n 1 adb shell input keyevent 66 ping 127.0.0.1 -n 3 adb shell input swipe 200 1800 200 0 ping 127.0.0.1 -n 2 adb shell input swipe 200 1800 200 0 ping 127.0.0.1 -n 2 adb shell input swipe 200 1800 200 0 ping 127.0.0.1 -n 2 adb shell input swipe 200 1200 200 0 ping 127.0.0.1 -n 2 adb shell input tap 583 339 ping 127.0.0.1 -n 5 adb shell input keyevent 4 adb shell input keyevent 4 adb shell input keyevent 4 adb shell input keyevent 4 adb shell input keyevent 4 goto start pauseping 127.0.0.1 -n 1 用于延遲執行,由于每步操作都是異步,延時時間你可以根據具體情況而定。emmm,大功告成,文章被無限周期性瀏覽,但還是有兩個小小的瑕疵,一是要運行 bat 腳本;二是手機必須連上電腦。針對第一種情況,可不可以在 app 內執行 adb shell 命令,最初嘗試提示「permission denied」權限被拒絕,需要 Root 權限,Root 太麻煩,而且用戶也不會同意,那么我們可不可以繞過 Root 權限?
這個問題一直困擾著我,在這里非常感謝 gtf 同學的免Root實現靜默安裝和點擊任意位置(非無障礙)文章,這里引用他的一段話:
我來問大家個新問題,怎樣讓 app 獲取 root 權限?這個問題答案已經有不少了,網上一查便可知其實是獲取「Runtime.getRuntime().exec」的流,在里面用su提權,然后就可以執行需要 root 權限的 shell 命令,比如掛載 system 讀寫,訪問 data 分區,用 shell 命令靜默安裝,等等。話說回來,是不是和我們今天的主題有點像,如何使 app 獲取 shell 權限?嗯,其實差不多,思路也類似,因為本來 root 啦, shell 啦,根本就不是 Android 應用層的名詞呀,他們本來就是 Linux 里的名詞,只不過是 Android 框架運行于 Linux 層之上, 我們可以調用 shell 命令,也可以在shell 里調用 su 來使shell 獲取 root 權限,來繞過 Android 層做一些被限制的事。然而在 app 里調用 shell 命令,其進程還是 app 的,權限還是受限。所以就不能在 app 里運行 shell 命令,那么問題來了,不在 app 里運行在哪運行?答案是在 pc 上運行。當然不可能是 pc 一直連著手機啦,而是 pc 上在 shell 里運行獨立的一個 java 程序,這個程序因為是在 shell 里啟動的,所以具有 shell 權限。我們想一下,這個 Java 程序在 shell 里運行,建立本地 socket 服務器,和 app 通信,遠程執行 app 下發的代碼。因為即使拔掉了數據線,這個 Java 程序也不會停止,只要不重啟他就一直活著,執行我們的命令,這不就是看起來 app 有了 shell 權限?現在真相大白,飛智和黑域用 usb 調試激活的那一下,其實是啟動那個 Java 程序,飛智是執行模擬按鍵,黑域是監聽系統事件,你想干啥就任你開發了。「注:黑域和飛智由于進程管理的需要,其實是先用 shell 啟動一個 so ,然后再用 so 做跳板啟動 Java 程序,而且 so 也充當守護進程,當 Java 意外停止可以重新啟動,讀著有興趣可以自行研究,在此不多做說明」
這里有一句話說的非常好,「你想干啥就任你開發了。」 如果調整好參數,我可以拿到「某信」的付款二維碼,并能截圖上傳,就問你怕不怕?
gtf 同學的思路,讓我醍醐灌頂,并不是繞過 Root 權限,而是在 pc 上在 shell 里運行獨立的一個 java 程序,,這個程序因為是在 shell 里啟動的,所以具有 shell 權限。這個 Java 程序在 shell 里運行,建立本地 socket 服務器,和 app 通信,遠程執行 app 下發的代碼。因為即使拔掉了數據線,這個 Java 程序也不會停止,只要不重啟他就一直活著,執行我們的命令,這不就是看起來 app 有了 shell 權限?
大家想一想,如果我把 Java 程序部署到遠程服務器上,那么我能隨時隨地都可以建立 socket ,從而控制手機自動完成想做的事情。
還得再次感謝 gtf 同學分享了一個簡單的 socket 程序,親測后的效果圖如下:
在通過 app_process 在環境下運行 java 程序有以下幾個細節:
細節一,通過 javac 運行多個 .java 文件:
D:\>cd D:\AndroidSpace\app_process-shell-use\app\src\main\java\shellServiceD:\AndroidSpace\app_process-shell-use\app\src\main\java\shellService>javac -encoding UTF-8 Main.java Service.java ServiceShellUtils.java ServiceThread.java首先 cd 到 java 目錄,然后執行 javac 命令。注意:指定編碼格式為 UTF-8 ,不然中文亂碼會導致編譯不通過。編譯過的目錄如下圖:
細節二,多個 .class 文件生成 .dex 文件
注意,首先需要 cd 到 java 目錄,不然會提示類文件找不到,然后通過 dx --dex 命令生成 .dex 文件,所生成的所有 .class 文件都需要加到命令中。生成的 .dex 文件如下圖:
細節三,app_process 運行 java 程序:
首先 cd 到 .dex 目錄,接著把 .dex 文件推到手機 /data/local/tmp 目錄下,最后執行 app_process 命令,因為 utf8 在 Windows shell 里有問題,所以亂碼了,但是還是說明我們成功了。
由于 adb shell 需要 usb 連上手機才能運行,那么我們可以通過 ADB WiFi 來連接手機,運行 app ,DOS 的執行情況如下:
鍏抽棴Socket 鐩戝惉璇鋒眰鍒版潵鍒欎駭鐢熶竴涓猄ocket瀵硅薄錛屽茍緇х畫鎵ц 鍒涘緩浜嗕竴涓柊鐨勮繛鎺ョ嚎紼? 鐢盨ocket瀵硅薄寰楀埌杈撳叆嫻侊紝騫舵瀯閫犵浉搴旂殑BufferedReader瀵硅薄 鐢盨ocket瀵硅薄寰楀埌杈撳嚭嫻侊紝騫舵瀯閫燩rintWriter瀵硅薄 while寰幆錛氳幏鍙栦粠瀹㈡埛绔鍏ョ殑瀛楃涓? while寰幆錛氬鎴風榪斿洖 : adb shell input tap 545 980 while寰幆錛氭湇鍔″櫒灝嗚繑鍥烇細###ShellError#sh: <stdin>[1]: adb: not found while寰幆錛氬噯澶囧埛鏂拌繑鍥? while寰幆錛氬凡鍒鋒柊榪斿洖報了 adb: not found ,缺少 adb 的運行環境。那么我們可以在手機上搭建 adb 運行環境,具體可以參考手機對手機進行adb指令(OTG),本篇并不會講解如何在手機上搭建 adb 環境,因為在多數情況下我們并不會把 Socket 的服務端部署在手機上,而是部署在 pc 上,步驟如下。
運行這個服務端:
public class Main {public static void main(String[] args){new ServiceThread().start();while (true);} }運行客戶端,建立連接。注意:HOST = “192.168.xxx.xx” 換成局域網 ip 地址。在 MainActivity 類中直接調用:
runShell("adb shell am start -n com.baidu.searchbox/com.baidu.searchbox.MainActivity");Thread.sleep(1000);runShell("adb shell input tap 460 410");...... 省略其他手機自動瀏覽「某度」文章,當這個時候拔去 usb 連接,會提示 no devices/emulators found 表明無設備連接,在上文中已經提到,這個時候可以通過 ADB WIFI 連接。
當然我覺得 ADB WIFI 連接也比較麻煩,如果能一鍵啟動那不更好,那么接下來就需要把 ADB WIFI 的實現原理接入到服務器。這樣就能真正的做到「一鍵啟動」。
總結,思考
總結,手機自動操作操作還不夠成熟,還有一些技術需要攻破,同時也存在了安全隱患。思考,汽車有了自動駕駛,為啥安卓不能有「自動操作」。
如果覺得本篇文章對你有用,別忘記給小編控件庫點 star ,點 star,點 star
https://github.com/HpWens/MeiWidgetView
源碼如下:
https://github.com/HpWens/MeiAutoRead
如果對「自動操作」感興趣的小伙伴,點擊下面二維碼,關注:控件人生
總結
以上是生活随笔為你收集整理的Android如何在免Root下自动Pay(非人为非无障碍),引起的深思?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 作用域插槽
- 下一篇: 解决git提交问题error: The