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