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


获取好友列表目前有三种方法,第一种就是二叉树遍历,通过一层一层的往下读取来拿到所有的好友列表。第二种是通过在内存里面找好友的地址列表。第三种就是通过查找微信数据库来获取列表

获取好友列表的切入点

要想获取微信的好友列表,就必须找到微信读取好友列表的地方。突破口在于微信在点击个人名片时,会获取当前联系人的详细信息,然后显示在右侧。

那么我们可以大胆猜测 微信在登陆的时候,需要先调用这个call,循环拿到所有好友的详细信息,然后再显示到右侧

在这里插入图片描述

第一步:我们首先要找到微信获取好友详细信息的函数。这个函数在读取好友列表时必然会被调用,第二步,再通过这个函数找到获取好友列表的地方。

另外还有一种方法就是通过好友的数量,先搜索当前好友的数量,然后删除一个,再次搜索。直到找到保存好友数量的地址。

定位查询好友信息的函数

那么如何找到查询好友信息的函数呢?突破口在于当前窗口的微信号,只要找到微信号的地址,然后对微信号下内存写入断点,栈回溯分析就能找到我们需要的函数。

定位微信号的地址

在这里插入图片描述

首先搜索当前的微信号,勾选Unicode

在这里插入图片描述

接着切换联系人,再次扫描

在这里插入图片描述

最终会剩下五个结果,我们需要逐个排查每一个结果

一次错误的尝试

在这里插入图片描述

随便找一个地址,下内存写入断点。然后切换当前联系人窗口,断点断下。删除内存断点。

我们需要找到一个地址,地址里面包含联系人的所有信息

在这里插入图片描述

在堆栈的地址中我们发现了一个返回地址,返回地址下面有微信的个人数据。那么这个有可能就是我们需要的call

切换当前窗口联系人,等待断点断下

在这里插入图片描述

此时,堆栈和eax寄存器中保存了当前联系人的所有数据

在这里插入图片描述

继续往下拉会发现eax中保存有签名和国家等信息。也就是说这个call里面保存了当前聊天窗口的好友的所有信息。

接着我们删除好友,让好友列表刷新,看看这个地方会不会断下来。如果会断下来,那么这个地方就有可能保存了所有好友的信息。

在这里插入图片描述

删除之后,断点并未断下,那么这个call就不是我们想要的

再次查找目标函数

继续找另外一个地址,下内存写入断点

在这里插入图片描述

此时再次搜索返回地址,你会发现在压入返回地址前的一个参数中有一个完整的好友信息

在这里插入图片描述

这个call将一个完整的好友信息压入堆栈,那么说明这个call之前好友信息已经被查询出来了。我们需要继续往上找, 反汇编窗口跟随这个call

在这里插入图片描述

在函数头部的位置下断点

在这里插入图片描述

等程序断下时在堆栈中找到返回地址

在这里插入图片描述

然后在找到的上一层函数下断点,断下之后按F8单步步过,看看这个函数的作用是什么

在这里插入图片描述

在这个call执行完毕之后,edi里面保存的就是好友的所有信息。那么说明这个call的作用就是查询当前好友的详细信息!

成功定位获取好友信息的函数

接着我们F7进入这个函数,看看好友的详细信息具体是从哪里个函数中查询出来的
在这里插入图片描述

单步到这里我们发现在进入临界区之后有一个函数,这个函数将微信ID的指针压入栈,我们F8步过函数查看一下返回值

在这里插入图片描述

此时eax里保存了当前好友的所有详细信息。通过参数和返回值也就可以猜到这个call的作用是通过微信ID获取详细信息。那么我们第一步就算是大功告成了。

定位获取好友列表的函数

我们重新载入微信,然后在找到的获取好友详细信息的函数下断点

在这里插入图片描述

登录微信,此时断点断下,接着按F8步过

在这里插入图片描述

此时eax寄存器中保存有联系人的数据,这个函数会调用多次,每调用一次查询一个好友信息。

事实上获取好友列表的call不止这一个地方,但是这个地方拿到的数据是最多的。可以拿到所有的好友列表和群列表以及公众号

函数已经找到了,那么我们只要写一个dll,注入到微信的进程空间中,利用Inline HOOK就能获取到所有的好友列表了

示例代码

部分示例代码如下:

开始HOOK:

