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

查看 80|回复 9
作者:鬼手56   
[TOC]
前言


1589518511979.png (18.86 KB, 下载次数: 1)
下载附件
2020-5-15 14:39 上传

微信版本2.8.0.121


1589518518925.png (35 KB, 下载次数: 0)
下载附件
2020-5-15 14:39 上传

分析诉求->通过代码实现关闭微信通用设置里的“有更新时自动升级微信"。
通用设置切入点
这种复选框的设置无非就是一个标志位的问题,分析起来比较简单,中间肯定会涉及到一些数据结构。作为开发者肯定不会把每一个设置选项都单独存放,而是放在一个数据结构里方便管理。
首先用CE附加微信


1589518604802.png (141.84 KB, 下载次数: 1)
下载附件
2020-5-15 14:39 上传

在取消勾选状态下搜索0


1589518723872.png (153.4 KB, 下载次数: 1)
下载附件
2020-5-15 14:40 上传

在勾选状态下搜索1


1589518861178.png (156.18 KB, 下载次数: 1)
下载附件
2020-5-15 14:40 上传

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


1589518985095.png (97.68 KB, 下载次数: 2)
下载附件
2020-5-15 14:40 上传

然后在这个地址上下内存写入断点,并且让程序断下
分析通用设置数据结构


1589519035061.png (211.25 KB, 下载次数: 1)
下载附件
2020-5-15 14:41 上传

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


1589519157997.png (159.2 KB, 下载次数: 0)
下载附件
2020-5-15 14:41 上传

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


1589519266696.png (161.24 KB, 下载次数: 1)
下载附件
2020-5-15 14:41 上传

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


1589519384916.png (88.34 KB, 下载次数: 0)
下载附件
2020-5-15 14:41 上传

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


1589519469940.png (133.35 KB, 下载次数: 1)
下载附件
2020-5-15 14:41 上传

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


1589519593166.png (161.59 KB, 下载次数: 0)
下载附件
2020-5-15 14:41 上传

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


1589519760136.png (227.9 KB, 下载次数: 1)
下载附件
2020-5-15 14:42 上传

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


1589519946243.png (136.64 KB, 下载次数: 0)
下载附件
2020-5-15 14:42 上传

这里ecx来自于[edi+0x4],[edi+0x4]就是数组首地址
基址=[[edi+0x4]]+0x8
这里就要修改一下这个偏移表达式了
基址=[[edi+0x4]+i*0x4]+0x8
接下来确定数组下标


1589520408586.png (217.74 KB, 下载次数: 1)
下载附件
2020-5-15 14:42 上传

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


1589520234667.png (176.69 KB, 下载次数: 1)
下载附件
2020-5-15 14:42 上传

当下标为4时,这个结构体数组指向我们要找的标志位
基址=[[edi+0x4]+4*0x4]+0x8
继续往上追edi


1589520511117.png (87.51 KB, 下载次数: 1)
下载附件
2020-5-15 14:42 上传

edi来自[esi+0x4]
基址=[[[esi+0x4]+0x4]+4*4]+0x8
往上找esi


1589520569797.png (150.63 KB, 下载次数: 0)
下载附件
2020-5-15 14:43 上传

esi来自ecx
基址=[[[ecx+0x4]+0x4]+4*4]+0x8
返回上层函数追ecx


1589520621272.png (106.92 KB, 下载次数: 1)
下载附件
2020-5-15 14:43 上传

ecx来自edi


1589520647105.png (112.71 KB, 下载次数: 1)
下载附件
2020-5-15 14:43 上传

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


1589520697388.png (102.49 KB, 下载次数: 1)
下载附件
2020-5-15 14:43 上传

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


1589520719725.png (95.92 KB, 下载次数: 1)
下载附件
2020-5-15 14:43 上传

这里我们看到eax来自于一个基址[0x6B706198],到这里,禁止更新的基址就找完了。
分析通用设置数组
接着我们来分析一下整个结构体数组
[[[[0x6B706198]+0x4]+0x4]+i*4]+0x8
整个表达式可以拆分为下面几部分
数组首地址=[[0x6B706198]+0x4]+0x4
数组下标=i*4
偏移=0x8


1589521007967.png (52.04 KB, 下载次数: 1)
下载附件
2020-5-15 14:43 上传

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


1589521153566.png (76.02 KB, 下载次数: 1)
下载附件
2020-5-15 14:44 上传

这里是结构体数组,每一个成员都是一个结构体。再观察下标为4的表达式内容
[[[[0x6B706198]+0x4]+0x4]+4*4]+0x8


1589521205612.png (44.16 KB, 下载次数: 1)
下载附件
2020-5-15 14:44 上传

这里的值为0x69,正好是循环的结束条件,这个应该是类似功能ID之类的唯一标识。另外每一个下标都对应不同的通用设置,这里列出部分
i=2:开启新消息提醒声音
i=3:开启语音和视频通话提醒声音
i=4:有更新时自动升级微信
i=5:热键与其他冲突时提醒
i=6:适用系统缩放比例
这里还会碰到一个很玄学的问题,每台电脑的偏移不一样,比如i=4在我这里是有更新时自动升级微信,在另外一台机器上可能是i=7的时候是这个功能设置。
随机的数组下标
想要解决这个问题,就要回顾之前的代码


1589522312394.png (137.08 KB, 下载次数: 1)
下载附件
2020-5-15 14:44 上传

这一块是整个数组的遍历代码,所有的通用设置都会走这段代码,当勾选开启语音和视频通话提醒声音时,这个功能ID为0x68
0x68:开启新消息提醒声音
0x172:开启语音和视频通话提醒声音
0x69:有更新时自动升级微信
0x6D:保留聊天记录
所以修改通用设置的关键并不是数组下标对应的标志位,这个数组下标是随机的。关键在于功能ID对应的标志位,有点类似Key->Value的组合
功能ID:[[[[0x6B706198]+0x4]+0x4]+i*4]+0x4
标志位:[[[[0x6B706198]+0x4]+0x4]+i*4]+0x8
如果想要修改对应的通用设置,就要先比对功能ID,然后修改ID对应的标志位。到这里,整个通用设置算是分析完成了。

下载次数, 数组

2019想想   

共获进步,谢谢。
鬼手56
OP
  


Hmily 发表于 2020-5-21 23:35
@鬼手56 论坛禁止留群等联系方式,外链里的处理下吧。

已删除外链
小图   

你的名字好像我QQ好友里一个N年没上线的人
佛泫   

2.8的写好了吗
天空の幻像   

这分析不明觉厉啊,厉害
pantherTL   

感谢分享,学习提高,感谢楼主。
po1718   

感谢楼主的分享,打开学习
MC阿虎   

大佬来了,,,
苏晓宇c   

谢谢楼主分享。。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部