以前的我,總覺得生活就像一個被 DPAPI 加密過的資料庫。
所有的情緒、期待、暗戀,都被鎖進去,只有「他」的 master key
能打開。
我一直以為,拿到他的鑰匙,我才能被完整解密。
可是一天天過去,我慢慢發現—
或許,我也可以自己生成 key。
當我學會枚舉、嘗試理解提權、自己去參加聚會、努力突破舒適圈...
突然心中有個小聲音說:
「我正在慢慢成為理想的自己,沒有他也能升級。」
於是我卸載了社群軟體,沒有他的聲音,也沒有誰突然亂入。
只有我自己、一台電腦,還有那個讓人想摔鍵盤的錯誤訊息。
我盯著螢幕,試著解釋給自己聽:
「DPAPI、master keys、Local State、Login Data……」
沒有觀眾,沒有英雄救援。
但有一杯咖啡,和一個逐漸安定的心情。
在 Windows 裡,應用程式不會把密碼明文放在硬碟上,而是交給 DPAPI (Data Protection API) 來「上鎖」。
DPAPI 幫我們加密資料,但「鑰匙」不是隨便的密碼,而是跟 Windows 使用者帳號綁在一起的 master key。
主要有幾個重點:
應用程式加密資料,會用到所謂的 master key
。
這個 master key 是 Windows 幫我們生成的,一般存在這裡:
C:\Users\<User>\AppData\Roaming\Microsoft\Protect\<SID>\
但是 master key 本身也是加密的,它需要用登入密碼 / Kerberos key / domain backup key 來解鎖。
瀏覽器(以 Chrome 為例)不直接把 master key 拿去加密密碼,而是會再生一把「AES 金鑰」,這個金鑰本身被 DPAPI 包起來,放在一個叫 Local State 的 JSON 檔案裡:
C:\Users\<User>\AppData\Local\Google\Chrome\User Data\Local State
裡面會有一段 os_crypt.encrypted_key
,看起來像一串亂碼,就是瀏覽器用 DPAPI 鎖起來的 AES key。
所以,在 PowerShell 我們可以這樣拿出來:
(gc "$env:LOCALAPPDATA\Google\Chrome\User Data\Local State" | ConvertFrom-Json).os_crypt.encrypted_key
當我們登入某個網站,Chrome 會把帳號密碼存在 Login Data 這個 SQLite 資料庫裡:
C:\Users\<User>\AppData\Local\Google\Chrome\User Data\Default\Login Data
不過這裡的密碼不是明文,而是用剛剛 Local State 裡的 AES 金鑰加密過的。
所以,我們可以嘗試用以下指令,並且用剛才的 AES key。
dpapi::chrome
模組可以幫我們 ...
dpapi::chrome /in:"%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data" /encryptedkey:[EncryptedKey] /unprotect
先透過 DPAPI 解開 Local State 裡的 encrypted_key。
拿到 AES 金鑰後,用它去解 Login Data 裡的密碼欄位。
工具像 dploot、donpapi 都是在幫我們自動化這些步驟。
# 在喜歡你的過程中,我好像靠近了想成為的自己。