轉自:https://www.wireghost.cn/2018/05/10/Android模擬器檢測體系梳理/算法
模擬器做爲一種虛擬機,配合改機工具,可以以較低成本實現設備多開,所以而備受黑灰產的青睞。如何準確識別模擬器成爲App開發中的一個重要模塊,目前也有專門的公司提供相應的SDK供開發者識別模擬器。經過前段時間對模擬器檢測技術的調研,但願能總結出一套特徵挖掘的體系化方案。緩存
安卓模擬器是一種能夠運行在電腦上的虛擬設備,經過它能夠實現應用的跨平臺操做,讓移動端APP無需任何改動便可在PC上執行。網絡
隨着技術的不斷髮展,目前模擬器基本已經可以完成手機90%以上的功能。此外,因爲在PC端工做,與傳統手機相比,具備如下幾點優點:架構
此外,Android模擬器鑑於自身技術瓶頸,也存在如下廣泛問題:app
模擬器是用軟件來模擬硬件操做,這就須要用到虛擬化技術。廣義的虛擬化,是指將網絡、CPU、內存及存儲等各類實體資源,予以抽象、轉換後呈現出來,進而打破實體結構間不可切割的障礙,使用戶能夠比本來的組態更好的方式來應用這些資源。咱們所熟知的虛擬機就是虛擬化技術中的一種,一般來講它們只是模擬了一套與Host主機相同架構、相同指令集的硬件平臺,不涉及內存和CPU的虛擬化。全部的Android模擬器都在不一樣程度上運用了虛擬化技術,好比雷電、夜神,包括Bluestack模擬器是基於Virtualbox虛擬機,谷歌原生模擬器和紅手指雲模擬器則是應用了Qemu的虛擬化技術。框架
目前,已知的全部ARM架構的模擬器都是基於Qemu虛擬機。Qemu採用的是純軟件模擬,在物理機的操做系統上建立一個模擬硬件的程序來仿真全部想要的硬件,而後在上面跑ARM運行時。在這種環境下,因爲程序每次執行都須要將其翻譯成宿主機(X86)的指令,致使性能很是低下,這也是原生模擬器不夠流暢的緣由之一。工具
當下主流的Android模擬器都是X86架構,基於Virtualbox虛擬機。因爲不須要作CPU虛擬化,少了一層指令集轉換過程,所以在運行支持X86架構的app時,就和普通的虛擬機沒有區別,速度也就明顯提升了不少。
此外,針對ARM架構的兼容性問題,廣泛採用的是半虛擬化,根據二進制翻譯技術將ARM指令動態翻譯成X86指令。性能
目前市面上安卓模擬器軟件種類繁多,有5一、mumu、藍疊、夜神、逍遙、海馬玩、雷電等等。經過在黑產彙集論壇、QQ羣等多個渠道進行調研,咱們發現黑產當下經常使用的是夜神、雷電和逍遙模擬器。
能夠注意到,這些模擬器的共通點是都自帶修改設備參數、多開、操做錄製和虛擬定位等功能。
學習
模擬器檢測的本質就是要利用模擬器和真機之間的微小差別,從而判斷當前設備是否爲模擬器,具體檢測技術框架整理以下:
atom
結合前面梳理出的模擬器檢測框架,後續在作相應的特徵挖掘時,可直接根據該腦圖作進一步的完善和增強。
特徵項 | 細分點 | 描述 | 備註 | |
軟件信息 | 應用層 | |||
系統庫 | ||||
無線射頻 | WIFI | |||
GPS | ||||
… | ||||
硬件信息 | 底層硬件 | CPU | ||
電池 | ||||
設備參數 | ||||
硬件抽象層 | 圖形 | |||
相機 | ||||
藍牙 | ||||
輸入 | ||||
存儲 | ||||
傳感器 | ||||
文件系統(重點關注Linux內核相關) | 檢查/sys硬件驅動信息 | |||
檢查/dev設備節點特徵 | ||||
檢查/proc運行時的內核信息映射 | ||||
… |
此外,基於文件系統差別的特徵挖掘,具體可參考Android根目錄文件結構進行操做,如下是幾個重要的目錄/文件的說明:
模擬器與真機的本質區別在於運行載體,市面上已知的ARM模擬器都是基於qemu虛擬機。因爲qemu在執行程序時其實是將其翻譯成宿主機的指令,好比將安卓的arm指令翻譯成PC的x86指令。爲了效率上的考慮,qemu在翻譯執行arm指令時並無實時更新模擬的pc寄存器值,只會在一段代碼翻譯執行完以後再更新,而真機中pc寄存器是一直在更新的。根據這一點,能夠設計一段CPU任務調度程序來檢測模擬器。
優勢:由於是基於qemu的二進制翻譯技術來作特徵檢測,因此可以很好的識別這類Android模擬器。
缺點:
因爲絕大部分手機都是基於ARM架構,而模擬器幾乎所有是運行在PC的X86架構上。所以,能夠利用ARM與X86的底層緩存行爲差別來判斷是否爲真機。
具體來講,ARM採用的是將指令存儲與數據存儲分開的哈佛架構,L1 Cache(一級緩存)被分紅了平行的兩塊,即I-Cache(指令緩存)和D-Cache(數據緩存),而X86採用的是將指令存儲和數據存儲合併在一塊兒的馮•諾伊曼結構,L1 Cache是連續的一塊緩存。因此,若是咱們經過讀寫地址指令的方式對一段可執行代碼進行動態修改,那麼在執行的時候,X86架構上的指令緩存會被同步修改,而對ARM架構而言,這種數據讀寫操做修改的只是D-Cache中的內容,此時I-Cache中的指令並不會被更新。
優勢:可以準確的識別arm和x86架構。
缺點:要執行彙編代碼,在不一樣的機器設備上須要考慮穩定性和兼容性等問題。實測發現容易引發崩潰,須要配合多進程予以解決。
這種檢測方案本質上是對正經常使用戶的行爲模式進行統計分析,它也許不能有效的對真機和模擬器進行區分,但能夠做爲風險設備畫像的一個參考維度。
檢查WIFI列表這種方式,目前沒發現明顯缺點。當正常手機接入WIFI的時候,周邊每每有複數的WIFI信號,而模擬器因爲不具有檢索周邊WIFI的能力,其WIFI列表一般爲空或者只有一個WIFI。
這種檢測手法的原理是基於模擬器沒有真實的GPS模塊,一般沒法獲取到地理位置信息。缺點是部分用戶在實際使用中可能會關閉該權限,致使獲取不到數據。
特色是用於作特徵檢出的目錄文件與底層硬件的關聯性越強,其效果越好,反之越可能失效。建議儘可能提取和虛擬機、硬件驅動相關的文件特徵,缺點是部分特徵可能須要結合大量的機型數據作可靠性驗證。