微信hook消息接收

微信版本:3.9.12.45

账号:两个微信账号,大号用来发消息,小号用来测试

工具:微信、CE修改器、x64dbg

微信版本

定位消息地址

选择微信进程

选择微信进程

大号给小号发送消息,扫描类型选择字符串,数值填写消息内容

请输入图片描述

重复之上的步骤,不断重复,直到无法定位的时候(我这里有三个),一个个查看浏览器内存区域

请输入图片描述

找到带着wxid和xml格式的就是内存地址

请输入图片描述

请输入图片描述

x64dbg断点

记录一下当前的微信地址1B6555E11BD,关闭CE修改器,打开x64dbg,附加微信,按住alt+e选择wechatwin.dll

请输入图片描述

点进去,再内存窗口搜索刚才记录的地址

请输入图片描述

设置写入断点

请输入图片描述

此时微信大号给小号发送消息,查看堆栈信息

请输入图片描述

找到有个db的那个(这一步骤是再写入微信数据库之前定位call)

请输入图片描述

选择,右键“在反汇编中转到指定QWORD”

请输入图片描述

跳转之后,先取消上一个断点

请输入图片描述

然后针对跳转的位置,找到上一个call位置,在call处进行断点

请输入图片描述

发送消息,断点到了,查看RDI

请输入图片描述

请输入图片描述

在地址栏的第一个双击一下

请输入图片描述

这样我们可以得出

0x48 是 微信id

0x88 是 微信消息的内容

计算偏移

找到断点位置,复制文件偏移

请输入图片描述

然后打开计算器那个图标,用偏移地址+C00

请输入图片描述

得出结果250AEA7

验证结果

找到断点位置,复制地址

请输入图片描述

然后按住ALT+E,找到复制wechatwin.dll的基址

请输入图片描述

用计算器两者相减得出结果250AEA7

请输入图片描述

结果是对的,此时编写frida脚本

var wechatWin = Module.findBaseAddress("WeChatWin.dll");
if (!wechatWin) {
    console.error("WeChatWin.dll模块未找到!");
    throw new Error("模块未找到"); 
}
var hookAddress = wechatWin.add(0x250AEA7);
Interceptor.attach(hookAddress, {
    onEnter: function (args) {
        var timestamp = this.context.rdi.add(0x44).readInt();
        var wxid = this.context.rdi.add(0x48).readPointer().readUtf16String();
        var msg  = this.context.rdi.add(0x88).readPointer().readUtf16String();
        console.log("[++++] "+ timestamp +"    "+ wxid +"  :  "+msg)
    }
});

console.log("Hook已安装,等待接收消息...");

运行脚本

请输入图片描述

发送消息测试

请输入图片描述

最后修改:2025 年 03 月 09 日
如果觉得我的文章对你有用,请随意赞赏