文章目录

  • 写在前面
  • 思路
  • 定位过程
  • 整理
  • 写在后面
  • 免责声明
  • Github

写在前面

微信版本: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

PC微信逆向--获取通讯录相关推荐

  1. PC微信逆向--调用sqlite3_exec执行SQL

    文章目录 写在前面 回顾 sqlite3_exec 回调函数 函数指针 编写代码 注入的DLL 注入程序 输出结果 写在后面 写在前面 上一篇文章,实现了定位保存微信数据库句柄的容器和微信内部的sql ...

  2. PC微信逆向:使用HOOK获取好友列表和群列表

    文章目录 获取好友列表的切入点 定位查询好友信息的函数 定位微信号的地址 一次错误的尝试 再次查找目标函数 成功定位获取好友信息的函数 定位获取好友列表的函数 示例代码 实际效果 预告 获取好友列表目 ...

  3. PC微信逆向--定位sqlite3_exec和数据库句柄

    写在前面 最近在做PC端微信逆向,搞定了基本的收发消息,通讯录获取等,这期间遇到一个小小的问题,从通讯录获取到的内容不全,除非登录后手动点击过某个好友,不然获取不到头像.V3等,所以产生了解密数据库的 ...

  4. PC微信逆向--看看哪些好友删除了自己

    文章目录 写在前面 微信版本 资料 Duilib界面 定位发送CALL 具体原理 关键代码 写在后面 写在前面 搞微信逆向也有一段时间了,实现了发送文本.图片.文件.名片.xml文章消息,以及获取好友 ...

  5. pc微信逆向最新3.9.2.23版本

    最近想做个微信机器人,就研究了pc端的微信逆向,发现网上开源的项目挺多的,但是都是一些老版本的,3.7版本的基本上很少,3.8的更少了,现在3.9版本开源的很少.不过还是发现了两个开源项目,特分享备忘 ...

  6. 【原创】PC微信逆向分析のWeTool内部探秘

    作者:zmrbak(赵庆明老师) 前言: 先不说微信在社交领域的霸主地位,我们仅从腾讯公司所透露的在研发微信过程中踩过的无数的坑,以及公开的与微信相关的填坑的源代码中,我们可以感受到,单从技术上讲,微 ...

  7. PC微信逆向:两种姿势教你解密数据库文件

    文章目录 定位数据库文件密码 定位数据库密钥的思路 获取数据库密钥的实战分析 CreateFileW断点 常见错误 排查堆栈 排查堆栈地址 单步跟踪 用代码实现解密数据库 编译选项 解密代码 实际效果 ...

  8. PC微信逆向:实现自动添加好友分享名片

    文章目录 如何实现自动添加好友分享名片 定位加好友call相关思路 定位微信加好友call 定位加好友call的微信ID 定位微信加好友call 验证加好友call 微信加好友call的分析 添加名片 ...

  9. 微群宝贝里的淘宝客的实现和代码实现 duilib+大淘客API+PC微信逆向

    第一步.先根据大淘客的API接口获取每日推荐的产品. CString strUrl;CWeb html;SENDINFO si;CString strRet, strPostData;strUrl.F ...

最新文章

  1. 倒计时2天!年末最大AI开发者盛典来袭,快来报名
  2. Thrift源码学习二——Server层
  3. 学到了!MySQL 8 新增的「隐藏索引」真不错
  4. 程序员平均月薪过万,想当程序员的话,大学学那些专业会更好呢?
  5. python中pass语句的作用是_Python pass语句以及作用详解
  6. IT必须掌握的面试大全技巧教你怎么回答
  7. C++调用C#编写的DLL【转】
  8. Web 前端视频资源分享(Bootstrap/Vue/小程序)
  9. mysql 系统工程师_数据库系统工程师难考吗?
  10. android远程连接windows,用微软的安卓远程桌面连接电脑没有声音
  11. 10部顶级数学纪录片
  12. Cookie中path总结
  13. 实时网速怎么看快慢_如何知道网络的实时网速?4种方法轻松查询
  14. android 进退分屏代码策略,Android的分屏模式开发注意事项
  15. pthread _cond_wait()函数
  16. 一文带你了解APS生产计划排程系统
  17. Linux查看DNS
  18. 调用百度ocr接口识别表格
  19. Spring Data JPA使用JPQL与原生SQL进行查询
  20. python 下载pip命令

热门文章

  1. 03 - 大学生如何使用GPT
  2. OSChina 周日乱弹 —— 妹子是国家战略资源啊
  3. PAT日志 1028
  4. Java(老白再次入门) - Java集合
  5. 张一鸣:不甘平庸的年轻人 全都有同一个特质
  6. Flutter 官方做了一款游戏,开源的
  7. css 光影掠过文字显现动画
  8. 测试个人禀赋的软件,选出最有食欲的一碗米饭,测你哪方面“禀赋异禀”
  9. 任意十六进制数转换成十进制数----不管你输入多长都能转换
  10. .bxl 格式 转 adtium designer 格式