Android微信数据导出

在Nexus 5(Android 4.4)+WeChat 5.4,和Nexus 5(Android 5.0)+Wechat 6.0上测试可用。

获取加密的sqlite3数据库EnMicroMsg.db

如果已经root过,可以下载/data/data/com.tencent.mm/MicroMsg/*/EnMicroMsg.db

若没有root,则/data/data/com.tencent.mm下多数目录都不可读,可以使用下面的方法:

  • 开启“开发人员选项”,选上“USB侦错”
  • 电脑上执行adb backup -noapk com.tencent.mm
  • 在手机上弹出对话框提示是否允许备份
  • 不要设置密码,点备份,电脑会收到backup.ab
  • 解压backup.abdd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
  • 解压backup.tar得到数据库apps/com.tencent.mm/r/MicroMsg/*/EnMicroMsg.db

获取用于生成密钥的信息

  • uin:访问/data/data/com.tencent.mm/MicroMsg/*/system_config_prefs.xml,获取其中name="default_uin" value="([0-9]+)"value字段值uin。也可以打开wx.qq.com网页版,查找.wx.qq.com域的cookie,其中wxuin字段的值就是uin。也可以用backup.tar里的apps/com.tencent.mm/sp/system_config_prefs.xml
  • IMEI:在拨号盘输入*#06#获取IMEI,或者开启“USB侦错”后使用adb shell dumpsys iphonesubinfo得到15个十进制数字组成的imei。网上查到有些机型可能使用不同于IMEI的其他字段用于生成密钥。

使用sqlcipher解密

把上面两步得到的imeiuin拼接起来计算MD5。执行echo -n "$imei$uin" | md5sum | cut -c -7获取sqlcipher使用的加密密钥,下面用abcdefg指代。

执行sqlcipher EnMicroMsg.db,输入:


1

2

3

4

5


PRAGMA key=‘abcdefg‘;

PRAGMA cipher_use_hmac = off;

ATTACH DATABASE "decrypted_database.db" AS decrypted_database KEY "";

SELECT sqlcipher_export("decrypted_database");

DETACH DATABASE decrypted_database;

解密得到可用sqlite3打开的decrypted_database.db

注意,sqlcipher不同版本使用的加密方式不同,我尝试使用3.8.4.3版本打开数据库文件,得到如下错误信息:


1

2

3


sqlite> PRAGMA key=‘abcdefg‘;

sqlite> .schema

Error: file is encrypted or is not a database

目前发现2.1.1版本的sqlcipher可以解密。可以下载https://github.com/CovenantEyes/sqlcipher-windows/releases提供的2.1.1的Windows用exe,用wine运行,或者在https://launchpad.net/ubuntu/+source/sqlcipher/2.1.1-2/+build/4642377上下载libsqlcipher0_2.1.1-2_amd64.debsqlcipher_2.1.1-2_amd64.deb,执行:


1

2

3

4

5

6

7


# /tmp/sqlcipher_2.1.1-2_amd64.deb

# /tmp/libsqlcipher0_2.1.1-2_amd64.deb

cd /tmp

# get /tmp/usr/bin/sqlcipher

ar x sqlcipher_2.1.1-2_amd64.deb && tar xf data.tar.gz --no-overwrite-dir

# get /tmp/usr/lib/x86_64-linux-gnu/libsqlcipher.so.0.8.6

ar x libsqlcipher0_2.1.1-2_amd64.deb && tar xf data.tar.gz --no-overwrite-dir

解压后执行:


1

cd /tmp/usr && LD_LIBRARY_PATH=lib/x86_64-linux-gnu bin/sqlcipher /tmp/EnMicroMsg.db

解析message表并导出消息

message表储存消息。目前了解到从fmessage_conversationrcontactchatroom表中可以得到一些联系人和聊天室的信息。

暂时使用一个比较粗糙的Ruby脚本导出信息,需要先gem install sqlite3


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39


require ‘sqlite3‘

begin

talker2name = {}

username2name = {}

db = SQLite3::Database.open ‘/tmp/decrypted_database.db‘

db.results_as_hash = true

db.execute(‘SELECT talker,displayName FROM fmessage_conversation‘).each {|row|

talker2name[row[‘talker‘]] = row[‘displayName‘]

}

db.execute(‘SELECT username,nickname FROM rcontact‘).each {|row|

username = row[‘username‘]

nickname = row[‘nickname‘]

if nickname != ‘‘

if username =~ /@chatroom$/

talker2name[username] = nickname == ‘‘ ? username : nickname

else

username2name[username] = nickname == ‘‘ ? username : nickname

end

end

}

db.execute(‘SELECT createTime,talker,content FROM message‘).each {|row|

time,talker,content = row.values_at ‘createTime‘,‘talker‘,‘content‘

next unless content

if talker =~ /@chatroom$/

content.sub!(/^(\w+):\n/) {|x| "#{username2name.fetch($1,‘xx‘)}: " }

end

#next if content =~ /^~SEMI_XML~|</

next if content =~ /^~SEMI_XML~/

name = talker2name.fetch talker, talker

puts "#{Time.at(time/1000).strftime(‘%FT%R‘)}\t#{name}\t#{content}"

}

rescue SQLite3::Exception => e

puts e

ensure

db.close if db

end

Refenrences

  • https://gist.github.com/shellexy/7246798
  • http://nelenkov.blogspot.jp/2012/06/unpacking-android-backups.html
时间: 2024-12-24 13:39:32

Android微信数据导出的相关文章

转-Android微信支付

http://blog.fangjie.info/android微信支付/ Android微信支付 2014-08-09 一.使用微信官方的提供的demo里的appid等 1.微信接口上手指南:(从“移动应用开发”->“Android接入指南”)建议,先把官方这篇文章看完 2.微信支付接口(从“移动应用开发”->“Android开发手册” )(下载官方demohttps://res.wx.qq.com/paymchres/zh_CN/htmledition/download/wxpay/app

关于Android开发数据存储的方式(一)

关于Android开发数据存储方式(一) 在厦门做Android开发也有两个月了,快情人节了.我还在弄代码. 在微信平台上开发自己的APP,用到了数据存储的知识,如今总结一下: 整体的来讲.数据存储方式有三种:一个是文件,一个是数据库,还有一个则是网络. 当中文件和数据库可能用的稍多一些.文件用起来较为方便.程序能够自定义格式:数据库用起稍烦锁一些,但它有它的长处.比方在海量数据时性能优越.有查询功能,能够加密,能够加锁.能够跨应用.跨平台等等.网络,则用于比較重要的事情,比方科研,勘探,航空等

Android微信智能心跳方案 (转)

原创 2015-08-17 phoenix WeMobileDev 前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和WhatsApp的心跳机制进行分析.我和春哥抓包测试了差不多两个多礼拜,在我们基本上摸清了Line和WhatsApp的心跳机制后,Ray才告诉我们真正的任务——对微信的固定心跳进行优化,并告诉我们这不是一件容易的事情.于是我和春哥开始构思第一个方案,我们开始想用统计的方法来解决问题,当我们拿着第一个方

Android微信智能心跳方案 Android微信智能心跳方案

原文地址: http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5ab58810ac8bc5994&3rd=MzA3MDU4NTYzMw==&scene=6#rd 前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和WhatsApp的心跳机制进行分析.我和春哥抓包测试了

利用fiddler抓取Android app数据包

前言 做Android开发的朋友经常需要做网络数据的获取和提交表单数据等操作,然而对于调试程序而言,很难知道我们的数据到底是以怎样的形式发送的,是否发送成功,如果发送失败有是什么原因引起的.fiddler工具为我们提供了很方便的抓包操作,可以轻松抓取浏览器的发出的数据,不管是手机APP,还是web浏览器,都是可以的. 什么是fiddler 百度百科上是这样说的:Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出&quo

android 微信分享

在Android手机app上加入分享到微信的功能步骤: 1.进入友推官网http://youtui.mobi/user/reg注册并申请应用key 2.申请微信平台appkey:https://open.weixin.qq.com/ 3.引入友推项目库(下载友推社交分享组件:http://youtui.mobi/download/index.htm) 将youtui-lib项目库和应用工程放在同一个目录下 在 Package Explorer 中右键点击工程的根目录,选择 Properties(

从hive将数据导出到mysql(转)

从hive将数据导出到mysql http://abloz.com 2012.7.20 author:周海汉 在上一篇文章<用sqoop进行mysql和hdfs系统间的数据互导>中,提到sqoop可以让RDBMS和HDFS之间互导数据,并且也支持从mysql中导入到HBase,但从HBase直接导入mysql则不是直接支持,而是间接支持.要么将HBase导出到HDFS平面文件,要么将其导出到Hive中,再导出到mysql.本篇讲从hive中导出到mysql.从hive将数据导出到mysql 一

处女男学Android(十四)---Android 重量级数据存储之SQLite

前言 不知不觉的Android基础系列已经写了十三篇了,这是第十四篇~上一篇blog记录了Android中的一种数据存储方案,即共享参数(Sharedpreferences)的使用(处女男学Android(十三)---Android 轻量级数据存储之SharedPreferences).最近初学如何在Android中应用SQLite,写了一个基于ListView的增删查的小例子,本篇blog就记录一下我学习到的如何在Android中操作SQLite持久化客户端数据. 初始化SQLite 关于SQ

关于Android开发数据存储的四大方式

关于Android开发数据存储的四大方式 在厦门做Android开发也有两个月了,快情人节了,我还在弄代码.在微信平台上开发自己的APP,用到了数据存储的知识,现在总结一下: 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时