hook 微信3.5.0.46的信息接收call,并写Dll

使用工具

wechat版本3.5.0.46

Cheat Engine 简称ce

吾爱破解[LCG] 简称od

Visual Studio的c++

第一步查找收消息的内存

先用ce加载wechat程序,再在“数值类型”中选择“字符串”选项,在’数值’这个选项里写上你发的内容,我收到的是“123‘,按”新的扫描“这时我们看到的结果很多,没关系,再次输入你再次收到的消息内容,选”再次扫描“,结果会大幅减少,反复这样操作,直到结果数量不变为止,然后把得到的结果都拉下来。

然后我们要挑选真正存消息的内存地址,这样我们选择打开”查看内存“选项,要在对话框中的显示内存信息的地方点一下,随便点哪里(要不然直接按CTRL+G去搜索会搜上半部分的汇编内容的,而我们要看的地方却不变)

现在我们找到了储存消息的地址是0x 0CA34683

第二步找收消息的call

command的内容输入完后多按几次回车键等地址中出现和你输入的地址对等的地址即可。

然后选中这个地址(0x 0CA34683)并按鼠标反键,点击”断点“ ,点击”内存写入“。

再次给自己发消息,od就会自己断下来,之后我们就要在刚刚的地址地方(0x 0CA34683)按鼠标反键,点击”断点“ ,点击”删除断点“。接下来就可以在堆栈里向下寻找我们要的消息储存地址,准确的说叫消息的结构体的存放地址。

我们依次在堆栈的窗口中选中地址并在鼠标反键 的弹出菜单中选择”数据窗口中跟随“这个选项,如果没有这个选项,那就找下一个地址去点,如果在点击后左侧框中的第一排地址的”注释“里没有看到你发的消息内容(我发的是789)并且你继续点鼠标反键的菜单中继续出现”数据窗口中跟随“这个选项,你就继续点击追进去看,如果一直追了2到3次还没有找到你要看的消息,就可以放弃这个地址,继续在堆栈里选择下一个地址进行上面的操作,直到找到为止。(你可以在堆栈里标有带”返回到WechatWi.xxxxxxx“这种字样的附近找,这样效率高一些)

然后在我们发现已经找到结构体后,就要在堆栈里向上点击离 这个地址最近的”返回到WechatWi.xxxxxxx“,并点击反键在弹出的窗口中选择”反汇编窗口中跟随“,在左上角的窗口中选择上方最近的call的地方下断(就是点中这个call按F2)

然后你按上面那个三角形的符号把这段内容放过去,然后再给自己发消息,看看会不会断下来,但是结果我们刚刚找的这个call,在我们还没发消息的时候自己也会断,说明不合适,我们需要继续在堆栈里向下方寻找这种能提供消息结构体的地址附件的”返回到WechatWi.xxxxxxx“,

接下来又找了5-6个正确结构体但附近的call都是不合适的用来hook,终于找到了,选这个call的理由是只有收消息的时候这个call才会断下来,并且断下来后他的寄存器里的edi最后指向的内容就是消息结构体(看寄存器的方法就是点击要看的寄存器的地址然后点反键选”数据窗口中跟随“,让然后在左下角的窗口中选中地址一直用这个”数据窗口中跟随“选项追下去,就可以看见最后是什么)

其中这里有个小技巧,就是向看选中项上级的call,可以在汇编语言框里向上拉 直到看到int3的标识出现,然后在int3下面的这个汇编命令下断比如这里的push ebp,然后点击三角形图标,放过这段程序,再发消息时就会断下来,在堆栈里的第一排”返回到WechatWi.xxxxxxx“选中并使用”反汇编窗口中跟随“就可以找到上一级的call,反复上面的操作找到的call就可以一级级的上升。

第三步计算hook这个call的地址,

hook的地址=5924AE14-WeChatWin.dl的地址

WeChatWin.dl的地址在这里e里面找

WeChatWin.dll+0x620597 hook的地址

WeChatWin.dll+0x62059C 回去的地址

5924AE14 E8 37B8C1FF call WeChatWi.58E66650 ; 就是这个call

37B8C1FF的计算方法是58E66650-5924AE14-5=0xFFC1B837

所以公式就是 偏差值=要跳转的地址-当前的地址-5

为什么是5呢, 因为这个代码E8 37B8C1FF正好占用5个字节,之所以要减5可能和cpu指针读取命令时要读完这5个字节的命令才进行跳转,所以跳转的过程是从58E66650开始读完5个字节的跳转命令后开始跳到新的地点,就是58E66650+5+代码里的偏差值(这段内容是我个人猜测)

E8 37B8C1FF中的37B8C1FF和结果0xFFC1B837看起来不一样,其实一样,就是把结果一个字节一个字节的倒着放进去,之所以倒着放好像和大端小端有关系,不太清楚

这里补充一个知识点,我们之所以用偏差值来进行计算,是因为在内存中程序每次运行的时候代码被分配到的地址是不一样的,但代码和代码之间的相对位置是保持不变的,所以每次我们用WeChatWin.dll的地址作为基础值,进行WeChatWin.dll+偏差值进行修正能得到正确的数据地址了,下面是两次运行程序出现地址的变化和偏差值不变的表现

在edi追出来的地方上下拉可以找到消息发送者wxid,消息内容,消息类型,如果是群聊消息会有群id,还有类似md5

第四步就是敲代码了:我自己的代码给大家参考一下。

经验分享 程序员 微信小程序 职场和发展