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

  • A+
所属分类:安全文章

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

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

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

通用设置切入点

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

1、首先用 CE 附加微信

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

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

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

3、在勾选状态下搜索 1

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

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

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

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

分析通用设置数据结构

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

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

基址= eax+0x8

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

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


基址=[ecx]+0x8

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

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

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

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

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

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

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

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

继续往下

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

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

再回到之前的偏移表达式

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

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

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

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

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

接下来确定数组下标

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

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

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

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

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

继续往上追 edi

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

edi 来自 [esi+0x4]

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

往上找 esi

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

esi 来自 ecx

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

返回上层函数追 ecx

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

ecx 来自 edi

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

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

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

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

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

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

分析通用设置数组

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

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

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

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

数组下标= i*4

偏移= 0x8

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

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

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

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

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

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

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

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

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

随机的数组下标

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

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

这一块是整个数组的遍历代码,所有的通用设置都会走这段代码,当勾选开启语音和视频通话提醒声音时,这个功能 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

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

本文始发于微信公众号(信安之路):PC微信逆向:分析通用设置数组

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: