走進(jìn)科學(xué):揭秘如何入侵電視機(jī)
[從可惡的廣告開始]
前幾天家里買了臺(tái)新創(chuàng)維電視,安裝好興沖沖的開機(jī),突然蹦出的廣告讓我心涼了半截,進(jìn)了安卓系統(tǒng),發(fā)現(xiàn)啥都沒有,不能自己裝軟件,只能從那只有不到20款軟件的破商店里下載,更可惡的是這廣告還兩天一換,后臺(tái)自動(dòng)升級(jí),這是為什么呢?我買的電視,憑啥你就能遠(yuǎn)程控制隨便往里放廣告?電視步入了智能時(shí)代,一大堆捆綁的流氓軟件和廣告也從手機(jī)和PC轉(zhuǎn)戰(zhàn)到了電視平臺(tái),所以,讓垃圾們都見鬼去吧!我要開始折騰了!
[把電視當(dāng)成平板]
什么叫智能電視?實(shí)際上這只是唬人的名字,智能電視就是帶超大屏幕的安卓平板,只是這平板鎖住了70%的功能,而且沒有刷機(jī)用的連接接口,怎么辦呢?只能從網(wǎng)絡(luò)上想辦法了。
具體思路就是先用ADB遠(yuǎn)程連接,然后想辦法root,adb要遠(yuǎn)程調(diào)試,需要電視上打開adbd服務(wù),通過(guò)google得知大部分創(chuàng)維電視的adbd默認(rèn)是打開的,或者可以從工廠設(shè)置里打開,不管怎么樣,我先碰碰運(yùn)氣吧:
看來(lái)有門,打開命令行,用adb試試:
adb connect 192.168.0.100:5555
connected to 192.168.0.100:5555
adb remount
remount succeeded
居然成功了,下一步登錄進(jìn)去看看,本想著如何root可能是個(gè)難題,可是當(dāng)強(qiáng)大的#號(hào)出現(xiàn)在我面前時(shí),我和我的小伙伴們?nèi)俭@呆了!
電視的安卓系統(tǒng)居然是直接以root權(quán)限運(yùn)行的,我對(duì)創(chuàng)維公司已經(jīng)無(wú)語(yǔ)了,接下來(lái)一切好辦,開兩個(gè)shell窗口,一個(gè)登錄進(jìn)安卓系統(tǒng),另一個(gè)用adb連接:
adb push su /system/xbin
pm set-install-location 0
adb install superuser.apk
adb install rootexplorer.apk
對(duì)于一個(gè)一直以root權(quán)限運(yùn)行的系統(tǒng)來(lái)說(shuō),上面第一步似乎有些多余,只是習(xí)慣性的傳了一個(gè),創(chuàng)維的廣告一般都在開機(jī)時(shí)出現(xiàn),那么它的原理應(yīng)該是后臺(tái)有一個(gè)守護(hù)服務(wù),聯(lián)網(wǎng)后不斷的連接遠(yuǎn)程服務(wù)器,如果有更新則下載并替換電視的開機(jī)界面。
安卓系統(tǒng)的開機(jī)界面存在兩個(gè)位置,開機(jī)畫面是一個(gè)zip文件,一個(gè)位置在/data/local/bootanimation.zip,另一個(gè)在/system/media/bootanimation.zip,開機(jī)后首先讀取第一個(gè),如果第一個(gè)不存在或無(wú)法讀取,則載入第二個(gè),那么我先來(lái)看看第一個(gè):
adb pull /data/local/bootanimation.zip
下載后解壓,貓膩果然在這里:
第二個(gè)位置里的畫面是安卓自帶的沒有被改變,這里順便說(shuō)一說(shuō)安卓系統(tǒng)開機(jī)畫
面的格式,bootanimation.zip里面壓縮了一個(gè)文件夾和一個(gè)desc.txt文本文件,文件夾里可以是一張圖,也可以是一系列動(dòng)態(tài)圖片以實(shí)現(xiàn)開機(jī)動(dòng)畫,desc.txt用來(lái)告訴系統(tǒng)文件夾的名稱、內(nèi)容和播放方式,比如:
p 1 10 images
p是一個(gè)分隔符,1表示播放一遍,10表示播放完了停頓10幀的時(shí)間,images則是文件夾的名稱。知道了這些之后,要去掉廣告,只需替換文件夾里的圖片
為我們自己喜歡的,然后壓縮上傳,開機(jī)界面就會(huì)改變,或者直接刪除這個(gè)文件,系統(tǒng)會(huì)在/system/media/bootanimation.zip讀取默認(rèn)開機(jī)界面。
[童鞋,別高興的太早了]
事情沒那么簡(jiǎn)單,前面說(shuō)了,創(chuàng)維廣告是有守護(hù)進(jìn)程的,你按上面說(shuō)的做,過(guò)幾天廣告還會(huì)被自動(dòng)下載的,ps進(jìn)程列表發(fā)現(xiàn),有個(gè)叫skyupdate的東東,不用問(wèn),一定在/system/app下有個(gè)叫skyupdate.apk的東西,有人說(shuō)了,既然root了,把它刪了不就完了?是滴,我確實(shí)這樣做了,不過(guò)過(guò)了兩天它又出現(xiàn)了(我可以罵人嗎?),這TMD守護(hù)進(jìn)程居然也有一個(gè)守護(hù)進(jìn)程。
所以,還得靠萬(wàn)惡的sniffer,嗅探出該死的廣告服務(wù)器地址,把它屏蔽掉,才能一了百了。
安卓實(shí)際就是linux,那么自然有強(qiáng)大的tcpdump:
uid=0 gid=0@android:/ # tcpdump host 192.168.0.100 and not 192.168.0.103
上面的192.168.0.100是電視機(jī)的ip,192.168.0.103是運(yùn)行adb的本機(jī)ip,最好剛開機(jī),什么也別運(yùn)行就開始嗅探,這樣可以避免與其他聯(lián)網(wǎng)程序混淆:
貓膩被揪到了,利用強(qiáng)大的iptables,寫個(gè)簡(jiǎn)單的shell:
#! /system/bin/sh
iptables -I INPUT -s 223.6.253.51 -j DROP
iptables -I OUTPUT -s 223.6.253.51 -j DROP
保存為adblock.sh,放在/system/etc下,賦予權(quán)限:
uid=0 gid=0@android:/system/etc # sh adblock.sh
uid=0 gid=0@android:/system/etc # chmod 777 adblock.sh
[還沒完呢,麻煩事還有]
現(xiàn)在的問(wèn)題是,如何讓這段腳本開機(jī)自動(dòng)運(yùn)行,有人說(shuō)了,有三種方法:
1 修改init.rc,添加一行service即可。
說(shuō)這話的人純屬?zèng)]長(zhǎng)腦子,init.rc只是ramdisk.img在內(nèi)存中的鏡像而已,每次修改后開機(jī)會(huì)重新復(fù)原,唯一改動(dòng)的辦法是修改固件后重新刷機(jī),你想讓電視變磚嗎?
2 修改/system/etc/install-recovery.sh,把a(bǔ)dblock.sh的內(nèi)容添加進(jìn)去。
這招在其他安卓平板上可行,可TMD創(chuàng)維在init.rc里把install-recovery.sh給注釋掉了,此路不通也。
3 把shell腳本放在/system/etc/init.d目錄下,開機(jī)就會(huì)自動(dòng)運(yùn)行。
你以為這是三星手機(jī)啊!這個(gè)目錄根本就不存在!這個(gè)功能早就被創(chuàng)維扣掉了。
咋辦?只有兩個(gè)辦法了:
方法一:這個(gè)簡(jiǎn)單,啟用路由器自帶的防火墻,把這嗅探出的ip加入屏蔽規(guī)則就成了。
方法二:自己寫一個(gè)app,用來(lái)調(diào)用adblock.sh,把它做成開機(jī)自動(dòng)運(yùn)行。
由于最近懶得要死,所以我最后選擇了方法一,但方法二的代碼我也給出一段,雖然沒測(cè)試,不過(guò)估計(jì)沒啥大問(wèn)題:
- Runtime runtime = Runtime.getRuntime();
- Process proc = runtime.exec(“./system/etc/adblock.sh”);
- try {
- if (proc.waitFor() != 0) {
- System.err.println( proc.exitValue());
- }
- } catch (InterruptedException e) {
- System.err.println(e);
- }
在app的AndroidManifest.xml的application標(biāo)簽內(nèi)加入:
- <receiver android:enabled="true" android:name=".BootBroadcastReceiver"
- android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </receiver>
添加如下權(quán)限:
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
再添加一個(gè)BootBroadcastReceiver類:
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- public class BootBroadcastReceiver extends BroadcastReceiver {
- static final String ACTION = "android.intent.action.BOOT_COMPLETED";
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(ACTION)) {
- Intent mainActivityIntent = new Intent(context, MyActivity.class);
- mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(mainActivityIntent);
- }
- }
- }
各位自己去試吧,我是懶得再研究下去了。
[結(jié)束]
用了一周,開機(jī)界面一直沒變過(guò),看來(lái)是成功了,我又裝了一大堆的app,現(xiàn)在電視的界面已經(jīng)和平板沒多大區(qū)別了.
[補(bǔ)充]
經(jīng)過(guò)我賣電視機(jī)的遠(yuǎn)方親戚的同意,對(duì)其店里的所有創(chuàng)維智能電視進(jìn)行檢測(cè),全部都可以用root權(quán)限遠(yuǎn)程登錄,也就是說(shuō),一臺(tái)筆記本可以輕易入侵同一無(wú)線網(wǎng)內(nèi)的所有電視機(jī),看來(lái),電視病毒泛濫傳播的時(shí)代已經(jīng)不遠(yuǎn),電視黑客也即將出現(xiàn),日后還有手表、洗衣機(jī)、空調(diào)、音響……一切皆是智能,一切皆可入侵,下圖中所現(xiàn)的場(chǎng)景,也許會(huì)成為現(xiàn)實(shí):