PC微信逆向--获取通讯录

写在前面

微信版本:3.5.0.46
之前完成了发送文本消息和图片消息功能,但是发送的时候,需要指定对方的wxid,这可不是个简单的事情,毕竟微信给用户看的一般是自定义的微信号,所以需要获取到通讯录,然后根据昵称啊、微信号、备注一类的东西搜索wxid出来。

思路

参考B站up主Hellmessage的视频,指路:Hellmessage
微信登录过程中会同步服务器中的好友列表到内存中,这一块数据以链表形式存在,很少发生变化,只要找到头结点,就能获取到整个通讯录,需要做的是定位头结点的偏移。

定位过程

启动微信,搜索某个好友信息(utf-16),wxid、签名、昵称什么的都可以用,哪个出来的少搞哪个。

然后十六进制搜索该地址,看看是否有保存地址的指针,如下图所示。


在这里插入图片描述


接下来在OD里面查看该地址的数据,往上翻,一直找到wxid数据:


在这里插入图片描述


可能有多个地方保存好友信息,有一个简单的方法可以判断是不是要找的目标,看看unicode类型的wxid上面,有没有一处ASCII类型的wxid,如果有,大概率就对了。

框里圈出来的三个数值,第一个和第二个,是其他的结点(联系人),一直数据窗口跟随,如果好友比较少,很快就能找到结点头,在头部下内存访问断点,接着点击联系人里面的通讯录管理,手动触发断点,如果没有触发,请重新登录微信。
会断在下面这个地方:


在这里插入图片描述


触发断点的寄存器是esi,CPU窗口往上拉,找到esi的来源:


在这里插入图片描述


又指向了[ebp - 0x1C],继续向上:


在这里插入图片描述


这里看到[esi - 0x1C]来自esi,esi来自ecx,继续往上,没有发现ecx的来源,那就在头部下断点(记得删除内存断点):


在这里插入图片描述


这个时候可能点通讯录管理也没办法断下来了,把断点留着,关掉微信,通过OD重启,启动过程中还是会访问这个CALL的,然后堆栈窗口:


在这里插入图片描述


反汇编窗口跟随:


在这里插入图片描述


ecx来自eax,再往上找,eax来自[0x686DD240],此时寄存器是这样的:


在这里插入图片描述


ecx是02DAB3F8,查看686DD240处的数据,如下:


在这里插入图片描述


686DD240就是我们要的地址。

整理

根据寄存器的赋值取值,整理出如下关系:

eax == [0x686DD240]
ecx == eax
esi == ecx
[ebp - 0x1C] == esi
eax == [ebp - 0x1C]
eax == [eax + 0x4C] == 可以理解为二叉树头
esi == [eax] == 左边第一个元素
eax == [esi] == 左边第二个元素

根据WeChatWin.dll基址,得到定位公式:

Executable modules, 条目 90
 基址=66500000
 大小=02624000 (39993344.)
 入口=67A2C59D WeChatWi.<ModuleEntryPoint>
 名称=WeChatWi
 文件版本=3.5.0.46
 路径=D:\WeChat\WeChatWin.dll

二叉树头 == [[WeChatWin.dll + 0x21DD240] + 0x4C]
左边第一个元素 == [ [[WeChatWin.dll + 0x21DD240] + 0x4C] ]
右边第一个元素 == [ [[WeChatWin.dll + 0x21DD240] + 0x4C] + 0x4 ]

读取数据时,从左或右遍历都可以,最后都会回到节点头,如果好友比较多,双向遍历也是可以的。

写在后面

这个地方不只有好友,还有群、公众号,微信团队等,具体怎么区分,没有在数据窗口发现具体的标志,我是根据wxid_,chatroom,gh_来区分的,如果有人找到了区分标志,也麻烦告诉俺一声。


顺便,之前写的COM组件已经添加了获取好友列表并返回给python的接口,写完之后才发现64位进程可以读取32位进程内存数据,早知道直接用python读数了。。

免责声明

文章仅供交流学习使用,请勿用于非法途径,如因此产生任何法律纠纷,与本人无关。

Github

今天搞定了发文件的功能,代码整理了一下上传Github了。
虽然功能不多,但还是想厚着脸皮要一个star。
地址:ComWeChatRobot

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值