直接利用Android手機破解微信加密數據庫EnMicroMsg.db

原文:http://blog.csdn.net/yuanbohx/article/details/41674949

================================================

※首先,簡單介紹一下微信加密數據庫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自有庫:


最後在程序中加入讀取加密數據庫的關鍵代碼即可:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public void readWeChatDatabase() {  
  2.           
  3.         SQLiteDatabase.loadLibs(this);  
  4.         String password = "XXXXXXX";      
  5.         File databaseFile = getDatabasePath("/data/data/com.tencent.mm/MicroMsg/47d58c79e692e212XXXXXXXXXXXXX/EnMicroMsg.db");  
  6.         //File databaseFile = getDatabasePath("EnMicroMsg.db");  
  7.         eventsData = new myDataHelper(this);  
  8.           
  9.         SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){  
  10.               public void preKey(SQLiteDatabase database){  
  11.               }  
  12.               public void postKey(SQLiteDatabase database){  
  13.                   database.rawExecSQL("PRAGMA cipher_migrate;");  //最關鍵的一句!!!  
  14.               }  
  15.         };  
  16.       
  17.         try {  
  18.             SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(databaseFile, "XXXXXXX(密碼)"null, hook);         
  19.             Cursor c = db.query("message"nullnullnullnullnullnull);  
  20.             while (c.moveToNext()) {    
  21.                 int _id = c.getInt(c.getColumnIndex("msgId"));    
  22.                 String name = c.getString(c.getColumnIndex("content"));    
  23.                 Log.i("db""_id=>" + _id + ", content=>" + name);    
  24.             }    
  25.             c.close();  
  26.             db.close();  
  27.         } catch (Exception e) {}  
  28.     }  

程序很簡答,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位,最後用算出的解密碼對數據庫進行解密。

發佈了7 篇原創文章 · 獲贊 30 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章