吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23146|回复: 54
收起左侧

[Android 原创] 我的微信数据监控研究发展过程

  [复制链接]
hjw45611 发表于 2019-1-10 10:03
本帖最后由 hjw45611 于 2019-1-30 14:00 编辑

近两年来一直在做Android端 微信的消息备份功能,一开始是调研自己实现,现在是公司业务需要,现已实现好友相关信息备份,监控消息、领取红包、监控发布朋友圈数据、监控朋友圈点赞回复等功能。

严重声明
本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。

以下内容适用范围:已经获取root权限的手机
微信相关基本知识:
1.聊天消息表、联系人表、头像信息表、联系人标签表、红包转账信息表等都存在EnMicroMsg.db数据库中,但该数据库被加密,需要密码才能查看。
2.EnMicroMsg.db地址是/data/data/com.tencent.mm/MicroMsg/32位字符串/EnMicroMsg.db,32位字符串是通过MD5加密("mm"+uin码)得出的,如果有多个32位字符串的文件夹,说明登录过多个微信号,微信号不同,uin码不同。同一级的还有其他数据库,比如SnsMicroMsg.db,存放的是微信朋友圈相关表,该数据库无密码,可直接查看。
3.EnMicroMsg.db的密码  MD5(imei码 + uin码).substring(0, 7).toLowerCase()得到,imei码是通过获取手机IMEI码得到,uin码是微信SharedPerferences中存储的,文件位置\data\data\com.tencent.mm\shared_prefs\auth_info_key_prefs.xml,通过解析xml文件来得到"_auth_uin"字段的值。
4.当前登录微信的账号ID存放于\data\data\com.tencent.mm\shared_prefs\notify_key_pref_no_account.xml文件中,通过解析xml文件来得到"login_weixin_username"字段的值。


1.静态监控
是我一开始参考网上文章后实现监控的方法,使用的是定时复制数据库,并读取的方法
定时复制微信的数据库文件到我的文件夹下,计算得到密码后,使用sqlcipher连接并传入密码来读取数据,然后发送到服务器。


2.动态监控
可以看到静态监控的方法并不完善,并不能做到实时监控,在我接触到Xposed后开始使用hook 拦截的方式来监控微信数据
可以说微信是我反编译大厂app后发现的少数不做加固的app之一,让我省去了脱壳的步骤



这里主要对监控发布朋友圈数据进行详细教程,包含xposed的大多数使用。

-1使用 当前Activity 这个app来查看发布朋友圈页面的包名和Activity。
发布朋友圈编辑页.jpg
-2使用jadx打开微信apk,本案例使用的是6.6.7版本,搜索类SnsUploadUI
屏幕快照 2019-01-09 13.39.51.png
可以看到有一个SnsEditText的变量,很大把握可以确定这个变量就是发朋友圈的文本输入框,
-3找到发表按钮
看到发表按钮,可以确定它要么是一个MenuItem,要么是一个普通view,但总会有点击事件
先查找SnsEditText,发现它继承自EditText,直接在这个类中搜索 nRk.getText 的相关调用,很容易找到调用位置。

-4进行hook
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
try {
    final Class<?> SnsUploadUIClass = cl.loadClass("com.tencent.mm.plugin.sns.ui.SnsUploadUI");
        XposedHelpers.findAndHookMethod(SnsUploadUIClass, "onCreate", Bundle.class,
            new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                    Object oSnsUploadUI = param.thisObject;
                    XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.sns.ui.SnsUploadUI$5$1",
                        mlpparam.classLoader, "pO", String.class,new XC_MethodHook() {
                            @Override
                            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                super.beforeHookedMethod(param);
                                //获取SnsUploadUIClass中的nRk变量
                                Object nRk=XposedHelpers.findField(SnsUploadUIClass, "nRk").get(oSnsUploadUI);
                                    
                                //方法1
                                //强转为EditText 
                                EditText editText = (EditText) nRk;
                                //得到发表朋友圈的文本
                                String text=editText.getText().toString();
 
                                //方法2
                                //执行getText().toString()得到发表朋友圈的文本
                                String text=  XposedHelpers.callMethod(nRk,"getText").toString();
                                 
                                //todo上传数据
                            }
                    });
                }
            });
} catch (Exception e) {
    e.printStackTrace();
}


