偽造掌閱ireader plus升級的伺服器

1. Introduction

最近把原來的499 kindle賣掉了,換成了國內掌閱出的ireader plus(999),掌閱的性價比的確高一點,比(800)kwp3配置看起來高了一些。然而書城資源上,kindle的生態比掌閱好了很多。

我的主要閱讀是非休閑的書籍,而且專業書籍一般也不從kindle上買,所以ireader plus更適合我的情況。

但是,ireaderp官方沒有放出附件包,提供的服務也不能和kindle比,比如郵件推送,比如公眾號推送等等。

了解到ireader是基於android 4.4進行「深度定製」的,但是和pc在相連的時候,是通過MTP協議,而且默認是關閉了usb調試的,萬能的國民發現在開機時候,某個時刻點擊右上角會彈出android系統自己的設置,並開啟usb調試,這樣,就可以通過adb連接pc。

但是點擊的時機把握太重要了,我點了好多好多次,只點出來一次。

開啟usb調試以後,就可以通過adb安裝apk,ireader的一個破解群,也提供了一個桌面apk和切換桌面的epub文檔。而我唯一點出的一次,竟然鬼使神差在系統設置里把桌面設置成了掌閱默認的。也就沒法切換了。

於是想通過別的方法來開啟。

2. 開啟usb調試的探索

探索1

通過MTP掛載的文件里,發現有個jar包,從文件夾路徑以及名字上判斷是藍牙語音讀書的插件包。然而反編譯以後,並沒有發現可以利用的點。

探索2

儘管沒有開放出固件,但是萬能的國民開啟了usb調試以後,就可以獲取到ota包。

同時在mtp掛載里,查看ota_log文件,發現ota包存放的位置是/storage/emulated/0/adupsfota/update.zip,在群里問侃侃,說mtp掛載的應該是/storage/emulated/0/,我嘗試直接建立文件夾,並把ota包放進去,無法檢測到。推測是文件夾許可權的問題,但是如果的確掛載的是/storage/emulated/0/,而且之前升級時自動新建了一個adupsfota/文件夾的話,應該會衝突,不允許我建立的。這裡依舊疑惑。

探索3

既然是通過ota,那麼直接分析出整個ota的過程,通過偽造假的ota伺服器來進行升級不就行嗎,升級成自己修改過設置的包,而且我認為掌閱的開發人員在調試的時候,不會是手動找時機點右上角的設置吧。

下文皆是基於此項探索進行的。

3. 抓包

既然要探查ota過程流量,而ireaderp是通過wifi連接的,那麼就需要建立熱點,並抓取熱點的流量進行分析。由於我的系統是debian sid(tesing),網上流傳的小米wifi的驅動無法編譯,linux內核太新了,提示錯誤code model kernel does not support PIC mode,在簡單搜索以後放棄解決這個問題,直接切換到別人的win下面去。小米wifi建立熱點,用wireshark神器抓包分析。

3.1 分析小米wifi的流量數據

由於自己建立的熱點數據流量很少,只有13條,其中前6條是ireaderp android系統的服務行為,連接谷歌。後面才是在系統里點擊更新時產生的流量。

但是很明顯這裡的流量都是單向的,從小米wifi(10.0.2.*)到ota伺服器(43.254.53.99)。而且三步握手數據也不全面,但是可以看到有個HTTP響應數據,點開數據查看,會發現響應的內容如下:

{"flag":{"LUrl":"no","isInner":1,"isupgrade":1,"displayApp":0,"rand":"611708206","updateStep":0,"DUrl":"http://fotadown.mayitek.com/ota/","mid":"20161129160819WF8361","connfreq":"2940"},"status":1010}n

而之前在探索1中,找可用的數據時,system/build.prop文件里有很多有用的信息,比如版本號等等。跟這裡的信息一聯繫,有很多可圈可點之處。而且很明顯fotadown.mayitek.com/ot是下載ota包的連接。

3.2 分析pc上網卡的數據

小米wifi最後也是通過本機的有線網卡進行的數據轉發,因此抓包本機的eth網卡。

通過篩選命令ip.src==43.254.52.99 or ip.dst==43.254.52.99可以獲取到整個交互過程。同樣數據不多,可以看到一條重要的HTTP POST數據,

POST /ota/detectdown/detectSchedule.do HTTP/1.1n

Bingo!這就是檢測版本號的鏈接。

在隨後的一條就是咱們上面獲取到的響應數據。

同時通過dns篩選到底ireaderp是訪問什麼網址進行請求ota版本檢查的,發現了fota4.adups.cn,(實際上是訪問的fota4.mayitek.com,只不過被重定向了)

那麼接下來只需要偽造伺服器就可以了。

4. 偽造伺服器

分析下整個訪問的流程:

ireaderp(發送網址fota4.mayitek.com請求) —>小米wifi(轉發這個請求) —>dns伺服器(解析出域名的ip返回給)—>小米wifi和ota伺服器進行三次握手建立鏈接(將請求的網址發給ota伺服器)—>ota伺服器(響應這個請求)—>小米wifi(轉發返回的數據)—>ireaderp(自己的程序處理響應數據)

這是我大概分析的流程,我們只需要在dns伺服器這裡,欺騙ireaderp即可。

4.1 dnsmasq

這個軟體是很輕巧而且傻瓜式的配置,既可以作為dhcp的分發,也可以進行簡單的dns服務。然而實際上最終我被它整亂了,放棄了使用。

