Question | 關於Android安全的一二事
近期很多人咨詢盾盾關於Android安全的各類問題,在此整理了一篇問答合集,以饗讀者。
Android界面劫持
一.什麽是Android界面劫持
界面劫持是指在Android系統中,惡意軟件通過監控目標軟件的運行,當檢測到當前運行界面為某個被監控應用的特定界面時(一般為登錄或支付界面),彈出偽造的釣魚頁面,從而誘導用戶輸入信息,最終竊取用戶的隱私(惡意盜取用戶賬號、卡號、密碼等信息),或者利用假冒界面進行釣魚欺詐。
二. 常見×××手段
-
監聽系統Logocat日誌,一旦監聽到發生Activity界面切換行為,即進行×××,覆蓋上假冒Activity界面實施欺騙。
-
監聽系統API,一旦惡意程序監聽到相關界面的API組件調用,即可發起×××。
-
5.0以下機型枚舉獲取棧頂Activity,監控到目標Activity出現,即可發起×××。
- 惡意啟動Service監聽目標應用,在切換到目標Activity時,彈出對話框劫持當前界面迷惑用戶
三. 預防手段
● 針對用戶
Android手機均有一個HOME鍵,長按可以查看到近期任務。用戶在要輸入密碼進行登錄時,可以通過長按HOME鍵查看近期任務,比如說登錄微信時長按發現近期任務出現了微信,那麽現在的這個登錄界面就極有可能是一個惡意偽裝的Activity,切換到另一個程序,再查看近期任務,就可以知道這個登錄界面是來源於哪個程序了。
● 針對開發人員
針對釣魚Activity類型劫持,在登錄窗口或者用戶隱私輸入等關鍵Activity的onPause方法中檢測最前端Activity應用是不是自身或者是系統應用,如果發現惡意風險,則給用戶一些警示信息,提示用戶其登陸界面以被覆蓋,並給出覆蓋正常Activity的類名。
如果是針對彈窗對話框類型的劫持,接管Activity的生命周期,當發現當前界面onResume之後,判斷是否失去焦點;如果同時存在則有可能是對話框類劫持,判斷此時運行的活動進程是否包含敏感權限(全局Alert權限、獲取任務棧權限等),如果有的話則給用戶告警。
Android 的 APK 中怎麽放置反編譯“×××”
上面文章裏提到的"×××", 其實就是反編譯器的 bug,所以針對不同的反編譯器,需要設計不同的“×××”。先了解一下常用的 APK 反編譯工具:
● baksmali/smali: baksmali 能將二進制 dex 文件轉化為 smali 文本文件用於分析,smali 則能將 smali 文件重新編譯為 dex 文件。
● Apktool : 整合了 baksmali/smali 用於處理 dex 文件, 另外實現了 res 資源文件(比如layout / strings等)的反編譯。
● AxmlPrinter : 用於將二進制形式的 AndroidManifest.xml 轉換為文本形式的 AndroidManifest.xml。
● dex2jar: 能將 dex 轉化為 jar 文件。
● jd-gui: 能將 jar 文件反編譯為 java 源代碼。
● Ida Pro: 主要用於反編譯 Apk 中的 So 文件,也支持將 dex 文件反編譯為類似smali 語法的文本形式指令。
從上面的反編譯工具可以看出,主要分三種功能:
● 反編譯資源,如 AndroidManifest.xml、layout.xml
● 反編譯 Dex 文件,或者進一步將 Dex 文件轉換為 Java 代碼
● 反編譯 So 文件
×××”的設置需要對特定的文件格式有相當的了解,而且可能只能針對某個反編譯工具的。
Android app如何加密?
android app包含的內容有dex文件,so文件,res,assets資源文件。對應的加密按此內容分為三大方面:dex保護、so加密、資源保護(res, assets)。
● dex保護
由於未保護的dex文件,是從java編譯打包而來,破解成本低較易受到×××。其保護措施從最基本的加殼,到函數執行體抽取、動態加載,再到當前的vmp虛擬機加固,安全逐步增強。尤其是vmp加固,更是使用了自研虛擬機解釋函數體,如果指令加密替換做的好,會讓破解者很難受。
● so加密
so文件,由起初的段加密,發展到自定義elf結構的加密方式,能防止IDA查看函數名稱,增加破解成本和難度。
● 資源保護
res資源文件,通常只采用混淆的方式增加逆向難度。assets資源,一般不處理。但隨時H5應用日益增多,部分廠商(易盾、娜迦)有提供assets加密的功能,實現原理不詳。
除了上述三點防護外,還有防反編譯、防二次打包、防調試、防模擬器、防xposed功能等。
a) 防反編譯,一般是對市面上的反編譯工具(例如apktool)做對抗,利用其漏洞,致使反編譯失敗;
b) 防二次打包,一般常用的是在代碼裏保存簽名信息,啟動時在native層將當前apk的簽名信息與保存的簽名進行比對。市面上已有破擊工具。可以在常用實現方式上做些升級。
c) 防調試,通過ptrace進程,阻止破解者再ptrace調試。
d) 防模擬器,檢測/system/bin/su和/system/xbin/su文件。
e) 防xposed,通過檢測XposedHelpers的methodCache,判斷是否被hook。
Question | 關於Android安全的一二事