最近app在推廣過程中發現有大量的用戶使用小號來領取邀請獎勵,而小號的操作往往是利用多開軟件開啓應用分身來登錄。爲此,我需要區分出本體和克隆體。
當今市面上流行的分身主要有三類
1.修改Framework
手機廠商實現的分身功能就是用這種方式實現的
檢測方案:手上有個小米測試機,正好自帶分身,通過getFileDir()的api試了下,在本體得到的是data/data/com.xxx.xxx/files,克隆體得到的是data/user/10/com.xxx.xxx/files
2.修改apk
通過反編譯apk,修改apk包名、簽名等將apk僞裝成另外一個app。市面上常見的第三方多開app大部分都是使用的這種技術。其特點是每次製作一個分身都需要時間拷貝、並且在應用列表中可以看到
檢測方案:
跟上面一樣,可以用getFileDir()來檢測,只不過一個是data/data/com.xxx.xxx/files,另一個是data/data/com.xyz.xyz/files
3.虛擬操作系統
虛擬一個操作系統,克隆體app在這個虛擬系統中運行,在應用列表不可見,代表產品:360分身大師
檢測方案:
這個據說是唯一一種繞過getFileDir()的分身方式,確實這種方式讓我耗費了很長時間,下面以360的分身大師舉例,詳細說下分析過程
- 首先通過getFileDir()嘗試,本體和克隆體輸出一致。失敗!!
- 通過在本體和克隆體登錄不同賬號獲取SP中存儲的賬號信息,確定獲取的信息不同,證明存儲位置不一致
- 通過文件管理器查看最近修改的文件,發現系統根目錄下有一個docker的文件夾,裏面包含了跟根目錄類似的結構,在其裏面的Android/data下就會發現我們自己的包名,分身的本地數據就存放在這裏。
- 找到分身的本地存儲後,本想向其中存儲數據用來標記是否爲分身,但本體運行時報了一個無權限寫入的異常,因此改爲了判斷當前是否有對該目錄的寫入權限
PS:據說“平行空間”原理和“360分身大師”相同,經測試發現通過getDirFile()就可以判斷出來,至此,分身檢測基本完成