【Android视频号信息获取①】

news2024/11/13 14:47:39

*在2019年深圳上班的时候 那时候还是个Java 码农 接触了一下 Xposed.时隔多年 忘记差不多了 用frida先来练练手 新公司又让我研究微信视频号获取个人的视频主页标题列表 *

确定微信版本

  • 不同版本微信hook点不一样。

预想实现方式

  • 用Xposed去请求注册一个中转服务 然后脚本请求中转服务
    • 实现:可以所有号都去处理业务 也可以用一部分号去做查询请求
    • 难点:Xp会污染手机环境 微信检测点太多
  • 用单独服务器hook微信去搭建一个中转 然后脚本请求
    • 实现:利用微信其他端(pc) 协议或者hook 专门分部分号去做服务
    • 难点:pc协议是否稳定 pchook 逆向

服务设计思路

服务应该满足 组 端 点 可以用sekiro治理

    组:不同业务 方便拓展 例如以后需要视频号 或者其他等业务 防止污染
    端:不同的客户端处理在某一个组下只处理同一种业务 方便查询管理
    点:针对于端去调用某个函数 例如 以后同一个业务下 不同的函数查询

难点

  • 多进程共享数据 当前解决方案:利用系统广播来传递数据
  • 微信hook位置 整个项目 最最最麻烦的东西 需要不断调试 分析

预想期望

搜索获取用户信息
入参 账号名
返回 类json 或者 protobuf (会有唯一账号id)

获取用户主页视频
入参 账号id
返回 类json 或者 protobuf 主页视频信息 标题 视频id 等等

实战分析

打开视频号主 主页 查询 activity :adb shell dumpsys activity top
com.tencent.mm/.plugin.finder.feed.ui.FinderProfileUI
在这里插入图片描述
但是我并没有找到数据请求的地方 这个应该是有个中转的activity 上面这个 应该就是个显示页
搜索一番发现了Monitor这个工具 可以跟踪执行路径
在这里插入图片描述
利用GDA或者Jadx跟踪到这个类 发现这应该就是一个数据组装的构造函数
在这里插入图片描述
继续网下翻 可以看到 里面还有数据解析方法
在这里插入图片描述
所以这个类 我们可以猜到应该就是数据组包和请求的一个类~ 我们写脚本验证一下

//请求的数据
let NetSceneFinderUserPage = Java.use("com.tencent.mm.plugin.finder.cgi.eg");
NetSceneFinderUserPage["$init"].overload('java.lang.String', 'long', 'com.tencent.mm.cg.b', 'int', 'com.tencent.mm.protocal.protobuf.chn', 'int', 'long', 'boolean', 'java.lang.String', 'long', 'java.lang.Integer', 'java.lang.Long', 'java.lang.String', 'boolean', 'boolean', 'java.lang.Long', 'int', 'kotlin.g.b.k').implementation = function (str, j, c14425b, i, chnVar, i2, j2, z, str2, j3, num, l, str3, z2, z3, l2, i3, c100738k) {
    console.log('$init is called' + ', ' + 'str: ' + str + ', ' + 'j: ' + j + ', ' + 'c14425b: ' + c14425b + ', ' + 'i: ' + i + ', ' + 'chnVar: ' + chnVar + ', ' + 'i2: ' + i2 + ', ' + 'j2: ' + j2 + ', ' + 'z: ' + z + ', ' + 'str2: ' + str2 + ', ' + 'j3: ' + j3 + ', ' + 'num: ' + num + ', ' + 'l: ' + l + ', ' + 'str3: ' + str3 + ', ' + 'z2: ' + z2 + ', ' + 'z3: ' + z3 + ', ' + 'l2: ' + l2 + ', ' + 'i3: ' + i3 + ', ' + 'c100738k: ' + c100738k);
    let ret = this.$new(str, j, c14425b, i, chnVar, i2, j2, z, str2, j3, num, l, str3, z2, z3, l2, i3, c100738k);
    console.log('$init ret value is ' + ret);
    return ret;
};
//响应的数据
let FinderPreloadTransform = Java.use("com.tencent.mm.plugin.finder.preload.g");
FinderPreloadTransform["a"].overload('com.tencent.mm.protocal.protobuf.cgh', 'java.util.List', 'int').implementation = function (cghVar, list, i) {
    console.log('a is called' + ', ' + 'cghVar: ' + cghVar + ', ' + 'list: ' + list + ', ' + 'i: ' + i);
    let ret = this.a(cghVar, list, i);
    console.log('a ret value is ' + ret);
    return ret;
};

