2014年12月5日 星期五

破解 Android 圖形鎖 (需 root)

Android 從很早開始,就能夠設定在鎖定畫面使用圖形鎖來進行安全性的保護,如下圖:


但其實這個 LockScreen 的圖形密碼(底下簡稱 pattern),是以簡單的方做儲存的。

因此,如果萬一不小心忘記密碼或者被朋友「銃康」,也是有機會可以找回來。

但是,這個還是需要兩個前提 :
  1.  手機的 USB 除錯模式必須是開啟的,因為要使用 adb 指令
  2.  手機必須有 root 權限,並允許 ADB Shell 取得最高權限

部分「玩家」有 root 手機的其實大部分都會把 USB 除錯模式打開,這要些人要特別注意萬一手機掉了,別人也是可以輕鬆的破解你的圖形鎖。

首先先來介紹 Android 是如何記錄這個圖形所的:



我們先將九個解鎖圖形點給予 0~8 的編號:


而在依照解鎖路線所經過的點依序將數字排好,比如劃一個 Z 字型:
0 -> 1 -> 2 -> 4 -> 6 -> 7 -> 8

Android 會將這組數字進行加密,並儲存在 /data/system/gesture.key 檔案中。
加密的方式也很簡單,先將這組數字做成一個 byte 陣列:

Java
    byte[] ptn = new byte[7];
    ptn[0] = (byte)0;
    ptn[1] = (byte)1;
    ptn[2] = (byte)2;
    ptn[3] = (byte)4;
    ptn[4] = (byte)6;
    ptn[5] = (byte)7;
    ptn[6] = (byte)8;

C / C++ ( char is 1 byte )
    unsigned char ptn[7];
    ptn[0] = 0;
    ptn[1] = 1;
    ptn[2] = 2;
    ptn[3] = 4;
    ptn[4] = 6;
    ptn[5] = 7;
    ptn[6] = 8;

接著按照順序,將這些 bytes 進行 SHA-1 的演算法計算後,直接將結果儲存到 gesture.key 中。如上例,得到的 SHA-1 Code 是
    0b 35 b3 c2 9f 2f c6 eb 17 a8 29 eb 75 d7 2d b4 5e 38 59 7b 

則 gesture.key 的檔案內容就是這樣:




參考 Code (可以自己改寫執行)
Ideone (可線上執行) :  http://ideone.com/YvyLYT
Pastie (純原始碼) : http://pastie.org/9761704

根據 Android 要求解鎖圖形至少要有 4 個點,去算排列組合,大概不到 100000 種組合,如果再扣掉一些 不可跳過的點(如:0 → 2 一定會經過 1  ;  2→8 一定會經過 5),總共的筆數可以在下縮。

因此我們可以將所有狀況都排出來,並計算各自的 SHA-1 Code 製作成字典,並撰寫程式,透過 adb shell 取出 gesture.key ( 一般來說這個是 owner read only,所以需要 root 權限 ),並將檔案內容取出後去字典搜尋找出相對應的 pattern 即可。

做好的 sqlite3 字典檔案壓縮後大約有 50M,有點大,因此這邊先不上傳,有興趣可以用程式自己做。或者等找到適合的空間在上傳。

DEMO 影片: http://youtu.be/kdfsznRAnJA

程式載點:http://www.mediafire.com/download/0n131o27nw5l265/LockHack.rar
 因為包含 16xMB 的字典檔案,所以很大,壓縮後有 50MB 左右

3 則留言:

  1. adb shell rm /data/system/gesture.key不就好了?

    回覆刪除
    回覆
    1. 那個是移除圖形鎖設定,這篇是在講找出 Pattren

      刪除
    2. 我安裝了 但是都沒有跑

      刪除