PC微信读取微信好友列表(联系人)

多态潮涌
• 阅读 3505

开篇

PC微信端读取联系人有三种常规方法:

  1. hook相关call来实现拦截联系人数据
  2. 读取内存中的包含联系人的二叉树结构
  3. 解密读取微信本地数据库

其实前两种方法只是利用微信启动后已经读取联系人放到内存。第一种是拦截过程,第二种是直接获取内存的结果。

第一种方法

找CALL请看:https://blog.csdn.net/qq_3847...

我就不复述了,我也是小白,也是一步一步按照博客来操作的。我就直接给当前最新版本(2.8.0.121)的需要hook的地址偏移:0x479F07,如果不想自己找CALL的话,可以直接用OD跳转到 WeChatWin.dll + 0x479F07 这个地址。已经知道需要hook的地址,只需要用c++写dll然后注入到微信进程就可以得到所有的联系人信息了(这个call会在登录时被调用多次,所以需要登录前就注入dll)

成品软件和dll(软件是用aardio写的,dll是用c++写的):https://www.lanzous.com/iakfpch

效果图:
PC微信读取微信好友列表(联系人)

第二种方法

相比于第一种方法,这个更简单,连写dll注入都不需要。只要读内存中的数据就行。

首先我们需要找到二叉树的根节点地址,方法请看:https://www.jianshu.com/p/b55... (环境声太吵,人说话声音有点小,不过讲的不错)

最新版本(2.8.0.121)二叉树根节点的地址:[[WeChatwin.dll + 0x161CF54]+0x28+0x84] + 0x4,中括号表示取地址里面的值。这个地址的偏移也是通过第一个方法的call找出来的,而且第一个方法中的call进去的代码就是通过传入的wxid来循环遍历二叉树来获取该wxid对应的好友数据。

我们看一下call里面的汇编代码段:
PC微信读取微信好友列表(联系人)
然后用aardio来实现就是:

import process;
import console;

getBTree = function(prcs, esi){  //前面不加var表示全局变量
    if (!prcs.readNumber(esi + 0xD, "byte")){  //cmp byte ptr ds:[esi+0xD],0x0
        //wxid
        wxidAddr = prcs.readNumber(esi + 0x10) //获取wxid地址
        wxidLen = prcs.readNumber(esi + 0x14)  //获取wxid长度
        wxid = prcs.readStringUtf16(wxidAddr, wxidLen) // 读取Unicode字符串
        wxid = string.fromUnicode(wxid)   //将Unicode字符串转换为utf-8
        //微信号
        微信号地址 = prcs.readNumber(esi + 0x44)
        微信号长度 = prcs.readNumber(esi + 0x48)
        微信号 = prcs.readStringUtf16(微信号地址, 微信号长度)
        微信号 = string.fromUnicode(微信号)
        //昵称
        昵称地址 = prcs.readNumber(esi + 0x8C)
        昵称长度 = prcs.readNumber(esi + 0x8C + 0x4)
        昵称 = prcs.readStringUtf16(昵称地址, 昵称长度)
        昵称 = string.fromUnicode(昵称)
        //备注
        备注地址 = prcs.readNumber(esi + 0x78)
        备注长度 = prcs.readNumber(esi + 0x78 + 0x4)
        备注 = prcs.readStringUtf16(备注地址, 备注长度)
        备注 = string.fromUnicode(备注)
        //v1
        v1Addr = prcs.readNumber(esi + 0x58)
        v1Len = prcs.readNumber(esi + 0x5C)
        v1 = prcs.readStringUtf16(v1Addr, v1Len)
        v1 = string.fromUnicode(v1)
        //未知a1
        a1Addr = prcs.readNumber(esi + 0xCC)
        a1Len = prcs.readNumber(esi + 0xD0)
        a1 = prcs.readStringUtf16(a1Addr, a1Len)
        //未知a2
        a2Addr = prcs.readNumber(esi + 0xE0)
        a2Len = prcs.readNumber(esi + 0xE4)
        a2 = prcs.readStringUtf16(a2Addr, a2Len)
        console.writeText(string.format("%s | %s | %s | %s", tostring(wxid), tostring(微信号), tostring(昵称), tostring(备注)) + '\n')
        
        左节点地址 = prcs.readNumber(esi)
        getBTree(prcs, 左节点地址)
        右节点地址 = prcs.readNumber(esi + 0x8)
        getBTree(prcs, 右节点地址)
        
    }
}


var readData = function(){
    console.open()
    prcs = process.find("WeChat.exe")
    if (null == prcs){
        console.writeText('未找到微信进程,请先打开微信登录后操作!')
        return
    }
    wechatwinAddr = prcs.getModuleBaseAddress('WeChatWin.dll')
    ecx = prcs.readNumber(wechatwinAddr + 0x161CF54) + 0x28 + 0x84
    ebx = prcs.readNumber(ecx)     //mov ebx,dword ptr ds:[ecx]
    esi = prcs.readNumber(ebx + 0x4) //mov esi,dword ptr ds:[ebx+0x4] esi也就是二叉树的根节点
    getBTree(prcs, esi)
    console.pause('按任意键关闭!')
}
readData()