因为源码上有SnsUploadUI.this.nRk.setText("");这段,所以要在beforeHookedMethod中拦截
方法1是因为SnsEditText继承自EditText的,所以通过findField后直接强转成EditText,然后再获取字符串。
方法2是如果不知道SnsEditText是怎样的类的话,但我们知道nRk通过nRk.getText().toString()得到了文本信息,可以通过XposedHelpers.callMethod得到

需要说明的是beforeHookedMethod主要是截取方法参数,afterHookedMethod主要截取方法返回值,如果一个变量在方法中值被改变了,那就看你是要改变前的还是改变后的了。

至此拦截成功,使用Toast显示了一下。

使用toast显示拦截数据

使用toast显示拦截数据


以上代码使用了xposed 的findAndHookMethod,findField,callMethod等方法,相对全面系统。

使用xposed,最难的可能就是找到hook点,一般对于微信这种大量依赖数据库的,要么找到数据解析方法来拦截,要么找到数据入库或者查询操作自己解析判断来拦截
如果一开始无处下手,可以先找到它的数据库相关insert、update、delete、query操作,这样就可以通过打印的sql查询方法知道它每个页面查的是哪个数据表,然后分析数据表的结构和字段含义,再找到执行页面进行代码分析。

免费评分

参与人数 18威望 +1 吾爱币 +23 热心值 +14 收起 理由
yaoshen2048 + 1 我很赞同!很佩服这种高手
ruocan + 1 + 1 我很赞同!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
l320228 + 1 + 1 我很赞同!
言不由衷啊 + 1 + 1 热心回复!
笙若 + 1 + 1 谢谢@Thanks!
wushaominkk + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
青山依旧在 + 1 用心讨论,共获提升!
puluter + 1 用心讨论,共获提升!
空不了 + 1 + 1 热心回复!
TokyoGhoul + 1 我很赞同!
bondsong + 1 + 1 谢谢@Thanks!能不能分享一个成品的 朋友圈图+文的监控。我一直想搞一个可.
xuanle6 + 1 + 1 谢谢@Thanks!
smile1110 + 1 我很赞同!
ChinaNB + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lwbjing + 1 用心讨论,共获提升!
maloneshaw + 1 + 1 热心回复!
linlinai + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hjw45611 发表于 2019-1-31 22:34
杨学子 发表于 2019-1-31 15:53
楼主 有没有研究过 微信 风控这方向的东西呢?

你说的风控是指微信聊天中对信息的筛选统计分析吧?例如员工在微信中不正当语言行为、监控红包转账信息、监控删除好友等行为吧,这些都有做过,大部分都是把这些行为发送到后台数据库,后台会对这些行为进行分析,然后发送警告的消息通知。
 楼主| hjw45611 发表于 2019-1-11 09:28
丶那年如此年少o 发表于 2019-1-10 16:48
我一点搜索然后做下的进度条到40%多点就卡死了。设置了反编译线程数也不行,还是会卡死。
大佬,你的是 ...

可以参考这个链接,改一下相关配置,应该是内存不够引起的。
https://blog.csdn.net/Fisher_3/article/details/78654450
头像被屏蔽
K_K 发表于 2019-1-10 10:48
tmhacker 发表于 2019-1-10 11:02
不会被封吧
A天狼A 发表于 2019-1-10 11:02
学习了。
linlinai 发表于 2019-1-10 11:07
大佬!写得挺好的
大山GZ 发表于 2019-1-10 11:09
厉害,厉害。
dy18 发表于 2019-1-10 11:16
写得挺好的
fihuang2315 发表于 2019-1-10 11:18
感谢楼主热心分享。学习了。
kahnarcy 发表于 2019-1-10 11:33
膜拜大神!!
ChinaF 发表于 2019-1-10 11:58
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-6 09:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表