1、引言
特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途。如本文内容有不妥之处,请联系JackJiang进行处理!

我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群(QQ群、微信群)中,干起了无间道的工作。随着黑产群数量的激增,同事希望能自动获取黑产群的聊天信息,并交付风控引擎进行风险评估。于是,这个工作就交给我了,是时候表现一波了……
针对同事的需求,分析了一通,总结一下:
1)能够自动获取微信和 QQ群的聊天记录;
2)只要文字记录,图片和表情包,语音之类的不要;
3)后台自动运行,非实时获取记录。
(注:本文读取聊天记录的方法只适用于监控自己拥有的微信或者QQ ,无法监控或者盗取其他人的聊天记录。本文只写了如何获取聊天记录,服务器落地程序并不复杂,不做赘述。写的仓促,有错别字还请见谅。)
学习交流:
(本文同步发布于:http://www.52im.net/thread-1992-1-1.html)
2、相关文章
即时通讯网之前整理过微信本地数据库的读取和样本,如有兴趣可请往阅读:
《微信本地数据库破解版(含iOS、Android),仅供学习研究 [附件下载]》
3、准备工作
参阅很多相关的文章之后,对这个需求有了大致的想法,开始着手准备:
1)需要一个有root权限的Android手机,我用的是红米5(强调必须已被ROOT);
2)android的开发环境(就是Android Studio那一套啦);
3)android相关的开发经验(我是个PHP,第一次写Android程序,踩了不少坑)。
4、获取微信聊天记录过程分享
4.1 着手准备
微信的聊天记录保存在Android系统的:"/data/data/com.tencent.mm/MicroMsg/c5fb89d4729f72c345711cb*/EnMicroMsg.db" 目录和文件下。
该文件是加密的数据库文件,需要用到sqlcipher来打开。密码为:MD5(手机的IMEI+微信UIN)的前七位。文件所在的那个乱码文件夹的名称也是一段加密MD5值:MD5('mm'+微信UIN)。微信的UIN存放在微信文件夹“/data/data/com.tencent.mmshared_prefs/system_config_prefs.xml”中。(这个减号一定要带着!)
另外:即时通讯网之前整理过微信本地数据库的样本,如有兴趣可请往下载:《微信本地数据库破解版(含iOS、Android),仅供学习研究 [附件下载]》。
注意:如果手机是双卡双待,那么会有两个IMEI号,默认选择 IMEI1,如果不行,可以尝试一下字符串‘1234567890ABCDEF’。早期的微信会去判定你的IMEI,如果为空 默认选择这个字符串。
拿到密码,就可以打开EnMicroMsg.db了。微信聊天记录,包括个人、群组的所有记录全部存在message这张表里(如下图所示),就像下面这两张截图里展示的一样。
(为了方便截图,此图截自《微信本地数据库破解版(含iOS、Android),仅供学习研究 [附件下载]》中的样本)
(为了方便截图,此图截自《微信本地数据库破解版(含iOS、Android),仅供学习研究 [附件下载]》中的样本)
4.2 代码实现
第一步,不可能直接去访问EnMicroMsg.db。因为没有权限,还要避免和微信本身产生冲突,所以选择把这个文件拷贝到自己的项目下:
第二步,拿到文件的密码:
第三步,打开文件,执行SQL:
到此,我们就可以通过自已写的代码拿到微信的聊天记录了,之后可以直接将整理好的JSON通过POST请求发到服务器就可以了。(忍不住吐槽:写服务器落地程序用了30分钟,写上面这一坨花了三四天,还不包括搭建开发环境、下载SDK、折腾ADB什么的)。
5、获取QQ聊天记录过程分享
5.1 说明
QQ的聊天记录有点麻烦,他的文件保存在:“/data/data/com.tencent.mobileqq/databases/你的QQ号码.db”。
这个文件是不加密的,可以直接打开。QQ中群组的聊天记录是单独建表存放的,所有的QQ群信息存放在TroopInfoV2表里,需要对字段troopuin求MD5,然后找到他的聊天记录表:mr_troop_" + troopuinMD5 +"_New。
但是!(看到“但是”就没好事。。。)
问题来了,它的内容是加密的,而且加密方法还很复杂:根据手机IMEI循环逐位异或。具体的我不举例子了,太麻烦,直接看文章最后的解密方法。
5.2 代码实现
第一步,还是拷贝数据库文件:
第二步,打开并读取内容:
然后你就可以把信息发到服务器落地了(同样跟微信的记录上传一样,通过你自已写的代码发送到你的服务端就可以了)。
6、题外话:一些注意点
这里还有几个需要注意的地方。
1)最新安卓系统很难写个死循环直接跑了,所以我们需要使用Intent,来开始Service,再通过Service调用AlarmManager,就像下面的代码这样:
然后再创建一个LongRunningService,在其中调用AlarmManager:
在AlarmReceiver中调用我们的方法:
2)安卓不允许在主线程里进行网络连接,可以直接用 retrofit2 来发送数据(或者最简单的方法就是用AsyncTask了)。
3)项目需要授权网络连接(就是在AndroidManifast.xml里加上网络权限申请就是了);
4)项目需要引入的包:
5)如果复制文件时失败,校验文件路径不存在,多半是因为授权问题。需要对数据库文件授权 全用户rwx权限;
6)如果服务端使用MySql数据库的话,数据库编码请用utf8mb4编码,用来支持Emoji表情。。
7、我的部分源码
(因为种种原因,我不太好直接把源码贴上来,现把几个实用方法分享出来,可以直接使用。)
复制文件的方法:
MD5方法:
QQ信息解密方法:
附录:有关微信、QQ的技术文章汇总
(本文同步发布于:http://www.52im.net/thread-1992-1-1.html)
作者:Jack Jiang (点击作者姓名进入Github)
出处:http://www.52im.net/space-uid-1.html
交流:欢迎加入即时通讯开发交流群 215891622
讨论:http://www.52im.net/
Jack Jiang同时是【原创Java Swing外观工程BeautyEye】和【轻量级移动端即时通讯框架MobileIMSDK】的作者,可前往下载交流。
本博文 欢迎转载,转载请注明出处(也可前往 我的52im.net 找到我)。