汇编代码中做了很多比较,是因为它要对比传入的微信ID和内存中的数据,而我们全都要则不需要对比,直接递归读取二叉树的左右节点即可。效果就不放了,自己下载aardio运行一遍就行。

点赞
收藏
评论区
推荐文章
李志宽 李志宽
4年前
❤超级牛批,暴力破解聊天记录文件 ❤
前言:在电子取证过程中,也会遇到提取PC版微信数据的情况,看雪、52破解和CSDN等网上的PC版微信数据库破解文章实在是太简略了,大多数只有结果没有过程。经过反复试验终于成功解密了数据库,现在把详细过程记录下来,希望大家不要继续在已经解决的问题上过度浪费时间,以便更投入地研究尚未解决的问题。通过查阅资料得知,与安卓手机版微信的7位密码不同,PC版微信的密码是
微标题信公众号文章,阅读数,点赞数历史文章抓取
微标题信公众号文章,阅读数,点赞数历史文章抓取需求最近在做舆情与微信文章相关的数据抓取,发现微信公众号有些难点很难克服。市面上流行的数据抓取思路要么被腾讯封杀,要么操作难度大。解决方案搜狗微信无法采集历史,而且搜索也不按时间排序。获取的数据的价值不高,仅仅可以通过他获取公众号的biz。微信公众平台微信公
Easter79 Easter79
3年前
three.js
第1章课程介绍介绍了微信小游戏的概念以及相关的由来,从宏观上对于微信小游戏的定位和价值有一个明确的认识第2章微信小游戏平台与特性讲了微信小游戏平台的相关特性,包括微信小游戏工程的建立,微信小游戏开发工具的详细使用,以及微信小游戏相关API的实战等第3章THREEJS与WebGL核心概念通过理论和实战,讲解了什么是webgl、什
Stella981 Stella981
3年前
Chrome扩展推荐:微信变弹幕,追剧也不错过新消息
!(https://oscimg.oschina.net/oscnet/0d0a4825f8c04848a39a1b965e4a19f2.png)微信弹幕虽然微信网页版可以让用户在使用电脑上网时减少查看手机的频率,但不管是微信网页版还是PC客户端,都有它的不便之处。缺少了手机顶部通知栏类似的功能,我们在用电脑登陆微
Stella981 Stella981
3年前
Python微信机器人
Python微信机器人本文目录一简介二登录微信三微信好友男女比例四微信好友地域分布五微信聊天机器人一简介wxpy基于itchat,使用了Web微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信登录、收发消息、搜索好友、数
Stella981 Stella981
3年前
Linux下电骡aMule Kademlia网络构建分析4
aMule中联系人的管理aMule中主要通过CContact,CRoutingBin和CRoutingZone这样几个类来管理它的联系人。CContact表示一个联系人,它包含了与一个联系人有关的所有的信息,这个类的对象可能是根据从文件中读出来的信息创建的,也可能是根据其它节点发送的连接请求中的信息创建的。CRoutin
Stella981 Stella981
3年前
Outlook365(Oulook2016 或2013) 写邮件输入收件人时的推荐联系人如何清理?
·在Outlook365(Oulook2016或2013)中写邮件,输入收件人邮箱地址时,会出现“最近联系人” “其他建议”等推荐的联系人,可以方便选择。如果里面有很多邮箱地址的已经无效的话,就需要清理这些缓存联系人列表了。Outlook中自动缓存的联系人该怎么清除?Outlook在输入联系人的时候,发现下拉有很多推荐的联系人,一不小心就弄
Wesley13 Wesley13
3年前
R语言 以打开文件的方式设置数据读取路径
直接运行下代码前两行,然后在本地选择你要读取的数据文件,然后运行第三行,即可成功读取数据。csvpath<file.choose()!(https://oscimg.oschina.net/oscnet/c180866ce0f95eee8b0c0520168dd71aa69.png)本文分享自微信公众号数据驱动实践(Data
使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队
业务场景二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠。使用场景及功能:微信小程序生成海报图片分享好友下载图片使用技
流浪剑客 流浪剑客
1年前
微信伴侣WechatTweak for mac v3.8.5中文集成版 支持M1
微信小助手故障之后如何实现微信多开和微信防撤回免认证功能呢?这里小编为大家推荐另外一款非常不错微信多开助手微信伴侣WechatTweak,微信伴侣WechatTweak功能就比较简单直接,主要包括防撤回、多开、免二次认证登录和消息处理增强。下载:
流浪剑客 流浪剑客
1年前
微信伴侣WechatTweak for mac(微信防撤回、多开助手)v3.8.5中文集成版
微信小助手故障之后如何实现微信多开和微信防撤回免认证功能呢?这里小编为大家推荐另外一款非常不错微信多开助手微信伴侣WechatTweak,微信伴侣WechatTweak功能就比较简单直接,主要包括防撤回、多开、免二次认证登录和消息处理增强。下载:
多态潮涌
多态潮涌
Lv1
温和纯粹的小孩是永远的彼得潘。
文章
2
粉丝
0
获赞
0