提前说明下:(该方法只适用于监控自己拥有的微信或者QQ,无法监控或者盗取其他人的聊天记录。本文只写了如何获取聊天记录,服务器落地程序并不复杂,不做赘述。写的仓促,有错别字还请见谅。)
为了获取黑产群的动态,有同事潜伏在大量的黑产群(QQ微信)中,干起了无间道的工作,随着黑产群数量的激增,同事希望能自动获取黑产群的聊天信息,并交付风控引擎进行风险评估。于是,我接到了这么一个工作……
分析了一通需求说明,总结一下:
-
<李>能够自动获取微信和QQ群的聊天记录李>
<李>只要文字记录,图片和表情包,语音之类的不要李>
<李>后台自动运行,非实时获取记录李>
参阅很多相关的文章之后,对这个需求有了大致的想法,开始着手准备:
-
<李>一个有根权限的手机,我用的是红米5(强调必须要有根)李>
<李> android的开发环境李>
<李> android相关的开发经验(我是个PHP,第一次写android程序,踩了不少坑)李>
说明:
微信的聊天记录保存在“/数据/数据/com.tencent.mm/MicroMsg/c5fb89d4729f72c345711cb */EnMicroMsg.db”
该文件是加密的数据库文件,需要用到sqlcipher来打开。密码为:MD5(手机的IMEI +微信印尼的前七位。文件所在的那个乱码文件夹的名称也是一段加密MD5值:MD5(“毫米”+微信印尼。微信的印尼存放在微信文件夹/数据/数据/com.tencent.mmshared_prefs system_config_prefs.xml中。(这个减号一定要带着!)
在媒介="/数据/数据/com.tencent.mm/MicroMsg/c5fb89d4729f72c345711cb * * * * * \/EnMicroMsg.db”; newPath="/数据/数据/com。你的项目/EnMicroMsg.db”; 拷贝文件(媒介、newPath);//代码见部分源码
第二步,拿到文件的密码:
字符串密码=(MD5Until.md5 (“IMEI +微信印尼”)。substring (0, 7) .toLowerCase ());
第三步,打开文件,执行SQL:
SQLiteDatabase.loadLibs(上下文); SQLiteDatabaseHook钩=new SQLiteDatabaseHook () { 公共空间preKey (SQLiteDatabase数据库){ } 公共空间postKey (SQLiteDatabase数据库){ 数据库。rawExecSQL(“杂注cipher_migrate; ");//很重要 } }; SQLiteDatabase db=openDatabase (newPath、密码为空,NO_LOCALIZED_COLLATORS钩); 现在长=System.currentTimeMillis (); 日志。e (“readWxDatabases”、“读取微信数据库:" +); int数=0; 如果(是否!=" 0 "){ 字符串sql=皊elect * from信息”; 日志。e (sql、sql); 光标c=db。rawQuery (sql, null); 而(c.moveToNext ()) { 长_id=c.getLong (c.getColumnIndex("是否")); 字符串内容=c.getString (c.getColumnIndex(“内容”)); int类型=c.getInt (c.getColumnIndex(“类型”)); 字符串说话=c.getString (c.getColumnIndex("说话")); 长时间=c.getLong (c.getColumnIndex (createTime ")); JSONObject tmpJson=handleJson (_id、内容类型、说话、时间); returnJson。把(“数据”+数,tmpJson); 数+ +; } c.close (); db.close (); 日志。e (“readWxDatanases”、“读取结束:”+ System.currentTimeMillis() +“,数:”+数量); }
到此,就可以拿到微信的聊天记录了,之后可以直接将整理好的JSON通过帖子请求发到服务器就可以了。(忍不住吐槽:写服务器落地程序用了30分钟,写上面这一坨花了三四天了,还不包括搭建开发环境,下载SDK,折腾亚行什么的)