當前位置:
首頁 > 最新 > Android逆向之旅-Android中鎖屏密碼演算法解析以及破解方案

Android逆向之旅-Android中鎖屏密碼演算法解析以及破解方案

一、前言

最近玩王者榮耀,下載了一個輔助樣本,結果被鎖機了,當然破解它很簡單,這個後面會詳細分析這個樣本,但是因為這個樣本引發出的慾望就是解析Android中鎖屏密碼演算法,然後用一種高效的方式製作鎖機惡意樣本。現在的鎖機樣本原理強制性太過於複雜,沒意義。所以本文就先來介紹一下Android中的鎖屏密碼演算法原理。

二、鎖屏密碼方式

我們知道Android中現結單支持的鎖屏密碼主要有兩種:

一種是手勢密碼,也就是我們常見的九宮格密碼圖

一種是輸入密碼,這個也分為PIN密碼和複雜字元密碼,而PIN密碼就是四位的數字密碼比較簡單。

當然現在也有一個高級的指紋密碼,這個不是本文研究的範圍了。我們只看手勢密碼和輸入密碼演算法解析。

三、密碼演算法分析

我們如何找到突破口,其實很簡單,在設置鎖屏密碼界面,用工具分析獲取當前的View類,然後一步一步跟入,最終回到了一個鎖屏密碼工具類:LockPatternUtils.Java,因為每個版本可能實現邏輯不一樣,這裡我用5.1的源碼進行分析了,找到這個類之後,直接分析即可。

第一、輸入密碼演算法分析

首先我們來分析一下輸入密碼演算法分析:

這裡看到有一個方法: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了,不過為了確保,我們直接用find命令去根目錄下搜索這個資料庫文件也是可以的。最終確定是該目錄:/data/system/

這裡可能會提示找不到find命令,這時候需要安裝busybox工具了,才能使用這個命令了。找到這個資料庫文件就好辦了,直接取出來,然後用SQLite工具進行查看即可,當然也可以直接在手機中查看。我為了方便還是弄出來看:

這裡看到了這個表格欄位,並且獲取到這個值了,那麼下面就要用這個值來驗證我們的分析是否正確,我們首先給設備設置一個簡單的輸入密碼,這裡直接輸入簡單的"1234"了,這時候我們將改文件導出來:/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,這樣組成的五個長度的位元組。這裡為了驗證手勢密碼是否正確,我們設置一個簡單的手勢密碼:

弄出來用二進位工具查看,不然可能會看到的是亂碼,這裡用的是010Editor工具查看:/data/system/gesture.key

為了最大化的還原演算法,我們依然把源碼代碼拷貝出來,然後定義一個手勢九宮格類,構造出這個手勢的點數據:

這個是源碼的加密演算法,下面在構造出手勢點數據:

手勢點應該是: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值,或者資料庫文件等發生變化。但是加密演算法是不會改變的。

五、總結

我相信大家讀完這篇文章都是迫不及待的想手動嘗試一下,在操作之前一定要記住,先拿到你設備的salt值,一種是用反射獲取;然後就要注意的是源碼版本,本文介紹的是5.1版本以及5.1設備進行操作,所以你操作的時候一定要注意版本,不過版本不一樣,加密演算法不會改變的。一種是查看/data/system/locksetting.db文件,一種是用反射獲取;然後就要注意的是源碼版本,本文介紹的是5.1版本以及5.1設備進行操作,所以你操作的時候一定要注意版本,不過版本不一樣,加密演算法不會改變的。

手機查看文章不方便,可以網頁看

交流和諮詢可以進入小密圈:點擊這裡

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 編碼美麗 的精彩文章:

Android中破解應用簽名校驗的後續問題處理方案

TAG:編碼美麗 |

您可能感興趣

Android Studio項目模板全面解析
Bayesian Personalized Ranking 演算法解析及Python實現
Android項目解耦-路由框架ARouter源碼解析
Google的開源Consent解決方案解析APUS研究院
網關 Spring-Cloud-Gateway 源碼解析——路由之RouteDefinitionLocator一覽
Moto E5 Play Android Go手機發布:真上古解析度
AMD 7nm Radeon Instinct計算卡解析:遊戲卡明年見
技術解析系列PouchContainer Goroutine Leak 檢測實踐
AtomicInteger 源碼解析
Marvell第二代ARM處理器ThunderX2解析:不遜Intel至強
使用 Python的urlliib.parse 庫解析 URL
druid-spring-boot-starter源碼解析
精讀解析 《When Sophie Gets Angry》
Photoshop詳細解析CameraRaw插件使用
android 訪問webservice(解析一行代碼實現)
Istio技術與實踐02:源碼解析之Istio on Kubernetes 統一服務發現
藉助Jackson的JsonTypeInfo註解實現多態類的解析
筆尖星球之Android文件管理神器:Handshaker新增亮點解析
osg例子解析-osgsimpleshaders
深度解析政府監聽工具FinFisher:Windows