本來我在本地pc的/etc/hosts里映射了那兩個域名到本機,但是在測試過程中發現,dnsmasq不穩定,在其日誌里,一會兒優先解析hosts文件,一會兒又通過正常的dns伺服器解析。

不再贅述了(這句話飽含心酸)。

4.2 Bind9

放棄dnsmasq之後,搜索搭建dns伺服器,發現主要是關於bind9配置的,便學習了簡單的配置方法。

不貼說明介紹了,先貼下配置的地方吧。bind的主目錄是/etc/bind/,編輯named.conf.local文件,添加兩個zones:

zone "adups.cn" { type master; file "/etc/bind/db.adups.cn"; };nzone "mayitek.com" { type master; file "/etc/bind/db.mayitek.com"; };n

然後對照裡面的file新建兩個文件,直接cp db.local db.adups.cn用local模板建立即可。以mayitek.com為例,修改db.mayitek.com內容如下:

;n; BIND data file for local loopback interfacen;n$TTL 604800n@ IN SOA mayitek.com. root.mayitek.com. (n 2 ; Serialn 604800 ; Refreshn 86400 ; Retryn 2419200 ; Expiren 604800 ) ; Negative Cache TTLn;n@ IN NS mayitek.com. n@ IN A 127.0.0.1n* IN A 你的dns伺服器ipnfota4 IN A 你的dns伺服器ipn

修改的地方可以對照著db.local來看。我的bind9版本是VERSION=9.10.3-P4-Debian。

sudo service bind9 restart來重啟服務。

4.3 修改dns配置

修改本機的/etc/resolv.conf,添加你的dns伺服器ip,注意這個文件是自動生成的,你做的修改在重啟網路以後就會丟失。

嘗試ping fota4.mayitek.com看看是不是你設置的dns伺服器ip。如果不是,嘗試修改你的dns伺服器上的/etc/hosts文件映射域名到你的ota伺服器ip。

用你的手機或者ireaderp測試,先記錄下連接的wifi分配的ip,然後忘記這個網路,重新連接,設置靜態地址,將dns伺服器修改掉,連接以後,嘗試去系統設置里更新。

5. 偽造伺服器響應

搭建好了dns伺服器以後,還需要搭建ota伺服器,當然這兩個可以是一個。由於我手頭數據不多,只有上面那一個請求響應,所以只能先偽造上面那一個。

用python的tornado web框架寫了簡單的代碼fake_server.py來偽造響應:

import tornado.httpservernimport tornado.ioloopnimport tornado.optionsnimport tornado.webnnfrom tornado.options import define, optionsndefine("port", default=80, help="run on the given port", type=int)nnclass IndexHandler2(tornado.web.RequestHandler):n def get(self):n greeting = self.get_argument(greeting, Hello)n self.write(greeting + , friendly user!)n def post(self):n self.write({"flag":{"LUrl":"no","isInner":1,"isupgrade":1,"displayApp":0,"rand":"18388636","updateStep":0,"DUrl":"http://fotadown.mayitek.com/ota/","mid":"20161203160819WF9362","connfreq":"2990"},"status":1011}n)n print("get one");nif __name__ == "__main__":n tornado.options.parse_command_line()n app = tornado.web.Application(handlers=[(r"/ota/detectdown/detectSchedule.do", IndexHandler)])n http_server = tornado.httpserver.HTTPServer(app)n http_server.listen(options.port)n tornado.ioloop.IOLoop.instance().start()n

由於默認是綁定80埠需要sudo,sudo python3 fake_server.py。設置好ireaderp的dns網路配置以後,點擊系統更新,會發現後台獲取到了這次請求,(裡面有一些雜亂的請求,不是ireaderp發出的)

6. 修改ota包

修改ota包其實是中午做的,現在還存在問題,嘗試偽造update.zip包不成功,解壓查看的時候,我只發現了一個md5sum的校驗文件,後來改完了配置,我也重新生成了md5sum,發送給別人測試(我的依舊沒有開啟usb調試),更新失敗。這個問題尚未明朗。

目前想法,通過修改build.prop,添加如下內容來自動開啟usb調試。

persist.servICe.adb.enable=1npersist.sys.usb.config=adbn

然後使用abootimg進行了打包,參考[android]system.img文件的打包和解包。

7. 總結

整個過程,複習了我很多網路的知識,以及工具的使用。但是實在是太累了。從早上9.00在群里開始討論這件事情,中午外賣,在宿舍一直坐到晚上6.00,然後去實驗室繼續做,最後總結文章,寫到了第二天的0:30。只因為早上的討論勾起了我的興趣。

Reference

有大神破解了iReader plus

Wireshark基本介紹和學習TCP三次握手

爛泥:dnsmasq搭建簡易DNS伺服器

Ubuntu Bind9泛域名解析配置

DNS開源伺服器BIND最小配置詳解

[android]system.img文件的打包和解包

其實還有很多很多很多參考,但是實在瀏覽記錄太多了,沒有及時mark。


推薦閱讀:

深入實時 Linux
Linux 包管理基礎:apt、yum、dnf 和 pkg
Bash判斷、循環、控制語句常用用法歸納
Linux文件亂碼
SpaceVim release 0.5.0

TAG:掌阅iReader | Linux | 黑客Hacker |