前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于 Android 读取微信本地 DB 数据 | 思维原理及技术分析

基于 Android 读取微信本地 DB 数据 | 思维原理及技术分析

作者头像
AlicFeng
发布2019-03-04 16:36:05
1.2K0
发布2019-03-04 16:36:05
举报

前言

该移动端软件基于Android开发,是一个解析微信数据信息(包括微信个人资料、联系人、聊天记录等)并重装报文同步至服务端的一款应用。其实实属公司业务需要而开发的一个小玩意,Android嘛笑O(∩_∩)O哈哈。

应用的原理思维分析:首先拿到微信应用的本地SQLite数据库文件( 无网络的情况下可以显示之前的聊天记录,因而本地必有缓存数据的载体、G一下 额 是本地数据 ),分析到本地缓存以及找到文件的路径知识第一步,第二部需要秘钥进一步打开db文件,找到密码是很简单的事情( 再此感谢前人贡献 ) ,可以通过相关的信息计算得到,肯定会有人问:万一微信将其改了那此方案此不是作废了吗?,?既然微信凭其技术实力改变了,那也没办法呀,但是我相信腾讯不会轻而易举的去做这一改动的,为何呢?这样一改动的话,容易造成对之前版本不兼容。既然db文件找到了以及秘钥也有了,最后一步就是理解与猜测数据表的结构与关系去做业务的开发。

核心技术 uin理解与获取 uin简单而言就是微信登录的识别号,设备必须有登录的历史才有。uin是如何获取的呢?

代码语言:javascript
复制
 # uid在aunt_info_key_prefs.xml文件里面 
 # 具体的路径为 "/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml"  
 # uin的值为_auth_uin标签的值,如下是实例文件,可借助jsoup依赖库即可解析值

imei码 移动设备的唯一编码,双卡双待的会有两个。与数据库秘钥息息相关。

代码语言:javascript
复制

 public static String imei(Context context) {     
     try {       
         //实例化TelephonyManager对象       
         TelephonyManager telephonyManager = (TelephonyManager)  context.getSystemService(Context.TELEPHONY_SERVICE);       
         String imei = telephonyManager.getDeviceId();       
         if (imei == null) {           
             imei = "";       
         }       
         return imei;     
      } 
      catch (Exception e) {       
         e.printStackTrace();     
      }     
      return null; 
 }
 

数据库路径

代码语言:javascript
复制
# 路径为 "/data/data/com.tencent.mm/MicroMsg/" + md5("mm" + uin) + "/EnMicroMsg.db";

数据库的密码 秘钥为emei+uin的md5截取前七位再转大写即可获取。

代码语言:javascript
复制
 md5(imei + uin))).substring(0, 7).toLowerCase()

数据库读写操作

代码语言:javascript
复制

import net.sqlcipher.Cursor; 
import net.sqlcipher.SQLException; 
import net.sqlcipher.database.SQLiteDatabase; 
import net.sqlcipher.database.SQLiteDatabaseHook;  

SQLiteDatabase.loadLibs(context); 
SQLiteDatabaseHook hook = new SQLiteDatabaseHook() {   
  @Override     
  public void preKey(SQLiteDatabase database) {      
  
  }      
  @Override    
  public void postKey(SQLiteDatabase database) {         
    database.rawExecSQL("PRAGMA cipher_migrate;"); // 兼容2.0的数据库     
   } 
}; 
String file = "数据库备份后的文件路径; String password = "秘钥"; 
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(file, password, null, hook); 
...
...
 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.02.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档