Android自複製傳播APP原理學習(翻譯)java
1 背景介紹c++
論文連接:http://arxiv.org/abs/1511.00444git
項目地址:https://github.com/Tribler/self-compile-Androidgithub
吃完晚飯偶然看到這篇論文,當時就被吸引了,立刻翻譯總結了一下。若有錯誤歡迎斧正。網絡
該論文的研究出發點比較高大上這裏咱們就很少說了,簡而言之就是想經過移動設備來實現一個自組網,在發生災難的時候,手機之間可以自動傳輸關鍵數據,減小損失。整個目標經過設計一個可以實現自編譯、自變異和病毒式傳播的「自治app」實現。下面咱們直接去了解它的核心原理。app
2自治app的設計工具
1.要求可以同時使用多種網絡鏈接方式如WIFI、蜂窩網絡、藍牙等。學習
2.最好系統自己開源,主要是方便獲取軟件的編譯工具以及瞭解相關編譯過程。ui
因此選擇了Android系統。同時注意到自治app的關鍵功能最好不須要root權限就能順利完成。翻譯
3.1病毒式的傳播
核心原理圖
簡而言之就是在同一個無線網域中,可以經過NFC和藍牙進行傳播,而後這個網域中若是有一臺機器可以鏈接外網的話,就經過這臺機器傳播到外網去。
3.2 自編譯
爲了可以在各個設備、平臺上運行APP,這個app就必須包含全部系統版本的編譯套件。最有效的方法就是在這個APP中內嵌一個app編譯工廠,此工廠包含全部須要的編譯和鏈接工具。要完成自我編譯主要須要以下3類原數據:
①app源碼;
②第三方庫;
③編譯、連接工具
固然,若是app中含有c/c++代碼的話,還須要一些ndk工具。
3.3 自變異
主要是爲了經過變異來讓app可以在各類不一樣的環境中存活下去。主要方式就是讓app自身可以將代碼、資源文件、和新的或者更改後的庫文件集合在一塊兒,讓它變成一個萬精油的app,進而適應各類設備(固然,就惡意代碼而言,能夠經過變異來減小被殺軟報毒的機率)。
3.4無害的組件
在app中嵌入一些無害的組件(軟硬件都可),或者將「關鍵邏輯」嵌入到無害的app中,能夠迷惑用戶,減小被發現的機率。好比嵌入到計算器中。固然爲了省得被查水錶,給app簽名的時候最好用別人的,或者默認的debug key。
4 具體實現
主要就是構建一個內嵌的編譯環境,而且這個編譯環境要是全java的。因爲Android自己就是開源的,因此獲取各個編譯工具以及瞭解它的編譯原理並不難,而且除了aapt以外,其餘工具基本都是使用java寫的。
具體的編譯過程見圖3。固然網上也有不少相關文章。
4.1重寫aapt
aapt的功能這裏就很少說了。主要看如何將這部分native代碼移植到java代碼中。這方面的工做已經有現成的工具可使用了,就是JavaIDEdroid。同時須要注意,aapt在工做的時候須要的那些native庫文件都被集中到了一個so文件中。因此爲了實現徹底的NDK無關性,這裏只須要對aapt的代碼進行移植便可。
4.2 Java編譯器
這裏選擇使用Eclipse的Java編譯器ECJ,由於這個編譯器是使用java寫的。
4.3 Dalvik轉換
Android使用dex格式的可執行文件。在Android5.0以前的版本中使用Dalvik VM來運行dex文件,後來使用ART代替了DVM,不過ART是向後兼容的,因此也是執行dex文件。所以就須要將java字節碼轉換爲dex格式的dalvik字節碼。整個轉換工做經過一個叫作dx的工具包實現。Dx在進行轉換的時候比較吃內存,若是一次性轉換太多東西的話容易crash,可是好在咱們能夠分塊對上面提到的各個java庫進行轉換。轉換完成後在經過DexMerger進行組合。好消息是,dx和DexMerger都是用java寫的。
4.4 打包工具
APK的打包主要是經過ApkBuilder工具實現,它也是用java寫的。ApkBuilder包括用於完成java代碼編譯的Android.jar庫文件,用於完成最後連接工做的Java KeyStore文件(這個文件在對apk進行簽名的時候用到)等等。
4.5簽名問題
若是兩個apk的包名相同,簽名也相同,那麼新的apk就能夠完美替換舊的apk。可是自變異的apk卻不行。它要麼被當作一個新的app安裝,要麼由於包名相同但簽名不一樣而被拒絕安裝。因此爲了解決這個問題,可以使用ZipSigner工具,這個工具可使用任意的Key Store文件(自己默認包含debug key)對apk進行簽名。因此能夠經過這個工具使用debug key對自變異的apk進行簽名。
4.6無線傳播
主要就是經過NFC來開啓藍牙傳輸,而後經過藍牙來傳輸apk文件。整個傳輸過程能夠作成全自動化的。
5 總結
這個論文首先提出並實現了在Android平臺可以自動重編譯、自變異和病毒式傳播的「自治型app」,雖然做者的出發點是好的,可是不免會被有心之人利用,作成惡意代碼加以傳播。同時很容易聯想到,咱們徹底能夠將這些Android平臺的編譯工具替換爲其餘系統平臺的編譯工具,程序經過檢測當前所處的系統環境,選取相應的編譯套件,進而實現跨平臺感染。