咱們在以前的《忘記了手機鎖怎麼辦》這篇文章中已經介紹了暴力刪除手機圖形鎖、密碼鎖的方法。今天介紹另一種破解圖案鎖的方法。不過先要提醒你們,千萬不要作壞事呦!php
1、前提條件安全
手機須要root,並且打開調試模式。通常來說,若是用過諸如「豌豆莢手機助手」、「360手機助手」一類的軟件,都會被要求打開調試模式的。若是要刪除手機內置軟件,則須要將手機root。對於root有顧慮的童鞋,能夠看看這篇文章《到底應該如何看待root這件事》http://www.morecomtech.com/community/article/jsfa/w2015110001.php加密
2、原理分析spa
首先科普一下,安卓手機是如何標記這9個點的。經過閱讀安卓系統源碼可知,每一個點都有其對應的編號,組成了一個3×3的矩陣,形如:調試
00 01 02orm
03 04 05字符串
06 07 08get
假如設定解鎖圖形爲一個「L」形,如圖:源碼
那麼這幾個點的排列順序是這樣的:00 03 06 07 08。系統就記下來了這一串數字,而後將這一串數字(以十六進制的方式)進行SHA1加密,存儲在了手機裏的/data/system/gesture.key 文件中。咱們用數據線鏈接手機和電腦,而後ADB鏈接手機,將文件下載到電腦上(命令:adb pull /data/system/gesture.key gesture.key),如圖:hash
用WinHex等十六進制編輯程序打開gesture.key,會發現文件內是SHA1加密過的字符串:c8c0b24a15dc8bbfd411427973574695230458f0,如圖:
當你下次解鎖的時候,系統就對比你畫的圖案,看對應的數字串是否是0003060708對應的加密結果。若是是,就解鎖;不是就繼續保持鎖定。那麼,若是窮舉全部的數字串排列,會有多少呢?聯想到高中的階乘,若是用4個點作解鎖圖形的話,就是9x8x7x6=3024種可能性,那5個點就是15120,6個點的話60480,7個點181440,8個點362880,9個點362880。總共是985824種可能性(但這麼計算並不嚴密,由於同一條直線上的點只能和他們相鄰的點相連)。滿打滿算,也不到985824種可能性。乍一看很大,但在計算機面前,窮舉出來這些東西用不了幾秒鐘。
3、破解過程
知道了原理,就着手寫程序來實現吧。這裏使用了Python來完成任務。主要應用了hashlib模塊(對字符串進行SHA1加密)和itertools模塊(Python內置,生成00-09的排列組合)。主要流程爲:
一、ADB鏈接手機,獲取gesture.key文件
二、讀取key文件,存入字符串str_A
三、生成所有可能的數字串
四、對這些數字串進行加密,獲得字符串str_B
五、將字符串str_A與str_B進行對比
六、若是字符串A,B相同,則說明數字串num就是想要的解鎖順序
七、打印出數字串num
下面爲程序:
4、總結
從程序自己來講,獲得解鎖密碼後應該用break跳出循環並終止程序運行。但Python並無跳出多重循環的語句,若是要跳出多重循環,只能設置標誌位而後不停進行斷定。爲了運行速度就略去了「跳出循環」這個步驟。(有沒有更好的實現跳出多重循環的方法?)另外也略去了不少容錯語句。
從破解目的來講,若是單單是忘記了本身的手機圖形鎖密碼,徹底能夠用更簡單的辦法:ADB鏈接手機,而後「adb rm /data/system/gesture.key」刪除掉gesture.key文件,此時圖形鎖就失效了,隨意畫一下就能解鎖,在《忘記了手機鎖怎麼辦》http://www.morecomtech.com/community/article/sjjc/w2015110501.php這篇文章中已經介紹過。
最後提一個安全小建議:若是手機已root,還要用「XX手機助手」,還想設置圖形鎖的話——在手機「設置」選項裏,有一個「鎖定狀態下取消USB調試模式」(這個名字因手機而異,並且有的有此選項,有的手機就沒有),開啓此功能以後,在手機鎖定狀態下就可以防範此類攻擊了。
做者:Keung
原文地址:http://www.morecomtech.com/community/article/sjjc/w2015110502.php