PC微信逆向) 定位微信浏览器打开链接的call

首发地址: https://mp.weixin.qq.com/s/Nik8fBF3hxH5FPMGNx3JFw

前言

最近想写一个免费的微信公众号自动采集的工具,我看公众号文章下载需求还挺多的。搜了下github,免费的工具思路大多都是使用浏览器打开公众号主页获取到需要的请求参数,例如key、uin等,然后再用参数请求历史。

优化

这些工具都需要自己复制公众号主页的链接发给文件传输助手然后打开,才能拦截到请求参数,那么能不能让这一步也让程序来完成呢?

简单的方式可以使用模拟点击,这个有兴趣的自行实现。这篇文章我说下基于逆向的方式在微信内置浏览器打开某个链接,这样实现可以更自动化一点,下面是具体的逆向和分析过程。

其他采集方案

在之前的一篇文章里我也说了其他一些采集方案,例如微信公众平台、微信读书等,有兴趣的可以看【Python微信机器人】写一个监控采集公众号文章的插件。不过听说微信读书已经开始加密了,而且采集的历史也不是很全,较早的文章可能获取不到。

对于微信公众平台来采集的可以参考aardio爬虫) 实战篇:采集自己的公众号粉丝列表,原理基本类似,都是先扫码获取到cookie,请求对应的接口,公众平台的接口都没加密。

还有基于逆向hook的采集方案,这个暂不公开。如果只是平时下载一下公众号文章的话,上面两种足够用了

方案优缺点

拦截参数对比逆向来说优点在于不需要固定微信的版本,更适合普通用户。因为逆向hook只能适用于特定版本,想不限版本,需要为每个版本做一遍适配,这明显不太可能。

而且基于逆向的方式采集还有可能有封号的风险,对于只想下几篇公众号文章的人来说,这个代价还是挺大的。当然逆向采集优点也很明显:稳定、无需人工操作、采集的数据量更多等。

逆向过程

下面逆向的版本选择的是3.9.6.32,选这个版本主要是之前的写的机器人用的这个版本,很多东西有现成的。最新的也没变,想看64位最新版的翻到最后,也会提几句。

日志定位

微信定位一个功能call最好也最方便的方式就是日志(肯定不是因为我只会这个)。打开链接的地方有多处,比如以下两个:

还有就是点击聊天记录里的链接来打开,这三种方式都试一下,看看日志之间有什么共同点,这样更容易定位到关键日志点。

方式1打开链接

方式2打开链接

聊天界面点击链接

前两个都有openUrlWithExtraWebview,看名称应该就是微信在调用打开浏览器,但是这里还处于比较上层的位置,如果你在这里打断点的话,会触发多次,不止打开浏览器才触发,并且看了下参数比较复杂,有一堆句柄和回调不好处理,所以这里先不考虑了。

WebViewMgr:user setting这个日志比较重要,因为三个日志里都有它,而且正好处于openUrlWithExtraWebviewAddTab的中间位置,看上去像是打开浏览器时初始化配置。

感觉在这里打上断点应该能在调用堆栈里找到打开浏览器的call。先在IDA里搜索user setting(x64dbg里搜索这个字符串也可以,我比较喜欢看IDA,有伪C代码看比汇编直观一点),然后定位到下面的位置:

接着翻到函数头,在x64dbg里函数头的位置打上断点,接着打开一个链接让断点断下

右键右下角堆栈的返回地址选择在反汇编中转到指定DWORD(也就是函数调用的地方),然后在IDA中查看这个地址,翻到函数头的位置看到了比较关键的日志信息(showWebView),在函数头继续打上断点

查看调用的位置,先看看IDA里这里所在的函数在做些什么操作,看上去是在解析json,而且看到了日志有OpenUrlWithExtraWebviewHandler,看名称这里就是处理OpenUrlWithExtraWebview事件的回调,那前面解析json就是在解析之前日志里的json

在头部打上断点,看看传入的参数是不是就是之前的json。如下图,虽然参数不是之前看到的json字符串,但是和json内容基本一样,估计上层函数又对json做了解析,那这里肯定是处理OpenUrlWithExtraWebview事件的回调函数,也就是在这个函数里打开的链接

那关键位置基本就是上面提到的showWebView函数了,下面开始分析函数的参数和几个需要调用的call。

分析参数

这里只有ecx是未知的,看了下ebp-0x90C在上面就有,估计是上面赋值的,打上断点看一下,一般复制的结构体都有函数可以生成,不需要去关心怎么构造。当然,如果构造的call离的太远且结构体也不负责的话也可以自己构造。

分析的结果如上,这里没什么复杂的参数,只需要传一个url就可以。前面在查看函数引用的时候,看到有的地方调用6CC52610时不是push的这几个值,也就是说这四个值并不是固定的,而是用于控制某些变量。

比如用系统默认浏览器打开则是下面的参数:

可能的组合(每行一种,最后一位是edx)

