待分析微信版本 2.8.0.121
,分析诉求:通过代码实现关闭微信通用设置里的“有更新时自动升级微信"。
通用设置切入点
这种复选框的设置无非就是一个标志位的问题,分析起来比较简单,中间肯定会涉及到一些数据结构。作为开发者肯定不会把每一个设置选项都单独存放,而是放在一个数据结构里方便管理。
1、首先用 CE 附加微信
2、在取消勾选状态下搜索 0
3、在勾选状态下搜索 1
5、重复这个步骤,直到筛选出唯一一个地址。
6、然后在这个地址上下内存写入断点,并且让程序断下
分析通用设置数据结构
eax+0x8
就是我们要找的标志位,这里要往上追 eax
的值
基址=
eax+0x8
eax
一般作为返回值来源于上面的 call,但是上面一个 call 不会断下,说明不来自于 call,而是来自 [ecx]
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
在这个位置下断,查看 [ecx]+0x8
的值,这里我们发现不是我们要找的标志位,说明中间有代码改变了 ecx
的值
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
一直F7往下走,发现有一个循环,先确定循环头和循环尾,接着来分析整段代码
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
先比较 [eax+0x4]
的值是否等于 ebx
,这里是循环的跳出条件。ebx
等于 0x69
,这个 0x69
后续等分析完了整个结构大概可以猜到是什么。
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
接着 edx
自增 1 ,edx
的值在循环体外被初始化为 0
,说明这个 edx
相当于循环的 i
。然后比较 edx
和 esi
,esi
的值为 0x12
,也就是说循环的次数最大为 0x12
,整个数据结构的总共有 0x12
个成员。
继续往下
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
这里将 ecx+4
,数据窗口跟随查看一下 ecx
,这种连续的地址明显是一个数组。ecx
是数组首地址。这个数组没有用最常见的的 [eax+ecx*4]
的方式进行遍历,而是用首地址一直 +4
的方式来遍历整个数组。
再回到之前的偏移表达式
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
这里 ecx
来自于 [edi+0x4]
,[edi+0x4]
就是数组首地址
基址= [[edi+0x4]]+0x8
这里就要修改一下这个偏移表达式了
基址= [[edi+0x4]+i*0x4]+0x8
接下来确定数组下标
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
在循环跳出条件的地址下断,观察 edx
的值,此时 edx
等于 4
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
当下标为 4
时,这个结构体数组指向我们要找的标志位
基址= [[edi+0x4]+4*0x4]+0x8
继续往上追 edi
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
edi
来自 [esi+0x4]
基址= [[[esi+0x4]+0x4]+4*4]+0x8
往上找 esi
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
esi
来自 ecx
基址= [[[ecx+0x4]+0x4]+4*4]+0x8
返回上层函数追 ecx
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
ecx
来自 edi
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
edi
又来自 ecx
,返回上层追 ecx
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
ecx
来自 eax
,进到上面的 call 追 eax
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
这里我们看到 eax
来自于一个基址 [0x6B706198]
,到这里,禁止更新的基址就找完了。
分析通用设置数组
接着我们来分析一下整个结构体数组
[[[[0x6B706198]+0x4]+0x4]+i*4]+0x8
整个表达式可以拆分为下面几部分
数组首地址= [[0x6B706198]+0x4]+0x4
数组下标= i*4
偏移= 0x8
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
首先来观察数组的首地址,0x2B32A58
就是整个通用设置结构体数组的首地址,下面的 0x12
是数组成员个数。数据窗口跟随
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
这里是结构体数组,每一个成员都是一个结构体。再观察下标为 4 的表达式内容
[[[[0x6B706198]+0x4]+0x4]+4*4]+0x8
![PC微信逆向:分析通用设置数组 PC微信逆向:分析通用设置数组]()
这里的值为 0x69
,正好是循环的结束条件,这个应该是类似功能 ID 之类的唯一标识。另外每一个下标都对应不同的通用设置,这里列出部分
i=2:开启新消息提醒声音
i=3:开启语音和视频通话提醒声音
i=4:有更新时自动升级微信
i=5:热键与其他冲突时提醒
i=6:适用系统缩放比例
这里还会碰到一个很玄学的问题,每台电脑的偏移不一样,比如 i=4
在我这里是有更新时自动升级微信,在另外一台机器上可能是 i=7
的时候是这个功能设置。
随机的数组下标
想要解决这个问题,就要回顾之前的代码
![PC微信逆向:分析通用设置数组 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微信逆向:分析通用设置数组]()
本文始发于微信公众号(信安之路):PC微信逆向:分析通用设置数组
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论