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

news2024/11/24 18:37:54

首发地址: 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.coloradmin.cn/o/1819130.html

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

相关文章

vue+java实现简易AI问答组件(基于百度文心大模型)

一、需求 公司想要在页面中加入AI智能对话功能,故查找免费gpt接口,最终决定百度千帆大模型(进入官网、官方文档中心); 二、主要功能列举 AI智能对话;记录上下文回答环境;折叠/展开窗口&#…

从0到1搭建MCU芯片上操作系统环境。开发都需要哪些环节和准备

MCU芯片环境搭建与操作系统上载步骤 1. 硬件准备 选择合适的MCU芯片,例如STM32、GD32等。 准备开发板,用于硬件连接和实验。 准备必要的外围设备,如电源适配器、USB转串口模块等。 2. 软件环境搭建 安装编程语言环境,如C/C编译…

2024年中漫谈

不知不觉,2024年已来到了6月,博主不禁感叹时光易逝,岁月的车轮滚滚向前,永不止步,此刻无关贫穷与富裕,伟大与平凡。 于是乎,宇宙(时空)看似毫无终点,一望无垠…

for循环结构

循环: 循环是一个重复执行一个代码的结构。只要满足循环的条件,会一直执行这个代码。 循环条件:在一定范围之内,按照指定的次数来执行循环。 循环体:在指定的次数内,执行的命令序列。只要条件满足&#…

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

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

GUI初步开始(matlab)

GUI初步开始(matlab) (自用笔记) 打工人艰辛速成,花几个小时从零到能用,记录下details and problems: 甲方要求:GUI界面,读下位机,找到解码后格式中所需要的…

GGML简单介绍

GGML是一个用于机器学习的张量库,可以在商用硬件上实现大型模型和高性能。它被llama.cpp和whisper.cpp使用 C语言编写 16位浮点支撑 整数量化支持(如4位、5位、8位) 自动分化 内置优化算法(如ADAM, L-BFGS) 针对苹果芯片进行优化 在x86架构上利用AVX / AVX2的内在特…

人工智能:项目管理的新视角与未来影响

随着科技的飞速发展,人工智能(AI)已经从科幻小说中的概念变为现实生活中的强大工具。作为一名工作多年的项目管理人员,我深感AI在项目管理领域中的潜力和影响。在这篇文章中,我将从项目管理人员的角度,探讨…

晶圆代工市占洗牌,中芯跃居第三名 | 百能云芯

市场研究机构集邦咨询(TrendForce)最新发布的调查显示,今年第1季前五大晶圆代工厂第1季排名出现明显变动,除了台积电(TSMC)继续蝉联第一名,中芯国际(SMIC)受惠消费性库存…

视频媒介VS文字媒介

看到一篇蛮有思考意义的文章就摘录下来了,也引起了反思 目录 一、视频的定义 二、”视频媒介“与”文字媒介”作对比 1.形象 VS 抽象 2.被动 VS 主动 三、视频的缺点-【更少】的思考 1.看视频为啥会导致【更少的思考】 2.内容的【浅薄化】 3.内容的【娱乐化…

一文讲清:bom管理系统是什么?在生产管理中有什么作用?

在制造业中,物料清单(Bill of Materials,简称BOM)扮演着至关重要的角色。物料清单(BOM)是制造或维修产品所需的材料、组件和零件的结构化综合列表,以及所需材料的数量、名称、描述和成本。简而言…

【代码随想录】【算法训练营】【第36天】[452]用最少数量的箭引爆气球 [435]无重叠区间 [763]划分字母区间

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 36,周三,最难坚持的一天~ 题目详情 [452] 用最少数量的箭引爆气球 题目描述 452 用最少数量的箭引爆气球 解题思路 前提:区间可能重叠 思路:…

对接钉钉Stream模式考勤打卡相关事件的指南

钉钉之前的accessToken是公司级别的,现在的accessToken是基于应用的,接口的权限也是基于应用的。所以第一步是在钉钉开放平台(https://open-dev.dingtalk.com/)创建一个应用。 创建好应用之后,因为我们后续还需要调用钉…

分布式事务seata之AT与TCC模型

1. seata分布式事务简介 seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。 Seata提供了AT、TCC、SAGA和XA事务模型,为用户打造一站式的分布式解决方案。 简单来说,Seata就是针对主流事务解决方案的封装…

Unity:Text-TextMeshPro 不显示中文

共计四步: 一、去C盘复制一份字体: C:\Windows\Fonts二、粘贴到你的项目里(任意文件位置),得到“MSYH”: 三、右键字体文件,依次点击create–>TextMeshPro–>FontAsset: …

visdom使用时所遇的问题及解决方法

最近在用visdom进行可视化的过程中,虽然可有效的避免主机拒绝访问(该问题的解决方法,请参考深度学习可视化工具visdom使用-CSDN博客)即在终端输入python -m visom.server 1.训练过程中visdom出现ValueError: too many file descr…

科技项目验收测试必须进行吗?软件测试公司推荐

科技项目验收测试是指在科技项目开发周期中,对项目完成后进行的一种测试和评估工作。它的目的是验证项目是否达到预期的要求,并确保项目交付给客户前达到预期的质量标准。 一、科技项目验收测试的必要性   科技项目验收测试是项目管理中不可或缺的一个…

5.5 Python 迭代器与生成器

文章目录 1. 三元表达式1.1 格式1.2 示例1.3 嵌套 2. 生成式2.1 列表生成式2.2 字典生成式2.3 集合生成式2.4 元组生成式 3. 可迭代对象4. 迭代器4.1 迭代器的优缺点4.2 迭代器的惰性机制4.3 生成迭代器4.4 文本IO包装器4.5 字符串迭代器4.6 列表迭代器4.7 字典键迭代器4.8 元组…

怎么改图片尺寸更方便?在线图片改大小的使用方法

图片怎么快速改尺寸呢?在网上传图或者做其他用途时,经常会对图片的尺寸有要求,当拍摄或者制作的图片太大或者太小时,都会导致图片的无法正常使用,那么就需要按照规定将图片改大小之后才能正常使用。 在遇到图片修改大…

ui自动化中,隐式等待和显示等待什么时候使用

隐式等待 在页面刷新加载时,页面元素还没有出来,这个时候如果去找元素就会找不到报错 或者点了一个菜单,页面加载时 用笨办法,就是用sleep等待固定的时间,这种浪费的时间比较多,就可以用隐式等待&#xf…