Android WhatsApp messenger使用sqlite3数据库。其中一列是“thumb_image”。我相信这是一个“Java序列化对象”(前两个字节的十六进制是“AC ED”),但我不确定如何完全读取文件的内容。
通过执行以下操作,我得到了上面提到的文件(“Java序列化对象”):
解码thumb_image列中的十六进制字符串,以查找具有媒体对象的任何消息(行)。
echo '<thumb_image_column_hex_data>' | xxd -r -p > jdefile
我想我的问题可能是如何阅读Java序列化对象,但我不确定它确实是这样一个对象。如果它确实是这样的对象有一种从它读取数据的方法。 jdefile的ASCII显示它具有相应的WhatsApp消息中的媒体对象路径等信息。
[TOOL]来自xda-developers的Whatsapp Xtract也没有帮助我提供这些数据。
答案 0 :(得分:2)
好了解如何做到这一点(这是一种快速而肮脏的方法)。
转储WhatsApp数据库:
sqlite3 msgstore.db
.output dump.sql
.dump
.exit
在您要读取/修改的dump.sql文件中找到thumb_image
列。例如:
X'ACED0......
使用以下命令将上述数据写入二进制格式(注意:使用从data.sql文件中获取的完整数据代替ACED000...
:
echo 'ACED000...' | xxd -r -p > thumb.ser
使用以下命令生成以下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();
}
}
}
现在编译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
那应该打印thumb.ser
文件中的信息。
<强> 注意:的强> jdeserialize用于确定/反向设计Mediadata.java中使用的类定义
<强> 参考文献: 强>