在这里插入图片描述

可以看到每次请求确实会走这里 而且第一个参数就是视频号的用户名:v2_060000231003b20faec8c5e********************@finder
解析响应的list里面也会包含标题 id等一堆信息 这样就拿到了我需要的标题 id 等信息了
接下来就去找找怎么执行这个请求

寻找构造函数的交叉引用 有很多
在这里插入图片描述
我们打印一下堆栈 看一下执行流程 (为什么是打印堆栈而不是选择交叉引用 因为这个点浪费了我很多 时间 就是它的类很多都是抽象方法 往上手动跟踪的话 会找到未实现的方法!)
可以看到一个UI的Create()函数
可以看到我们开始没有定位到的UI界面 继续跟进去
在这里插入图片描述
在onCreate 函数中 他会获取 FinderProfileFeedLoader 对象 继承 BaseFinderFeedLoader
在这里插入图片描述在这里插入图片描述
接下来我的思路就变成了 构造 FinderProfileFeedLoader 对象 然后调用requestRefresh() 方法
在这里插入图片描述
构造方法也很简单 第一个参数是枚举类型 第二个是用户名 第三个是chn对象 后面是boolean
hook输出一下参数打印 如下

在这里插入图片描述

开始构造执行请求

在这里插入图片描述

调用函数 执行刷新 完美~

在这里插入图片描述

后面发现视频多 需要翻页这么执行就不行了 同上继续跟踪

在这里插入图片描述

这么简单 翻页?执行一下就行了

在这里插入图片描述

发现还是第一页 原来是它第二个构造参数变成了 获取视频 id

在这里插入图片描述

可以填充data 或者 自己hook参数 改需要翻页的视频id就行了~ 感兴趣自己研究一下
待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java——编辑距离

题目链接 leetcode在线oj题——编辑距离 题目描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 题目示例 输入:word…

搭建DJI 无人机Onboard SDK ROS开发环境及测试

搭建DJI 无人机Onboard SDK ROS开发环境及测试功能包简介开发环境搭建测试功能包连接设备启动SDK功能包简介 ROS功能包名称:dji_sdk 功能包功能:用于DJI 板载SDK的ROS版本 OSDK 是一个用于开发无人机应用程序的开发工具包,基于OSDK 开发的…

CUDA线程层次一文搞懂|参加CUDA线上训练营

设备术语 Host:CPU 和 内存 (host memory)Device:GPU 和显存 (device memory) CUDA 线程层次 CUDA 线程层次分为: Thread 所有线程执行相同的核函数并行执行 Thread Block 执行在一个 Streaming Multiprocessor (SM&#xff09…

Python快速上手系列--异常处理--详解篇

本章所说的就是我们经常遇到的一个问题,报错、异常。我们应该如何处理,让它不影响后面的程序运行。异常首先我们看看一个简单的示例。print(2/0)其结果可想而知,当然是报错了!程序被终止了!这里会提示用户,…

索引-性能分析-慢查询日志

索引语法 1、创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的; 1)加上 UNIUQE 就是创建唯一索引(唯一索引,说明改字段不能出现重复数据); 2)加上FULLTEXT 创建的是一个全文索引;…

Webpack5 环境下 Openlayers 标注(Icon) require 引入图片问题

