Android Read WhatsApp Data

До сих пор я много whatsapp db file расшифровке whatsapp db file с расширением,

.db.crypt5

Но никакой подход не работал для меня. Я попробовал Crypto.class, который можно увидеть много в ссылках stackoverflow, чтобы прочитать файл данных watsapp databse, но этот файл также не работал для меня.

Это мой Crypto.class :

  import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.spec.SecretKeySpec; import android.util.Log; public class Crypto { public FileInputStream mIn; public FileOutputStream mOut; public Crypto(String fileIn, String fileOut) { try { mIn = new FileInputStream(new File(fileIn)); mOut = new FileOutputStream(new File(fileOut)); decrypt(mIn, mOut); } catch (Exception e) { e.printStackTrace(); } } public static void decrypt(InputStream in, FileOutputStream out) throws Exception { final String string = "346a23652a46392b4d73257c67317e352e3372482177652c"; byte[] hexAsBytes = hexStringToByteArray(string); SecretKeySpec keySpec = new SecretKeySpec(hexAsBytes, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, keySpec); in = new CipherInputStream(in, cipher); byte[] buffer = new byte[24]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); String si = new String(buffer); Log.d("Crypto", si); } } public static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for(int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16)); } return data; } } 

И вот как я вызываю конструктора в своей деятельности:

 Crypto c = new Crypto("/sdcard/WhatsApp/Databases/msgstore.db.crypt5", "/sdcard/My_Folder_Name/watsapp"); 

Я просто хочу расшифровать этот файл и посмотреть все чаты. Для тестирования я пытаюсь использовать этот файл msgstore.db.crypt5 .

Мне нужна помощь, когда я делаю неправильно?

Solutions Collecting From Web of "Android Read WhatsApp Data"

Я сделал это, используя следующее:

Корни устройства и попробуйте этот код ::

 public void copyDbToSdcard() { try { String comando = "cp -r /data/data/com.whatsapp/databases/msgstore.db /sdcard/My_Custom_Folder/"; Process suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); os.writeBytes(comando + "\n"); os.flush(); os.writeBytes("exit\n"); os.flush(); try { int suProcessRetval = suProcess.waitFor(); if(255 != suProcessRetval) { // } else { // } } catch (Exception ex) { Log.e("ERROR-->", ex.toString()); } } catch (Exception e) { e.printStackTrace(); } } private void openAndQueryDatabase() { try { DataBaseHelper dbHelper = new DataBaseHelper(this.getApplicationContext()); newDB = dbHelper.getWritableDatabase(); Cursor c = newDB.rawQuery("SELECT data FROM messages where data!=''", null); if(c != null) { if(c.moveToFirst()) { do { String data = c.getString(c.getColumnIndex("data")); results.add(data); //adding to arrayList } while (c.moveToNext()); } } while (c3.moveToNext()); } } } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } } 

А затем отобразите результаты в TextView или, если хотите.

Приветствия! 🙂

Рабочий код Android: (не требуется root)

Когда у вас есть доступ к файлу dbcrypt5, вот код андроида для его расшифровки:

 private byte[] key = { (byte) 141, 75, 21, 92, (byte) 201, (byte) 255, (byte) 129, (byte) 229, (byte) 203, (byte) 246, (byte) 250, 120, 25, 54, 106, 62, (byte) 198, 33, (byte) 166, 86, 65, 108, (byte) 215, (byte) 147 }; private final byte[] iv = { 0x1E, 0x39, (byte) 0xF3, 0x69, (byte) 0xE9, 0xD, (byte) 0xB3, 0x3A, (byte) 0xA7, 0x3B, 0x44, 0x2B, (byte) 0xBB, (byte) 0xB6, (byte) 0xB0, (byte) 0xB9 }; long start = System.currentTimeMillis(); // create paths backupPath = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/WhatsApp/Databases/msgstore.db.crypt5"; outputPath = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/WhatsApp/Databases/msgstore.db.decrypt"; File backup = new File(backupPath); // check if file exists / is accessible if (!backup.isFile()) { Log.e(TAG, "Backup file not found! Path: " + backupPath); return; } // acquire account name AccountManager manager = AccountManager.get(this); Account[] accounts = manager.getAccountsByType("com.google"); if (accounts.length == 0) { Log.e(TAG, "Unable to fetch account!"); return; } String account = accounts[0].name; try { // calculate md5 hash over account name MessageDigest message = MessageDigest.getInstance("MD5"); message.update(account.getBytes()); byte[] md5 = message.digest(); // generate key for decryption for (int i = 0; i < 24; i++) key[i] ^= md5[i & 0xF]; // read encrypted byte stream byte[] data = new byte[(int) backup.length()]; DataInputStream reader = new DataInputStream(new FileInputStream( backup)); reader.readFully(data); reader.close(); // create output writer File output = new File(outputPath); DataOutputStream writer = new DataOutputStream( new FileOutputStream(output)); // decrypt file Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secret = new SecretKeySpec(key, "AES"); IvParameterSpec vector = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, secret, vector); writer.write(cipher.update(data)); writer.write(cipher.doFinal()); writer.close(); } catch (NoSuchAlgorithmException e) { Log.e(TAG, "Could not acquire hash algorithm!", e); return; } catch (IOException e) { Log.e(TAG, "Error accessing file!", e); return; } catch (Exception e) { Log.e(TAG, "Something went wrong during the encryption!", e); return; } long end = System.currentTimeMillis(); Log.i(TAG, "Success! It took " + (end - start) + "ms"); 

Я нашел код этого кода здесь, он принимает файл msgstore.db.crypt5 и создает msgstore.db, тогда вы можете открыть файл с помощью любого браузера sqlite.

  package whatsapp; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.math.BigInteger; import java.security.MessageDigest; import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class WhatsAppDecrypt5 { private static final byte[] INITIALIZATION_VECTOR = hexStringToByteArray("1e39f369e90db33aa73b442bbbb6b0b9"); private static final byte[] ENCRYPTION_KEY = hexStringToByteArray("8d4b155cc9ff81e5cbf6fa7819366a3ec621a656416cd793"); public static void main(String[] args) throws Exception { if (args.length != 3) { System.out.println("usage <inputfile> <outputfile> <email>"); // System.exit(0); } decrypt(new File("/Users/ovazquez/Downloads/msgstore.db.crypt5"), new File("/Users/ovazquez/Downloads/msgstore.db"), "theasociatedemail@gmail.com"); System.out.println("finalizado"); } private static void decrypt(File inputFile, File outputFile, String email) throws Exception { String emailMD5 = md5(email); byte[] emailMD5Bytes = hexStringToByteArray(emailMD5 + emailMD5); byte[] decryptionKey = Arrays.copyOf(ENCRYPTION_KEY, 24); for (int i = 0; i < 24; i++) { decryptionKey[i] ^= emailMD5Bytes[i & 0xF]; } Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE"); cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(decryptionKey, "AES"), new IvParameterSpec(INITIALIZATION_VECTOR)); CipherInputStream cIn = new CipherInputStream(new FileInputStream(inputFile), cipher); FileOutputStream fOut = new FileOutputStream(outputFile); byte[] buffer = new byte[8192]; int n; while ((n = cIn.read(buffer)) != -1) { fOut.write(buffer, 0, n); } cIn.close(); fOut.close(); } private static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character .digit(s.charAt(i + 1), 16)); } return data; } private static String md5(String md5) throws Exception { MessageDigest m = MessageDigest.getInstance("MD5"); m.reset(); m.update(md5.getBytes()); byte[] digest = m.digest(); BigInteger bigInt = new BigInteger(1, digest); return bigInt.toString(16); } }