VOID StartHook(DWORD hookAdd, LPVOID jmpAdd)
{
	BYTE JmpCode[HOOK_LEN] = { 0 };
	//我们需要组成一段这样的数据
	// E9 11051111(这里是跳转的地方这个地方不是一个代码地址 而是根据hook地址和跳转的代码地址的距离计算出来的)
	JmpCode[0] = 0xE9;
	//计算跳转的距离公式是固定的
	//计算公式为 跳转的地址(也就是我们函数的地址) - hook的地址 - hook的字节长度
	*(DWORD *)&JmpCode[1] = (DWORD)jmpAdd - hookAdd - HOOK_LEN;

	//hook第二步 先备份将要被我们覆盖地址的数据 长度为我们hook的长度 HOOK_LEN 5个字节

	//获取进程句柄
	HANDLE hWHND = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId());

	//备份数据
	if (ReadProcessMemory(hWHND, (LPVOID)hookAdd, backCode, HOOK_LEN, NULL) == 0) {
		MessageBox(NULL, "hook地址的数据读取失败", "读取失败", MB_OK);
		return;
	}

	//真正的hook开始了 把我们要替换的函数地址写进去 让他直接跳到我们函数里面去然后我们处理完毕后再放行吧!
	if (WriteProcessMemory(hWHND, (LPVOID)hookAdd, JmpCode, HOOK_LEN, NULL) == 0) {
		MessageBox(NULL, "hook写入失败,函数替换失败", "错误", MB_OK);
		return;
	}

}

显示好友列表

//显示好友列表
VOID insertUserLists(DWORD userData)
{
	/*
	eax + 0x10 wxid 群
	eax + 0x30 wxid 群
	eax + 0x44 微信号
	eax + 0x58 V1数据
	eax + 0x8C 昵称
	eax + 0x11C 小头像
	eax + 0x130 大头像
	eax + 0x144 未知md5数据
	eax + 0x1C8 国籍
	eax + 0x1DC 省份
	eax + 0x1F0 城市
	eax + 0x204 添加来源
	eax + 0x294 朋友圈壁纸
	*/

	DWORD wxidAdd = userData + 0x10;
	DWORD wxuserIDAdd = userData + 0x44;
	DWORD wxidV1Add = userData + 0x58;
	DWORD wxNickAdd = userData + 0x8C;
	DWORD headPicAdd = userData + 0x11C;
	//DWORD wxNickAdd = userData + 0x8C;
	
	wchar_t wxid[0x100] = {0};
	if ((LPVOID *)wxidAdd) {
		swprintf_s(wxid, L"%s", *((LPVOID *)wxidAdd));
	}

	wchar_t nick[0x100] = { 0 };
	if ((LPVOID *)wxNickAdd) {
		swprintf_s(nick, L"%s", *((LPVOID *)wxNickAdd));
	}
	
	wchar_t wxuserID[0x100] = { 0 };
	if ((LPVOID *)wxuserIDAdd) {
		swprintf_s(wxuserID, L"%s", *((LPVOID *)wxuserIDAdd));
	}
	

	if (oldWxid[0] == 0 && newWxid[0] == 0) {
		swprintf_s(newWxid, L"%s", *((LPVOID *)wxidAdd));
	}

	if (oldWxid[0] == 0 && newWxid[0] != 0) {
		swprintf_s(oldWxid, L"%s", newWxid);
		swprintf_s(newWxid, L"%s", *((LPVOID *)wxidAdd));
	}

	if (oldWxid[0] != 0 && newWxid[0] != 0) {
		swprintf_s(oldWxid, L"%s", newWxid);
		swprintf_s(newWxid, L"%s", *((LPVOID *)wxidAdd));
	}

	if (wcscmp(oldWxid,newWxid) != 0) {

		LVITEM item = { 0 };
		item.mask = LVIF_TEXT;

		item.iSubItem = 0;
		item.pszText = UnicodeToANSI(wxid);
		ListView_InsertItem(gHwndList, &item);
		wxuserID
		item.iSubItem = 1;
		item.pszText = UnicodeToANSI(wxuserID);
		ListView_SetItem(gHwndList, &item);

		item.iSubItem = 2;
		item.pszText = UnicodeToANSI(nick);
		ListView_SetItem(gHwndList, &item);
	}
}

实际效果

在这里插入图片描述

预告

