直接利用Android手機破解加密資料庫EnMicroMsg.db,enmicromsg.db
※首先,簡單介紹一下加密資料庫EnMicroMsg.db的破解方法:
要先批評一下,居然用開源的資料庫加密方式,這不是一破解一個準嗎...
如果你的模擬器或者真機已經獲得了root許可權,就可以直接將記錄聊天記錄的資料庫檔案拷貝出來,資料庫檔案具體存放位置如下:
在/data/data/中:
(題外話:android原生的模擬器root起來很複雜,推薦一款第三方模擬器:genymotion,很方便)
※我們拿到EnMicroMsg.db後,用常用的資料庫管理軟體開啟,發現EnMicroMsg.db被加密了,但是密碼建置規則很簡單,具體如下:
(手機IMEI + uin )取MD5的前7位
手機的IMEI擷取:手機撥號盤輸入:*#06#
uin擷取:http://blog.csdn.net/yuanbohx/article/details/41280837
但是即使算出來解密密碼,我們仍發現用剛才使用的資料庫管理軟體是打不開的。因為其用的是SQLCipher開源庫提供的加密解密演算法,故在網上下載SQLCipher.exe這個軟體,開啟.db檔案時,輸入計算出來的密碼後,就可以開啟EnMicroMsg.db檔案了:
※上面提到了SQLCipher是一個提供資料庫檔案加密解密功能的第三方開源庫,我們先來訪問以下他們的官網看個究竟:
https://www.zetetic.net/sqlcipher/open-source/
我們驚喜的發現,現在SQLCipher提供了Android作業系統的開源庫,源碼在Github上可以下載獲得,但是我嘗試下載了Github上的工程,編譯的時候遇到了很多問題,導致最終沒有編譯成功。所以建議大家下載如所示的開源庫壓縮包:
解壓下載的壓縮包,其目錄如所示:
※下面涉及到Android工程建立、匯入SQLCipher開源庫等工作:
建立Android工程就不詳細說了,建立完工程後,直接將sqlcipher-for-android-v3.2.0檔案夾中的內容全部拷貝到android工程中即可:
接下來的步驟也很關鍵:
右鍵工程,Build Path → Configure Build Path,按照所示添加相應的jar包,刪除android自有庫:
最後在程式中加入讀取加密資料庫的關鍵代碼即可:
public void readWeChatDatabase() {SQLiteDatabase.loadLibs(this);String password = "XXXXXXX";File databaseFile = getDatabasePath("/data/data/com.tencent.mm/MicroMsg/47d58c79e692e212XXXXXXXXXXXXX/EnMicroMsg.db");//File databaseFile = getDatabasePath("EnMicroMsg.db");eventsData = new myDataHelper(this);SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){ public void preKey(SQLiteDatabase database){ } public void postKey(SQLiteDatabase database){ database.rawExecSQL("PRAGMA cipher_migrate;"); //最關鍵的一句!!! }};try {SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(databaseFile, "XXXXXXX(密碼)", null, hook);Cursor c = db.query("message", null, null, null, null, null, null);while (c.moveToNext()) { int _id = c.getInt(c.getColumnIndex("msgId")); String name = c.getString(c.getColumnIndex("content")); Log.i("db", "_id=>" + _id + ", content=>" + name); } c.close();db.close();} catch (Exception e) {}}
程式很簡答,password即為資料庫的加密密碼,databaseFile為資料庫檔案路徑,database.rawExecSQL("PRAGMA cipher_migrate")這句最為關鍵,原因如下:
現在SQLCipher for Android已經是3.X版本了,而居然還停留在2.X時代,所以這句話是為了能夠用3.X的開源庫相容2.X的加密解密方法,如果不加這句話,是無法對資料庫進行解密的。
(題外話:SQLCipher的功能確實相當強大,我這裡介紹的只是冰山一角,更多的功能大家可以通過其官網或者Github中提供的工程代碼進行探究)
最後展示一下程式運行效果,從Logcat資訊可以看到,我們成功讀取了的EnMicroMsg.db檔案中的message資料表:
當然,我所做的工作有著明顯的不足,即需要先通過各種人工方式計算出資料庫解密密碼,然後再進行.db檔案的解密。有興趣的網友可以嘗試直接在程式中取得IMEI與uin(這個應該是痛點),然後MD5取前7位,最後用算出的解密碼對資料庫進行解密。