Webpack5 环境下 Openlayers 标注(Icon) require 引入图片问题环境版本Openlayers 使用 require 问题Webpack5 正确配置构建新环境的时候,偶然发现 Openlayers 使用 require 的方式加载图片(Icon)报错,开始…

电子技术——DC偏移

电子技术——DC偏移 因为差分放大器是直接耦合的并且对于DC有着有限的增益,因此本节我们讨论差分放大器在DC相关方面的问题。 MOS差分放大器的输入偏移电压 考虑下面的电路,我们将MOS差分放大器的输入端都置地: 此时假如电路完全对称&#…

IP地址:揭晓安欣警官自证清白的黑科技

《狂飙》这部电视剧,此从播出以来可谓是火爆了,想必大家都是看过的。剧中,主人公“安欣”是一名警察。一直在与犯罪分子做斗争。 莽村的李顺案中,有匿名者这个案件在网上发帖恶意造谣,说安欣是黑恶势力的保护伞&#…

将视频作为桌面动态壁纸,只需要两步,让你保存的视频在桌面动起来,动态壁纸工具,视频动态壁纸,小风车,桌面美化工具

这款软件可以让你宝贵的视频资源变成动态壁纸显示在你的电脑上,体积小巧,不需要安装,即点即用。 一、软件简介 这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件,它体积小巧,占用资源也不多,相比…

SpringMVC基础入门(一)之理论基础概念

文章目录SpringMVC1.概念2.常用注解请求与响应1.请求参数2.JSON传输3.常用注解响应1.响应页面2.响应JSON数据Rest风格1.介绍2.常用注解SpringMVC 1.概念 (1)定义 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。 (2)为什…

test2

物理层故障分析 一、传输介质故障 a.主要用途简述 传输介质主要分为 导向传输介质和非导向传输介质。前者包括双绞线(两根铜线并排绞合,距离过远会失真)、同轴电缆(铜质芯线屏蔽层,抗干扰性强,传输距离更…

VScode查看python f.write()的文件乱码

VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码, print(),汉字正常显示, 使用 with open()as f: f.write()文件后, 在 …

【Java】HashMap原理

哈希表(Hash table) 也叫散列表,是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快…

nvm安装后出现‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

出现这个问题多半是path地址不对。 打开系统环境变量。看看path里面有没有?没有的话,加上就行! 我的报错原因就是因为path里没有自动加上nvm的相关路径。 注意项: 1,在安装nvm之前,提前要把本机以前安装…

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码5. 踩坑记录1. 题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 例如: 给定二叉…

2023年开始,为什么公司运营依赖于流程文档?

当您的业务扩展时,您会得到越来越多的活动部件,跟踪复杂性是某人的工作。人员和任务需要以最有成效的方式组织,您必须找到某种方式让员工知道如何执行有效完成工作所需的流程。为了使过程可重复,需要将其记录在案。有人需要写下你…

关于conda env导出yaml无法create的问题解决

在使用conda env 命令创建package 列表之后,无法用yml文件创建新的环境。 这是因为在环境导出的时候没有加--no-builds 这个选项。 conda env export 正确的导出环境的做法如下: conda env export --no-builds > environment.yml--no-builds 的作用…

(C语言)自定义类型,枚举与联合

问:1. 结构体在自引用的时候不能怎么样?可以怎么样?2. Solve the problems:自定义一个学生结构体类型,要包含姓名,性别,年龄,六科成绩,家乡(也为结构体&#…

服务器开发29:Kubernetes (K8S)上手简单实践(2/13)

文章目录一、Kubernetes (K8S) 简介1)简介2)主要特性:3)学习前提4)不同部署方案5)为什么需要K8S6)K8S集群架构7)Kubernetes 组件二、安装k8s集群1)安装方式介绍2&#xf…

python笔记-- “__del__”析构方法

-#### 1、基本概念(构造函数与析构函数) 特殊函数:由系统自动执行,在程序中不可显式地调用他们 构造函数: 建立对象时对对象的数据成员进行初始化(对象初始化) 析构函数: 对象生命期…