最近玩王者榮耀,下載了一個輔助樣本,結果被鎖機了,固然破解它很簡單,這個後面會詳細分析這個樣本,可是由於這個樣本引起出的慾望就是解析Android中鎖屏密碼算法,而後用一種高效的方式製做鎖機惡意樣本。如今的鎖機樣本原理強制性太過於複雜,沒意義。因此本文就先來介紹一下android中的鎖屏密碼算法原理。java
咱們知道Android中現結單支持的鎖屏密碼主要有兩種:mysql
一種是手勢密碼,也就是咱們常見的九宮格密碼圖android
一種是輸入密碼,這個也分爲PIN密碼和複雜字符密碼,而PIN密碼就是四位的數字密碼比較簡單。git
固然如今也有一個高級的指紋密碼,這個不是本文研究的範圍了。咱們只看手勢密碼和輸入密碼算法解析。github
咱們如何找到突破口,其實很簡單,在設置鎖屏密碼界面,用工具分析獲取當前的View類,而後一步一步跟入,最終回到了一個鎖屏密碼工具類:LockPatternUtils.Java,由於每一個版本可能實現邏輯不同,這裏我用5.1的源碼進行分析了,找到這個類以後,直接分析便可。算法
首先咱們來分析一下輸入密碼算法分析:sql
這裏看到有一個方法:passwordToHash方法,參數爲用戶輸入的密碼和當前用戶對應的id,通常設備不會有多個用戶,因此這裏通常userId默認值就是0,下面就是最爲核心的加密算法了:原文密碼+設備的salt值,而後分別MD5和SHA-1操做,轉化成hex值再次拼接就是最終保存到本地的加密密碼了。而這裏如今最重要的是如何獲取設備對應的salt值了,這個能夠一步一步跟蹤代碼:數據庫
查看getSalt方法,他首先會根據字段key爲:lockscreen.password_salt,進行從一個地方獲取salt值,若是發現這個值爲0,就隨機生成一個,而後將其保存到那個地方去,最後會將salt轉化成hex值便可。如今須要找到這個地方,繼續跟蹤代碼:數組
這裏猜測應該是保存到一個數據庫中了,繼續跟蹤代碼:數據結構
這裏是經過SM中獲取一個服務來進行操做了,以前咱們已經把SM都玩爛了,像這種獲取服務,最終實現邏輯都是在XXXService類中,因此這裏應該是LockSettingsService.java類中,找到這個類,查看他的getLong方法:
其實到這裏就很是確定是數據庫保存的了,繼續跟蹤代碼:
這裏果真是保存到一個數據庫中,咱們繼續查看LockSettingStorage.java類:
這裏看到了,數據庫名字叫作:locksettings.db,那麼他保存在哪裏呢?繼續看這個類:
這裏看到有兩個key文件,那麼這個就是用來保存加密以後的手勢密碼和輸入密碼的信息到本地,下次開機解鎖就須要讀取這個文件內容進行密碼比對了。這裏看到一個目錄是system了,因此數據庫和這兩個key文件極可能保存到該目錄下了:/data/system/,不過爲了確保,咱們直接用find命令去根目錄下搜索這個數據庫文件也是能夠的。最終肯定是該目錄:
這裏可能會提示找不到find命令,這時候須要安裝busybox工具了,才能使用這個命令了。找到這個數據庫文件就好辦了,直接取出來,而後用SQLite工具進行查看便可,固然也能夠直接在手機中查看。我爲了方便仍是弄出來看:
這裏看到了這個表格字段,而且獲取到這個值了,那麼下面就要用這個值來驗證咱們的分析是否正確,咱們首先給設備設置一個簡單的輸入密碼,這裏直接輸入簡單的"1234"了,而後會在/data/system目錄下生成一個密碼加密key文件:/data/system/password.key,這時候咱們將改文件導出來:
下面我就用就簡單的Java代碼手動的實現這個算法,看看分析是否正確,加密算法都不用本身寫,直接從上面的源碼中拷貝出來就能夠了:
而後這裏的salt值是咱們從數據庫中拿到的,不過要記得進行hex轉化一下:
而後咱們用"1234"密碼去生成加密以後的信息:
運行直接看結果:
這裏發現內容和上面的password.key內容徹底一致了,也就驗證了,咱們的分析徹底符合,到這裏咱們就分析完了輸入密碼的加密算法,總結一點就是:MD5(輸入明文密碼+設備的salt).Hex+SHA1(輸入明文密碼+設備的salt).Hex;就是最終的加密內容了。而這裏最重要的是如何獲取設備的salt值,這個其實也簡單,咱們能夠用反射機制進行獲取,新建一個簡單的Android工程:
這樣咱們就不用去查看數據庫獲取salt值了,這樣方便快捷:
這個是數據庫中的long類型值轉化成hex以後的值。
下面繼續來分析手勢密碼,代碼依然在LockPatternUtils.java中:
這個算法比較簡單,就是九宮格圖案轉化成字節數組,而後在SHA1加密便可,關於九宮格再也不多說了,從0開始順時針計數到8,相似以下:
這裏看代碼,有行和列之分,因此好比L形狀的手勢密碼應該是:00 03 06 07 08,這樣組成的五個長度的字節。這裏爲了驗證手勢密碼是否正確,咱們設置一個簡單的手勢密碼:
而後在/data/system目錄下生成一個密碼文件:/data/system/gesture.key,弄出來用二進制工具查看,否則可能會看到的是亂碼,這裏用的是010Editor工具查看:
爲了最大化的還原算法,咱們依然把源碼代碼拷貝出來,而後定義一個手勢九宮格類,構造出這個手勢的點數據:
這個是源碼的加密算法,下面在構造出手勢點數據:
手勢點應該是:00 01 02 05 08,打印看看結果:
很是的激動發現,如出一轍,這樣就完美的分析完了,Android系統中鎖屏密碼加密算法了。這裏再一次總結一下兩種方式鎖屏密碼算法:
第一種:輸入密碼算法
將輸入的明文密碼+設備的salt值,而後操做MD5和SHA1以後在轉化成hex值進行拼接便可,最終加密信息保存到本地目錄:/data/system/password.key中
第二種:手勢密碼算法
將九宮格手勢密碼中的點數據轉化成對應的字節數組,而後直接SHA1加密便可。最終加密信息保存到本地目錄中:/data/system/gesture.key中
上面分析完了Android鎖屏密碼加密算法原理,下面就來簡單分析一下,如何破解Android中鎖屏密碼。
第一種:輸入密碼算法
這個若是是針對於PIN類型密碼,只是簡單的四位數字密碼,那麼全部的組合也就是10000個,這時候咱們只須要將這10000個密碼經過加密算法進行加密生成一個密碼庫便可很容易破解。若是是複雜的輸入密碼那麼就沒這麼簡單了,這個或許就須要很是噁心的暴力破解了,隨着密碼長度增長,破解時間會很大。不過通常用戶密碼不會很長的。
第二種:手勢密碼算法
這個其實網上已經有人給出了一個密碼庫了,由於九宮格的圖案能夠所有算出,而後將其轉化成字節數據,在用加密算法加密就能生成一個手勢密碼庫了。具體信息能夠自行網上搜索了。
到這裏,有的同窗會有一些壞的想法了,好比撿到一個手機或者是查看老婆手機密碼,是否能夠直接破解它的密碼呢?大體思路應該很簡單,首先把設備root,由於咱們看到上面分析會發現若是想讀key文件,必須有root權限的,固然root操做在對應的系統版本上仍是有方法操做的。假如root成功了,那麼這時候就獲取他的salt值,而後利用密碼庫開始暴力破解便可。固然這個是悄無聲息的不會被發現的破解,不過你root了其實已經被發現了哈哈,假如你是撿到一個手機,其實沒這麼費勁了,直接刪除key文件,這時候你隨便輸入一個密碼都能解鎖了,這個由於系統在檢查密碼的時候發現key文件不存在,就認爲這個設備沒有密碼鎖,因此你輸入什麼均可以解鎖了。
惋惜到這裏上面說的都是扯淡的,由於你在這一系列的操做前,你必須有一個承認,那就是設備鏈接容許框,咱們在將手機首次鏈接到電腦的時候會彈出一個受權框,若是你不受權,那麼什麼都幹不了。除非這時候利用偉大的漏洞過了這一關,不過通常是辦不到的。那麼如今的問題是,你撿到了一個手機,固然高興的插入到電腦破解的時候會發現,先解鎖,而後才能看到受權框,因此就悲劇了。你什麼都幹不了。就老老實實的把手機還給人家,作一個偉大的良民纔是正道。
注意:
對於這個加密算法系統是不會在某個系統版本改變的,由於你想若是加密算法變了,加入4.4用戶升級到5.0,結果發現加密算法變了,手機解鎖失敗,用戶會瘋的,我頁查看了2.3的代碼,算法是如出一轍的。因此就把算法整理了一份Java工程放到github上,感興趣的同窗能夠下載查看或者直接使用操做便可。變的多是設備的salt值,或者數據庫文件等發生變化。可是加密算法是不會改變的。
加密算法源碼:https://github.com/fourbrother/AndroidScreenOffPwd
我相信你們讀完這篇文章都是火燒眉毛的想手動嘗試一下,在操做以前必定要記住,先拿到你設備的salt值,這個方式有兩種,一種是查看/data/system/locksetting.db文件,一種是用反射獲取。而後就要注意的是源碼版本,本文介紹的是5.1版本以及5.1設備進行操做,因此你操做的時候必定要注意版本,不過版本不同,這樣的算法不會變的。