Android微信聊天提取+导出csv
参考的资料中称为“窃取”,有种做贼的感觉... 私以为称提取就够了,毕竟也是为了嗑盐是吧
本文主要分为四部分:Android手机root,聊天内容提取,解密db文件,csv导出所需内容
(没什么技术含量,就靠工具)
本人所用手机为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已经在本地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。
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 感谢大佬简单明了的教程!