0 1 0 0 4
0 1 1 0 4
0 1 0 0 2
0 1 0 1 4
0 1 0 0 0
0 1 0 1 2
1 1 0 0 4
0 1 1 0 5
0 1 1 0 8
1 1 0 0 0
1 1 0 0 4

可以自己都测试一遍,不过看日志有的可能是打开小程序相关的,参数不一样也许会崩溃,具体案例具体分析吧。还有一个点,调用这四个call,堆栈不平衡,需要加上add esp, 0x10;(不一定这么处理,也可能是少call,单步走看看到哪个call平栈了),我看其他地方调用这个call都是使用的add esp, 0x10;,所以猜测这里加上这个也能运行。下面还有一个call是释放ebp-0x90C结构体里的内存,也需要调用一下。

完整代码
DWORD ShowVebView(wchar_t* url) {size_t urlLen = wcslen(url);DWORD WeChatWinBase = GetWeChatWinBase();DWORD dwCall1 = WeChatWinBase + 0x77A430;DWORD dwCall2 = WeChatWinBase + 0xF67310;DWORD dwCall3 = WeChatWinBase + 0x76CC70;DWORD dwCall4 = WeChatWinBase + 0x1602610;DWORD dwCall5 = WeChatWinBase + 0x77A790;DWORD ebp_0x90C[0x500] = { 0 };__asm {pushad;lea ecx, ebp_0x90C;call dwCall1;push urlLen;push url;lea eax, ebp_0x90C;lea ecx, [eax + 0x56C];call dwCall2;call dwCall3;push 0x0;push 0x1;push 0x0;push 0x0;xor edx, edx;lea ecx, ebp_0x90C;call dwCall4;add esp, 0x10;lea ecx, ebp_0x90C;call dwCall5;popad;}return 0;
}

编译成dll注入到进程,调用ShowVebView正常打开链接。

64位

以能下载到的最新版为例(3.9.10.27),其实32位和64位微信逻辑是一样的,同样在x64dbg里搜索user setting,在引用的函数头打断点找到调用点,然后接着在函数头打断点找到调用点,关键位置如下图(基址是00007FF86A160000):

逻辑一模一样,只是64位无法内联汇编,可以用函数指针来调用。大概代码如下:

typedef UINT64 (*dwCall1Ptr)(UINT64);
dwCall1Ptr dwCall1 = (dwCall1Ptr)0x7FF86BD82C70;
DWORD rbp_0x100[0x500] = {0};
UINT64 addr = dwCall1(&rbp_0x100);typedef UINT64 (*dwCall2Ptr)(UINT64,wchar_t*,UINT64);
dwCall2Ptr dwCall2 = (dwCall2Ptr)0x7FF86C840C10;
wchar_t* url = (wchar_t*)L"";
dwCall2(addr+0x***, url, wcslen(url));typedef UINT64 (*dwCall3Ptr)();
dwCall3Ptr dwCall3 = (dwCall3Ptr)0x7FF86BD72AE0;
dwCall3();typedef UINT64 (*dwCall4Ptr)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
dwCall4Ptr dwCall4 = (dwCall4Ptr)0x7FF86D24E9B0;
dwCall4(addr, 0,0,0,1,0);typedef UINT64 (*dwCall5Ptr)(UINT64);
dwCall5Ptr dwCall5 = (dwCall5Ptr)0x7FF86BD82EA0;
dwCall5(addr);

上面只是伪代码,需要自己调试改成能运行的代码。

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

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

相关文章

雷军出手,光储充一体化赛道可太行了

雷军出手,特斯拉、宁德时代、奥能电源持续加码,光储充一体化赛道可太行了 近几年,各地光储充一体化项目遍地开花,正式投入运营的新闻接连不断。被视为全球能源转型重要驱动力的光储充一体化,已成为各大企业竞相入局的新…

FOXMAIL邮箱:高效办公,邮件管理新风尚

随着电子邮件在日常工作和生活中的普及,选择一个高效、易用的邮箱客户端变得尤为重要。FOXMAIL作为一款功能强大、操作简便的邮箱客户端,深受用户喜爱。下面将为您详细介绍FOXMAIL邮箱的使用方法,帮助您轻松掌握其各项功能。 一、下载安装与账…

【深度优先搜索 广度优先搜索】297. 二叉树的序列化与反序列化

本文涉及知识点 深度优先搜索 广度优先搜索 深度优先搜索汇总 图论知识汇总 LeetCode297. 二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传…

App UI 风格,引领设计风向

App UI 风格,引领设计风向

vue3 proxy对象转为原始对象

https://cn.vuejs.org/api/reactivity-advanced.html#toraw import { toRaw } from "vue";const foo {} const reactiveFoo reactive(foo)console.log(toRaw(reactiveFoo) foo) // true 人工智能学习网站 https://chat.xutongbao.top

三人拼团模式的核心:二二公排

在电商市场中,拼团模型的玩法是层出不穷,不断有各种新的拼团模式出现,如:七人拼团、全民拼购、预售拼购等等,还有各大电商平台的拼购,如:拼夕夕的拼单购物、镁团的拼好饭等等。下面分享一个全新…

