Android hook微信 apk 实时获取微信聊天消息记录
目录
第一步:安装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 实时获取微信聊天消息记录相关推荐
- 第三方apk实时获取微信聊天消息记录
说明:纯属发烧而生 第一步:安装apk的手机进行root 因为需要读取微信聊天记录信息表,所以手机需要root,这样给apk开启更大的权限,这里进行root的工具有好多比如360root大师等相关的r ...
- 关于uniapp开发微信小程序,实现聊天消息,最新消息最底部展示
关于uniapp开发微信小程序,实现聊天消息最新消息最底部展示 实现消息最底部展示 uniapp\vue 页面布局 此处我觉得最要注意的点就是看是谁产生的滚动条. 逻辑书写 关键字: scrollTo ...
- springboot+h5页面+微信公众号获取微信用户信息
springboot项目,h5页面通过微信公众号获取微信用户信息 最近本人有一个项目需求,微信公众号里点击一个菜单进入一个商城购物系统. 对于在微信公众号还是小白的我来说难度有点大,但是做完后发现也就 ...
- 微信公众平台—— 获取微信服务器IP地址
微信公众平台-- 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...
- java根据手机号获取微信信息_Java实现的微信公众号获取微信用户信息示例
本文实例讲述了Java实现的微信公众号获取微信用户信息.分享给大家供大家参考,具体如下: 注: 这里获取用户信息方式和网页授权获取用户信息方式不同.两个access_token不同,返回的结果也不同. ...
- 微信小程序-获取微信收货地址
微信小程序获取微信收货地址 文章目录 微信小程序获取微信收货地址 一.在小程序管理后台( 小程序管理后台),「开发」-「开发管理」-「接口设置」中自助开通该接口权限. 二.开通之后直接调用接口. // ...
- 微信小程序获取微信公众号文章2
微信小程序获取微信公众号文章2 前面介绍了一篇微信小程序打开微信公众号中的文章实战教程,主要介绍了实现的具体原理,但是实际去做的时候,发现了更多的坑,所以这里再补充一下. 原先的思路是不完整的 原先我 ...
- 微信机器人_微信聊天消息记录拦截分析
前言 近期要针对微信聊天记录进行分析和拦截,通过xposed工具制作成机器人回复系统. 为此对整个的微信代码结构分析了一遍,找到了核心的消息记录类-sql工具类. 分析过程 收到消息->写入数据 ...
- 微信小程序获取微信用户步数
小程序开发代码 -js // index.js // 获取应用实例 const app = getApp()Page({data: {motto: 'Hello World',userInfo: {} ...
- python微信好友_python 获取微信好友列表的方法(微信web)
如下所示: import urllib import urllib2 import os import time import re import cookielib import xml.dom.m ...
最新文章
- 新型混合共识机制及抗量子特性的 Hcash 主链测试链即将上线
- 再谈PowerPoint 2010导出幻灯片为图片
- Mono for Andriod学习与实践(1)— 初体验
- Codeforces 722C. Destroying Array
- 20145308刘昊阳 《Java程序设计》实验五报告
- event auto模式的问题
- Hashtable 为什么不叫 HashTable?
- 滴滴又出事!33项问题被查,程维再次致歉
- 大数据改变中国交通浙江用阿里云看未来
- 欧拉函数---预处理打表
- poj 3630 Phone List trie树—字典树 静态数组版!!!
- linux 挂载raid_linux下做raid
- LRU页面置换算法C语言实现
- lr_save_var() 截取任意字符串长度,以参数形式输出(参数转变量)
- Jmeter之BeanShell详解
- Linux 内存管理 | 连续分配方式 和 离散分配方式
- Leetcode 317. Shortest Distance from All Buildings (python+cpp)
- python流水灯简单程序_简单流水灯的实现程序
- 计算机二级考试干货内容,干货分享,如何备考计算机二级?
- 关联关系和依赖关系的思考