目录

第一步:安装apk的手机进行root

第二步:用Root Explorer把db文件赋予更高的权限

第三步:开始撸代码啦, 由于微信的数据db文件进行加密操作所以咱们这边需要解密 获取手机序列号IMEI号,

获取微信用户信息号需要解析xml,这里解析xml用到的是XmlPullParser进行解析的 这里path路径是:/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

有上面两个字符串计算出打开db的密码, 这里的计算需要用到md5算法进行计算操作先把md5这段代码贴出来 计算密码调用与这几段代码进行配合

拿到密码后可以对数据库的读写进行操作

在初始activity调用

最后在log内就能看到你截取到的微信聊天记录,这里设置的10秒获取一次。


说明:纯属发烧而生

第一步:安装apk的手机进行root

因为需要读取微信聊天记录信息表,所以手机需要root,这样给apk开启更大的权限,这里进行root的工具有好多比如360root大师等相关的root工具。

第二步:用Root Explorer把db文件赋予更高的权限

手机上安装Root ExPlorer软件,设置/data/data/com.tencent.mm/MicroMsg/b93e23895b9f5b4a8d781ba8d702cfe8/EnMicroMsg.db这些文件以及文件夹下的EnMicroMsg.db进行权限设定,赋予所有的权限(说明:这里的包名b93e23895b9f5b4a8d781ba8d702cfe8每个用户都是不一样的,需要用户你进行自己查看设置。) 

第三步:开始撸代码啦, 
由于微信的数据db文件进行加密操作所以咱们这边需要解密 
获取手机序列号IMEI号,

 public static String getIMEI(Context context) {TelephonyManager manager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);if (manager.getDeviceId() != null && manager.getDeviceId().length() > 0) {return manager.getDeviceId();} else {return "";}}

获取微信用户信息号需要解析xml,这里解析xml用到的是XmlPullParser进行解析的 
这里path路径是:/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