柏曼的台灯值得入手吗?书客、明基横向测评对比

据相关研究显示,我国青少年的近视问题尤为严峻,总体近视率已逼近53%,这一超过半数的数据令人触目惊心。随着孩子学龄的增长,学习负担不断加重,眼部的压力也随之剧增,从而导致近视率持续攀升。普通台灯可能发…

Chromium源码阅读:深入理解Mojo框架的设计思想,并掌握其基本用法(1)

Mojo简介 Mojo 是一个运行时库的集合,提供与平台无关的通用 IPC 原语抽象、消息 IDL 格式以及具有针对多种目标语言的代码生成的绑定库,以便于跨任意进程间和进程内边界传递消息。 Mojo 分为清晰分离的层,子组件的基本层次结构如下&#xff…

2024下《系统分析师》50个高频考点汇总!背就有效

宝子们!上半年软考已经结束一段时间了,准备备考下半年软考高级-系统分析师的小伙伴可以开始准备了,毕竟高级科目的难度可是不低的,相信参加过上半年系分的小伙伴深有体会。 这里给大家整理了50个高频考点,涵盖全书90%…

透视环世物流:一个AI降本的产业典型样本

在过去的多年时间里,与其说低代码完成的数字原生的普惠,不如说其最强的能力恰是能帮助企业用最低的门槛、最高的效率构建出与自身适配的流程和业务应用,在底层帮助企业构建出一个被极致拆分和分子化的软件开发中台。 而透过环世物流&#x…

数据结构笔记-2、线性表

2.1、线性表的定义和基本操作 如有侵权请联系删除。 2.1.1、线性表的定义: ​ 线性表是具有相同数据类型的 n (n>0) 个数据元素的有限序列,其中 n 为表长,当 n 0 时线性表是一个空表。若用 L 命名线性表,则其一般表示为&am…

从报名到领证:软考初级【信息系统运行管理员】报名考试全攻略

本文共计9991字,预计阅读33分钟。包括七个篇章:报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求: 1.凡遵守中华人民共和国宪法和各项法律,恪守职业道德,具有一定计算机技术…

利用AI大模型,将任何文本语料转化为知识图谱,可本地运行!

几个月前,基于知识的问答(KBQA)还是一个新奇事物。 现在,对于任何 AI 爱好者来说,带检索增强生成(RAG)的 KBQA 就像小菜一碟。看到自然语言处理(NLP)的可能性领域由于大…

CP AUTOSAR标准中文文档链接索引(更新中)

AUTOSAR标准的核心组件包括通信、诊断、安全等,这些组件通过模块化结构进行组织。系统被划分为多个模块,每个模块负责特定的功能。模块之间通过接口进行通信,接口定义了模块之间的交互规则。AUTOSAR标准支持模块的配置,可以根据不…

基于BP神经网络对鸢尾花数据集分类

目录 1. 作者介绍2. 关于理论方面的知识介绍2.1 BP神经网络原理2.2 BP神经网络结构 3. 关于实验过程的介绍,完整实验代码,测试结果3.1 鸢尾花数据集介绍3.2 代码演示3.3 结果演示 4. 问题与分析 1. 作者介绍 侯硕,男,西安工程大学…

【动态规划算法题记录】70. 爬楼梯——递归/动态规划

题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 题目分析 递归法(超出时间限制) 递归参数与返回值 void reversal(int i, int k) 每次我们处理第i个台阶到第k个…

白酒:茅台镇白酒的品牌故事与传奇色彩

茅台镇,这个位于中国贵州省遵义市仁怀市的小镇,因为出产的白酒品质卓着,被誉为“世界名酒之乡”。在这片神奇的土地上,云仓酒庄以其豪迈白酒,书写了一段段品牌故事与传奇色彩。 云仓酒庄豪迈,酿造于茅台镇的…

Vue23-过滤器

一、效果图 二、好用的时间戳三方工具 该三方工具比较大 推荐使用 dayjs的用法: 三、过滤器的使用 3-1、计算属性实现 3-2、methods函数实现 3-3、过滤器filters属性实现 过滤器的本质就是函数!!! 1、过滤器-未传参 默认将管道…

TIM—通用定时器高级定时器

通用/高级定时器的功能 在基本定时器功能的基础上新增功能: 通用定时器有4个独立通道,且每个通道都可以用于下面功能。 (1)输入捕获:测量输入信号的周期和占空比等。 (2)输出比较:产…

自动化办公03 用xlrd和xlwt库操作excel.xls文件(老版本)

目录 一、读操作 二、写操作 三、设置单元格格式 0.综合案例 1.设置行高和列宽 2.设置字体样式 3.设置边框样式 4.设置对齐方式 5.设置背景颜色 6.合并单元格 四、 xlutils修改Excel⽂件内容 1.安装 2.使用 一、读操作 import xlrd# 1. 打开excel文件 wb xlrd.op…