前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PC微信逆向:分析通用设置数组

PC微信逆向:分析通用设置数组

作者头像
信安之路
发布2020-05-27 11:03:19
9960
发布2020-05-27 11:03:19
举报
文章被收录于专栏:信安之路信安之路

待分析微信版本 2.8.0.121,分析诉求:通过代码实现关闭微信通用设置里的“有更新时自动升级微信"。

通用设置切入点

这种复选框的设置无非就是一个标志位的问题,分析起来比较简单,中间肯定会涉及到一些数据结构。作为开发者肯定不会把每一个设置选项都单独存放,而是放在一个数据结构里方便管理。

1、首先用 CE 附加微信

2、在取消勾选状态下搜索 0

3、在勾选状态下搜索 1

5、重复这个步骤,直到筛选出唯一一个地址。

6、然后在这个地址上下内存写入断点,并且让程序断下

分析通用设置数据结构

eax+0x8 就是我们要找的标志位,这里要往上追 eax 的值

基址= eax+0x8

eax 一般作为返回值来源于上面的 call,但是上面一个 call 不会断下,说明不来自于 call,而是来自 [ecx]

在这个位置下断,查看 [ecx]+0x8 的值,这里我们发现不是我们要找的标志位,说明中间有代码改变了 ecx 的值

一直F7往下走,发现有一个循环,先确定循环头和循环尾,接着来分析整段代码

先比较 [eax+0x4] 的值是否等于 ebx,这里是循环的跳出条件。ebx 等于 0x69,这个 0x69 后续等分析完了整个结构大概可以猜到是什么。

接着 edx 自增 1 ,edx 的值在循环体外被初始化为 0,说明这个 edx 相当于循环的 i。然后比较 edxesiesi 的值为 0x12,也就是说循环的次数最大为 0x12,整个数据结构的总共有 0x12 个成员。

继续往下

这里将 ecx+4,数据窗口跟随查看一下 ecx,这种连续的地址明显是一个数组。ecx 是数组首地址。这个数组没有用最常见的的 [eax+ecx*4] 的方式进行遍历,而是用首地址一直 +4 的方式来遍历整个数组。

再回到之前的偏移表达式

这里 ecx 来自于 [edi+0x4][edi+0x4] 就是数组首地址

基址= [[edi+0x4]]+0x8

这里就要修改一下这个偏移表达式了

基址= [[edi+0x4]+i*0x4]+0x8

接下来确定数组下标

在循环跳出条件的地址下断,观察 edx 的值,此时 edx 等于 4

当下标为 4 时,这个结构体数组指向我们要找的标志位

基址= [[edi+0x4]+4*0x4]+0x8

继续往上追 edi

edi 来自 [esi+0x4]

基址= [[[esi+0x4]+0x4]+4*4]+0x8

往上找 esi

esi 来自 ecx

基址= [[[ecx+0x4]+0x4]+4*4]+0x8

返回上层函数追 ecx

ecx 来自 edi

edi 又来自 ecx,返回上层追 ecx

ecx 来自 eax,进到上面的 call 追 eax

这里我们看到 eax 来自于一个基址 [0x6B706198],到这里,禁止更新的基址就找完了。

分析通用设置数组

接着我们来分析一下整个结构体数组

[[[[0x6B706198]+0x4]+0x4]+i*4]+0x8

整个表达式可以拆分为下面几部分

数组首地址= [[0x6B706198]+0x4]+0x4

数组下标= i*4

偏移= 0x8

首先来观察数组的首地址,0x2B32A58 就是整个通用设置结构体数组的首地址,下面的 0x12 是数组成员个数。数据窗口跟随

这里是结构体数组,每一个成员都是一个结构体。再观察下标为 4 的表达式内容

[[[[0x6B706198]+0x4]+0x4]+4*4]+0x8

这里的值为 0x69,正好是循环的结束条件,这个应该是类似功能 ID 之类的唯一标识。另外每一个下标都对应不同的通用设置,这里列出部分

i=2:开启新消息提醒声音
i=3:开启语音和视频通话提醒声音
i=4:有更新时自动升级微信
i=5:热键与其他冲突时提醒
i=6:适用系统缩放比例

这里还会碰到一个很玄学的问题,每台电脑的偏移不一样,比如 i=4 在我这里是有更新时自动升级微信,在另外一台机器上可能是 i=7 的时候是这个功能设置。

随机的数组下标

想要解决这个问题,就要回顾之前的代码

这一块是整个数组的遍历代码,所有的通用设置都会走这段代码,当勾选开启语音和视频通话提醒声音时,这个功能 ID 为 0x68

0x68:开启新消息提醒声音
0x172:开启语音和视频通话提醒声音
0x69:有更新时自动升级微信
0x6D:保留聊天记录

所以修改通用设置的关键并不是数组下标对应的标志位,这个数组下标是随机的。关键在于功能ID对应的标志位,有点类似 Key->Value 的组合

功能ID:[[[[0x6B706198]+0x4]+0x4]+i*4]+0x4
标志位:[[[[0x6B706198]+0x4]+0x4]+i*4]+0x8

如果想要修改对应的通用设置,就要先比对功能 ID,然后修改 ID 对应的标志位。到这里,整个通用设置算是分析完成了。

最后附 Github 地址:

https://github.com/TonyChen56/WeChatRobot

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析通用设置数据结构
  • 分析通用设置数组
  • 随机的数组下标
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档