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