public static String getUin(String path) {try {FileInputStream inputStream = new FileInputStream(new File(path));XmlPullParser parser = Xml.newPullParser();parser.setInput(inputStream, "UTF-8");int eventType = parser.getEventType();// 产生第一个事件while (eventType != XmlPullParser.END_DOCUMENT) { //处理事件,不碰到文档结束就一直处理switch (eventType) {case XmlPullParser.START_DOCUMENT:// 不做任何操作或初开始化数据break;case XmlPullParser.START_TAG:// 解析XML节点数据// 获取当前标签名字String tagName = parser.getName();if ("int".equals(parser.getName())) {String name = parser.getAttributeValue(0);String value = parser.getAttributeValue(1);Log.e("int", "name:" + name + ",value:" + value);return value;}break;case XmlPullParser.END_TAG:// 单节点完成,可往集合里边添加新的数据break;case XmlPullParser.END_DOCUMENT:break;}// 别忘了进入下一个元素并触发相应事件 ,不然就会死循环eventType = parser.next();}} catch (FileNotFoundException e) {Log.e("FileNotFoundException:", e.toString());} catch (XmlPullParserException e) {Log.e("XmlPullParserException:", e.toString());} catch (IOException e) {e.printStackTrace();}return "";}

有上面两个字符串计算出打开db的密码, 
这里的计算需要用到md5算法进行计算操作先把md5这段代码贴出来 
计算密码调用与这几段代码进行配合

String password= (MD5Util.md5(XmlUtil.getIMEI(context)+XmlUtil.getUin("/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml"))).substring(0,7).toLowerCase();
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** author: * date: 2016/10/25 20:59*/
public class MD5Util {public static final char HEX_DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F'};public static String toHexString(byte[] b) {  //String to  byteStringBuilder sb = new StringBuilder(b.length * 2);for (int i = 0; i < b.length; i++) {sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);sb.append(HEX_DIGITS[b[i] & 0x0f]);}return sb.toString();}public static String md5(String s) {try {// Create MD5 HashMessageDigest digest = java.security.MessageDigest.getInstance("MD5");digest.update(s.getBytes());byte messageDigest[] = digest.digest();return toHexString(messageDigest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}
}

拿到密码后可以对数据库的读写进行操作

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabaseHook;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** Created by zxf on 2016/10/25.*/public class DataHelp {/*** 操作数据库读取微信消息* @param context* @param path*/public static void readWeChatDatabase(Context context,String path) {SQLiteDatabase.loadLibs(context);String password= (MD5Util.md5(XmlUtil.getIMEI(context)+XmlUtil.getUin(Constants.uinPath))).substring(0,7).toLowerCase();Log.e("password", "password:"+password );SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){public void preKey(SQLiteDatabase database){}public void postKey(SQLiteDatabase database){database.rawExecSQL("PRAGMA cipher_migrate;");  //最关键的一句!!!}};try {long time=System.currentTimeMillis();SQLiteDatabase db =  SQLiteDatabase.openDatabase(path, password, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS, hook);long time2=System.currentTimeMillis();long time_1=time2-time;Toast.makeText(context,"time_3:"+time_1, Toast.LENGTH_SHORT).show();Log.e("readWeChatDatabase", "time_3:"+time_1 );int count=0;Cursor c = db.rawQuery("select * from message" , null);while (c.moveToNext()) {int _id = c.getInt(c.getColumnIndex("msgId"));String content= c.getString(c.getColumnIndex("content"));count++;Log.e("readWeChatDatabase", "content:"+content );}c.close();db.close();long time_2=System.currentTimeMillis()-time2;Toast.makeText(context,"time_4:"+time_2+",count:"+count , Toast.LENGTH_SHORT).show();Log.e("readWeChatDatabase", "time_4:"+time_2+",count:"+count );} catch (Exception e) {Log.e("e", "readWeChatDatabase: "+e.toString() );}}/*** 复制单个文件* @param oldPath String 原文件路径 如:c:/fqf.txt* @param newPath String 复制后路径 如:f:/fqf.txt* @return boolean*/public static void copyFile(Context context,String oldPath, String newPath) {long time=System.currentTimeMillis();deleteFolderFile(newPath,true);long time2=System.currentTimeMillis();long time_1=time2-time;Log.e("copyFile", "time_1:"+time_1 );InputStream inStream=null;FileOutputStream fs=null;try {int bytesum = 0;int byteread = 0;File oldfile = new File(oldPath);if (oldfile.exists()) { //文件存在时inStream = new FileInputStream(oldPath); //读入原文件fs = new FileOutputStream(newPath);byte[] buffer = new byte[2048];while ( (byteread = inStream.read(buffer)) != -1) {bytesum += byteread; //字节数 文件大小fs.write(buffer, 0, byteread);}long time_2=System.currentTimeMillis()-time2;Log.e("copyFile", "time_2:"+time_2);readWeChatDatabase(context,newPath);//对copy出来的数据进行操作}}catch (Exception e) {System.out.println("复制单个文件操作出错");e.printStackTrace();}finally {try {if (inStream!=null) {inStream.close();}if (fs!=null){fs.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 删除指定目录下文件及目录** @param deleteThisPath* @return*/public static void deleteFolderFile(String filePath, boolean deleteThisPath) {if (!TextUtils.isEmpty(filePath)) {try {File file = new File(filePath);if (file.isDirectory()) {// 处理目录File files[] = file.listFiles();for (int i = 0; i < files.length; i++) {deleteFolderFile(files[i].getAbsolutePath(), true);}}if (deleteThisPath) {if (!file.isDirectory()) {// 如果是文件,删除file.delete();} else {// 目录if (file.listFiles().length == 0) {// 目录下没有文件或者目录,删除file.delete();}}}} catch (Exception e) {e.printStackTrace();}}}
}

在初始activity调用

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;import com.xilexuan.wechatcrack.util.DataHelp;import java.util.Timer;
import java.util.TimerTask;public class MainActivity extends AppCompatActivity {Timer timer;TimerTask mTimerTask;@Overrideprotected void onCreate(Bundle savedInstanceState) {timer = new Timer();super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final String old_path="/data/data/com.tencent.mm/MicroMsg/b93e23895b9f5b4a8d781ba8d702cfe8/EnMicroMsg.db";final String new_path="/data/data/copy到你的文件夹下比如com...../EnMicroMsg.db";DataHelp.copyFile(this,old_path,new_path);mTimerTask =new TimerTask() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {DataHelp.copyFile(MainActivity.this,old_path,new_path);}});}};timer.schedule(mTimerTask, 0, 10000);//10秒一获取//Toast.makeText(this, pwd, Toast.LENGTH_SHORT).show();}
}

最后在log内就能看到你截取到的微信聊天记录,这里设置的10秒获取一次。

Android hook微信 apk 实时获取微信聊天消息记录相关推荐

  1. 第三方apk实时获取微信聊天消息记录

    说明:纯属发烧而生 第一步:安装apk的手机进行root 因为需要读取微信聊天记录信息表,所以手机需要root,这样给apk开启更大的权限,这里进行root的工具有好多比如360root大师等相关的r ...

  2. 关于uniapp开发微信小程序,实现聊天消息,最新消息最底部展示

    关于uniapp开发微信小程序,实现聊天消息最新消息最底部展示 实现消息最底部展示 uniapp\vue 页面布局 此处我觉得最要注意的点就是看是谁产生的滚动条. 逻辑书写 关键字: scrollTo ...

  3. springboot+h5页面+微信公众号获取微信用户信息

    springboot项目,h5页面通过微信公众号获取微信用户信息 最近本人有一个项目需求,微信公众号里点击一个菜单进入一个商城购物系统. 对于在微信公众号还是小白的我来说难度有点大,但是做完后发现也就 ...

  4. 微信公众平台—— 获取微信服务器IP地址

    微信公众平台-- 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...

  5. java根据手机号获取微信信息_Java实现的微信公众号获取微信用户信息示例

    本文实例讲述了Java实现的微信公众号获取微信用户信息.分享给大家供大家参考,具体如下: 注: 这里获取用户信息方式和网页授权获取用户信息方式不同.两个access_token不同,返回的结果也不同. ...

  6. 微信小程序-获取微信收货地址

    微信小程序获取微信收货地址 文章目录 微信小程序获取微信收货地址 一.在小程序管理后台( 小程序管理后台),「开发」-「开发管理」-「接口设置」中自助开通该接口权限. 二.开通之后直接调用接口. // ...

  7. 微信小程序获取微信公众号文章2

    微信小程序获取微信公众号文章2 前面介绍了一篇微信小程序打开微信公众号中的文章实战教程,主要介绍了实现的具体原理,但是实际去做的时候,发现了更多的坑,所以这里再补充一下. 原先的思路是不完整的 原先我 ...

  8. 微信机器人_微信聊天消息记录拦截分析

    前言 近期要针对微信聊天记录进行分析和拦截,通过xposed工具制作成机器人回复系统. 为此对整个的微信代码结构分析了一遍,找到了核心的消息记录类-sql工具类. 分析过程 收到消息->写入数据 ...

  9. 微信小程序获取微信用户步数

    小程序开发代码 -js // index.js // 获取应用实例 const app = getApp()Page({data: {motto: 'Hello World',userInfo: {} ...

  10. python微信好友_python 获取微信好友列表的方法(微信web)

    如下所示: import urllib import urllib2 import os import time import re import cookielib import xml.dom.m ...

最新文章

  1. 新型混合共识机制及抗量子特性的 Hcash 主链测试链即将上线
  2. 再谈PowerPoint 2010导出幻灯片为图片
  3. Mono for Andriod学习与实践(1)— 初体验
  4. Codeforces 722C. Destroying Array
  5. 20145308刘昊阳 《Java程序设计》实验五报告
  6. event auto模式的问题
  7. Hashtable 为什么不叫 HashTable?
  8. 滴滴又出事!33项问题被查,程维再次致歉
  9. 大数据改变中国交通浙江用阿里云看未来
  10. 欧拉函数---预处理打表
  11. poj 3630 Phone List trie树—字典树 静态数组版!!!
  12. linux 挂载raid_linux下做raid
  13. LRU页面置换算法C语言实现
  14. lr_save_var() 截取任意字符串长度,以参数形式输出(参数转变量)
  15. Jmeter之BeanShell详解
  16. Linux 内存管理 | 连续分配方式 和 离散分配方式
  17. Leetcode 317. Shortest Distance from All Buildings (python+cpp)
  18. python流水灯简单程序_简单流水灯的实现程序
  19. 计算机二级考试干货内容,干货分享,如何备考计算机二级?
  20. 关联关系和依赖关系的思考

热门文章

  1. 校招经历-java开发面试题
  2. 计算机公共课3-字处理软件Word 2010
  3. 阻抗测量单芯片方案AD5933 芯片使用方法
  4. 全球四大会计师事务所
  5. oracle排除非数字,oracle字段中找出字段中含有非数字的方法!!!
  6. MUI调用照片以及裁剪和图库照片上传到服务器【后端部分Flask+MUI】
  7. 本地上运行正常,但是部署到了服务器却一直验证码错误(Nginx反向代理导致的session丢失问题)
  8. 二进制和十进制之间的转换
  9. Openstack 环境下虚拟机KVM之间的互通
  10. 免费开放,GSTO-沪深A股L2行情数据API接口,开发接口文档