最后,预告下一期,我的微信助手成品即将完成,现已完成大部分功能,再添加几个功能就全部完成了,届时将开放成品和所有源代码

在这里插入图片描述

目前微信机器人的成品已经发布,需要代码请移步Github。还请亲们帮忙点个star

https://github.com/TonyChen56/WeChatRobot

  • 37
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: Python钩子微信是一种使用Python编程语言编写的程序,用于检测和捕获微信应用程序的输入和输出,并进行处理和操作。该程序可以用于自动发送和接收微信消息,拦截和修改微信消息,获取微信用户信息以及实现其他自定义功能。要实现Python钩子微信,需要了解微信应用程序的工作原理和API,以及Python的基本编程知识和技能。在编写程序时,需要使用第三方库和工具,例如itchat、pymouse、pyHook等。通过这些工具,可以轻松地编写Python钩子微信程序,并实现自己想要的功能。但是需要注意,在编写程序时,应遵守微信的相关规定和条例,不得用于非法或未经授权的用途。除此之外,在编写钩子程序时,还应注意安全问题,避免损坏计算机系统或容易出现安全漏洞。总之,Python钩子微信是实现微信自定义功能的一种有效方法,但需要在充分了解微信API和Python编程基础的基础上进行。 ### 回答2: Python hook PC微信,也就是通过Python程序来对PC版的微信进行一些自定义的操作。首先需要了解的是,PC微信是一个Windows平台的桌面应用程序,而Python是一种高级编程语言,可以通过一些模块和库来实现对PC微信的控制和管理。 要实现钩取(hookPC微信,需要使用到相关的模块和包,比如pyHook、keyboard、ctypes等。其中,pyHook是一个Python钩子模块,它可以捕获各种Windows事件,如键盘鼠标事件等。而keyboard则是另一个Python模块,它也可以用于监测和记录键盘事件。最后,ctypes是一个Python模块,用于调用或操作Windows中的DLL、API以及C的库。 钩取PC微信主要可以实现以下几个方面: 1. 监测和记录键盘事件 通过使用pyHook、keyboard等模块,可以在Python程序中监测和记录PC微信中的各种键盘事件,比如输入字符、快捷键等。这可以方便地实现自动回复、自动切换聊天窗口等功能。 2. 控制和管理PC微信窗口 通过使用ctypes,在Python程序中可以调用Windows API函数,比如FindWindow、SetWindowPos等,来实现对PC微信窗口的控制和管理,比如改变窗口大小、位置,最小化窗口等。 3. 实现自动化脚本 通过以上两个方面的应用,可以实现对PC微信的自动化控制和管理。比如可以编写Python脚本,使其自动监测PC微信中的消息,自动回复、发送消息,或者进行一些其他操作等。 总之,Python hook PC微信可以为我们带来很多便利和效率,在实际应用中也有很多种可能,比如在聊天机器人、自动化聊天、消息推送等方面都有着广泛的应用。 ### 回答3: Python Hook PC微信,简单来说就是使用Python编写程序完成对PC微信软件的钩子(hook)功能。钩子是一种编程技术,可以监视计算机的特定活动,并在特定事件发生时触发自定义功能。 对于PC微信软件而言,可能存在一些无法实现的需求,或者需要对其界面进行改进等情况。这时,我们可以使用Python编写程序,来完成对微信软件的钩子,实现我们想要的效果。 具体来说,Python Hook PC微信可以通过以下步骤实现: 1. 导入Python的ctypes库,用于调用Windows的API函数。 2. 使用WinAPI获取微信的句柄(handle),并将其与Python中的句柄绑定。 3. 使用WinAPI获取微信窗口中的各种控件,包括菜单、列表、文本框、按钮等。 4. 对这些控件进行钩子操作,比如监控鼠标和键盘事件,或者改变控件的样式、位置、大小等。 5. 根据需要编写自己的功能,比如监听微信收到新消息的通知,自动回复消息,或者改变接收到的消息格式等。 需要注意的是,钩子的实现需要一定的编程技巧和经验,同时也具有一定的安全风险。在实际编写过程中,应当按照规范操作,避免对微信软件及其用户造成损害。此外,Python Hook PC微信也有一定的局限性,可能会受到微信版本升级、系统环境变化、安全策略影响等问题。因此,我们需要在编写程序前进行足够的研究和测试,以确保可靠性和稳定性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼手56

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值