Android微信聊天提取+导出csv

参考的资料中称为“窃取”,有种做贼的感觉... 私以为称提取就够了,毕竟也是为了嗑盐是吧
本文主要分为四部分:Android手机root聊天内容提取解密db文件csv导出所需内容

 


 

Android手机root

(没什么技术含量,就靠工具)
本人所用手机为HUAWEI,手机需要解锁再进行刷机。
解锁页面 https://www.emui.com/cn/plugin/unlock/index
申请解锁还有一堆条件... 首先需要注册华为云账号,否则连这个解锁页面都进不去
华为解锁页面的官方说明

接受协议 -> 进入提交信息申请解锁码界面 -> 查看解锁步骤

解锁步骤中需要使用google的adb工具包 点击下载(链接来自官网)
用命令行操作解锁(没有难度,不废话

使用工具进行root,工具很多,我用的是叫Kingroot的软件,连USB进行root。最好先打开软件再连USB,不然软件可能识别不出来。参考花粉帖

 

 


 

聊天内容提取

使用刚才下载过的 google的adb工具包
USB连接手机,cmd打开adb。使用命令如下。

> adb device
如果没有设备就重新插拔USB。检测到的设备会显示“编号    设备  ”
> adb shell
进入shell命令
$ su
进入root
# cd /data/com.tencent.mm/MicroMsg
进入根目录下的wx目录
# ls
显示目录下的所有文件,会发现有类似md5值的长文件名,里面就存放着对应账号的数据
# cd 9********************
进入这个账户的目录
# cp EnMicroMsg.db /sdcard/EnMicroMsg.db
拷贝其中的加密聊天的db到sdcard的根目录下,便于导出
# exit
$ exit
搞到了文件,退出adb

 

顺便说一句,如果想方便的获取想要的app的数据,有时可以不root。这里说的app仅限于第一次使用的app或自己写的app反正你能破解的app。

点我继续看主线

具体方法有以下几种:(各位自行尝试吧...如果我试了的话再单独发一篇记录一下)

1.借助run-as越权(run-as原理解释来自尼古拉斯赵四大佬的博客【跪)
首先需要将
反编译对应apk。工具也有几种,我用过的是apkIDE(改之理),可以直接打开apk,使用截图如下(不巧,怪物弹珠里没有反编译出AndroidManifest.xml)

反编译的目的是查看并修改apk的AndroidManifest.xml文件的android:debuggable属性必须为true
修改之后重新签名打包

下一步将修改好的apk装回android手机,USB连接电脑连接adb(连接adb还可以通过网络连接)

> adb shell
$ su
# run-as 修改过的apk包名(如jp.co.mixi.monsterstrikeCN)
# cd /data/包名
再进入查找文件并copy出来就可以了

获取包名参考 https://blog.csdn.net/zhubaitian/article/details/38926679

2.Stetho —— Facebook的Android调试工具+Chrome
这个玩意只能在自己开发的应用上用,apk破解应该没办法把感觉...
(据说需要梯子才可以随意使用?
因为本人一点都没有用过,先甩参考链接给大家,只能作很简单的介绍了
参考1参考2参考3

第一步在Gradle中加入引用 compile 'com.facebook.stetho:stetho:1.1.0'
  如果需要查看网络可以添加以下二者之一并添加相应的客户端代码
  compile 'com.facebook.stetho:stetho-okhttp:1.1.0'
  compile 'com.facebook.stetho:stetho-urlconnection:1.1.0'
第二步在Application中加入初始化代码

public class MyApplication extends Application {
  public void onCreate() {
    super.onCreate();
    Stetho.initializeWithDefaults(this);
  }
}

第三步打开Chrome输入chrome://inspect可以使了
666...

3.各种开发工具
诸如AS的DeviceMonitor之类的... 似乎不root还是看不到呢~

 

 


 

解密db文件

现在db已经在本地PC中了。解密需要的工具请下载wxsqlcipher.exe。
用工具打开db时会出现输入密码的提示框。根据赵四大佬的反编译分析密码是md5(IMEI+UIN)。
IMEI获取:手机拨号输入【*#06#】
UIN获取:https://wx.qq.com微信网页版登录,开启浏览器抓包(如Chrome开发者工具F12的Network),随便发点话,搜索所有数据包中的uin字段就可以找到长度为9位的号(不知道是不是固定9位)
把俩东西拼一起放到MD5在线加密网站,复制出来32位小写的MD5串,取前7位。解密db。

 

 


 

csv导出

File -> Export里有导出为sql和csv两种方式,为了嗑盐这里导出为csv

列一下按我自己看到的,简单记录的表的功能(好闲哦我...

chatroom:加过的群(包括没存在通讯录的)
- chatroomname:群聊的chatroomID“xxxxxxxxx@chatroom”
- memberlist:成员的wxid
- displayname:成员昵称
- roomowner:群主
- selfDisplayName:自己在群里的昵称

rcontact:联系人和公众号
- username:微信id,格式是"wxid_xxxxxxxx"或者一看就是自己设置的
- alias:自己设置的那个可以通过查找加好友的微信名(和上面那个有的有区别有的为空)
- conRemark:联系人备注名
- nickname:微信名片上的名字,公众号的名字
- contactLabelIds:联系人标签号

RemittanceRecord:标题是汇款的id,表内是对应编号对应message表里的id

AppMessage:来自于应用的分享消息,包括微信支付凭证

EmojiInfoDesc:表情的所有描述

EmojiGroupInfo:所有下载的表情包集合

message:所有聊天记录
- msgId:按所有消息时间顺序的唯一编号
- type:标识聊天内容类型,49为图片
- createTime:聊天时间
- talker:单聊的wxid或聊天室编号"xxxxx@chatroom"
- content:聊天内容,单聊直接显示内容,群聊格式为“wxid:\n内容”
- talkerId:标识聊天对象的唯一id,一个群算作一个id

FileDownloadInfo:下载文件路径?

voiceInfo:所有语音记录
- FileName:语音名,可以在微信目录下 audio/FileName.amr找到语音
- User:发送人

MediaDuplication:聊天图片的各个大小的模糊清晰图片

img_flag:联系人头像图片flag

fmessage_conversation:添加好友的人和消息

VoiceTransText:语音转文字功能的所有文字

Videohash:聊天中发送的视频,有路径

Videoinfo2:聊天中发送的视频

appattach:聊天中的文件,对应msgInfoId

ContactLabel:标签对应的联系人

啊很多的表 神奇 但是感觉就没找到有存关于朋友圈记录的,是不是在别的db里呢?

我的目的是获得所有群聊的信息,表头是这样的:
群名 |  聊天对象 |  聊天内容 | 聊天时间  (就这样简单粗暴一点多余不要)
处理的代码如下,亲测有效。我是单个群聊处理的,所以需要提前在数据库里插好chatroom的id

# -*- coding:utf-8 -*-
import csv

class ChatItem(object):
    def __init__(self):
        self.groupid = ""
        self.friendid = ""
        self.msg = ""
        self.time = ""
        self.defaultid = "defaultid"

    def depart(self,contentstr): # 分开表中的人和信息
        li = contentstr.split(':\n')
        if len(li) == 1:
            return (self.defaultid,contentstr)
        elif len(li) >= 2:
#            print 'find'
#            print li[0],li[1]
            return (li[0],li[1])

csvFile = open("message.csv", "r")    # 这里只需要用一张message表,如果想获得昵称再用rcontact表查一下就好
writeFile = open("new.csv","wb")    # 使用w模式csv会出现多余空行,所以使用wb模式
dict_reader = csv.DictReader(csvFile)

fileheader = ["qun_id","send_id","qmessage","pub_time"]    # 设置表头
dict_writer = csv.DictWriter(writeFile, fileheader)
dict_writer.writerow(dict(zip(fileheader,fileheader)))    # dict: {"a":"a","b":"b"}
i=0    # 群内聊天条数计数
groupidstr = "xxxxxxxxx@chatroom"    # 想获取的聊天编号
clist = []
for row in dict_reader:
    if row['talker'] == groupidstr:
        i+=1
        ci = ChatItem()
        ci.groupid = groupidstr
        [ci.friendid,ci.msg]=ci.depart(row['content'])
        print(ci.msg)
        ci.time = row['createTime']
        clist.append(ci)
print i
for c in clist:
    dict_writer.writerow({
        "qun_id":groupidstr,
        "send_id":c.friendid,
        "qmessage":c.msg,
        "pub_time":c.time})
csvFile.close()
writeFile.close()    

如果用sql大概一下子就查出来了... csv还得倒腾一下

 

 


 

以上。 欢迎交流。

转载请注明:http://www.cnblogs.com/kinzznsblog/p/8677449.html kinzzn的cnblog
第一篇博文写了一下午哇...
四年本科之后仍然是小白  研究生要努力

 

本文重点参考:
https://blog.csdn.net/icodeyou/article/details/49556547  感谢大佬简单明了的教程!

 

posted @ 2018-03-30 18:04  kinzzn  阅读(3361)  评论(0编辑  收藏  举报