如何阅读WhatsApp Messengers SQLite3数据库中的thumb_image列?

时间:2014-07-18 15:13:03

标签: database sqlite whatsapp

Android WhatsApp messenger使用sqlite3数据库。其中一列是“thumb_image”。我相信这是一个“Java序列化对象”(前两个字节的十六进制是“AC ED”),但我不确定如何完全读取文件的内容。

通过执行以下操作,我得到了上面提到的文件(“Java序列化对象”):

  1. 使用Sqlite3将数据库转储到文件中。
  2. 解码thumb_image列中的十六进制字符串,以查找具有媒体对象的任何消息(行)。

    echo '<thumb_image_column_hex_data>' | xxd -r -p > jdefile

  3. 我想我的问题可能是如何阅读Java序列化对象,但我不确定它确实是这样一个对象。如果它确实是这样的对象有一种从它读取数据的方法。 jdefile的ASCII显示它具有相应的WhatsApp消息中的媒体对象路径等信息。

    [TOOL]来自xda-developers的Whatsapp Xtract也没有帮助我提供这些数据。

1 个答案:

答案 0 :(得分:2)

好了解如何做到这一点(这是一种快速而肮脏的方法)。

  1. 下载并安装Java SDK(相应地设置路径和类路径变量)
  2. 转储WhatsApp数据库:

    sqlite3 msgstore.db
    .output dump.sql
    .dump
    .exit
    
  3. 在您要读取/修改的dump.sql文件中找到thumb_image列。例如:

    X'ACED0......
    
  4. 使用以下命令将上述数据写入二进制格式(注意:使用从data.sql文件中获取的完整数据代替ACED000...

    echo 'ACED000...' | xxd -r -p > thumb.ser
    
  5. 使用以下命令生成以下java文件:

    • MediaData.java:

      package com.whatsapp;
      
      import java.io.File;
      import java.io.Serializable;
      
      public class MediaData implements Serializable {
      static final long serialVersionUID = -3211751283609594L;
      
      boolean autodownloadRetryEnabled;
      int faceX;
      int faceY;
      long fileSize;
      long progress;
      boolean transcoded;
      boolean transferred;
      long trimFrom;
      long trimTo;
      File file;
      
      public boolean get1() {
          return autodownloadRetryEnabled;
      }
      
      public int get2() {
          return faceX;
      }
      
      public int get3() {
          return faceY;
      }
      
      public long get4() {
          return fileSize;
      }
      
      public long get5() {
          return progress;
      }
      
      public boolean get6() {
          return transcoded;
      }
      
      public boolean get7() {
          return transferred;
      }
      
      public long get8() {
          return trimFrom;
      }
      
      public long get9() {
          return trimTo;
      }
      
      public File get10() {
          return file;
      }
      }
      
    • readdata.java:

      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      
      import com.whatsapp.MediaData;
      
      public class readdata {
      
          public static void main(String[] args) {
      
              try {
                  //Create Mediadata object
                  MediaData md;
      
                  //Read bianry data
                  ObjectInputStream oin = new ObjectInputStream(new FileInputStream("thumb.ser"));
      
                  //Set Mediadata object "md" to data ready from binary file using Mediadata cast
                  md = (MediaData) oin.readObject();
      
                  //Print Existing Values
                  System.out.println(md.get1());
                  System.out.println(md.get2());
                  System.out.println(md.get3());
                  System.out.println(md.get4());
                  System.out.println(md.get5());
                  System.out.println(md.get6());
                  System.out.println(md.get7());
                  System.out.println(md.get8());
                  System.out.println(md.get9());
                  System.out.println(md.get10());
      
                  //Data can be modified and then written out to serialized file again:          
      
                  //Write data to new binary file
                  ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream("thumb.mod.ser"));
      
                  oout.writeObject(md);
                  oout.flush();
                  oout.close();
      
              }
      
              catch (Exception exc)
              {
                  exc.printStackTrace();
              }
          }    
      }
      
  6. 现在编译java代码并执行:

    $ javac -d . MediaData.java && javac readdata.java && java readdata
    
    true
    422
    128
    58716
    100
    false
    true
    0
    0
    \storage\emulated\0\WhatsApp\Media\WhatsApp Images\IMG-20151111-WA0026.jpg
    
  7. 那应该打印thumb.ser文件中的信息。

    <强> 注意: jdeserialize用于确定/反向设计Mediadata.java中使用的类定义

    <强> 参考文献:

    1. https://jdeserialize.googlecode.com/files/jdeserialize-1.2.jar
    2. https://code.google.com/p/jdeserialize/
    3. https://community.oracle.com/thread/2113555
    4. https://github.com/jberkel/whassup/blob/master/library/src/main/java/com/github/jberkel/whassup/model/Media.java
    5. https://github.com/jberkel/whassup/blob/master/library/src/main/java/com/whatsapp/MediaData.java