文章目录

  • 前言
  • 基于保存语音的相关延伸
  • 图片处理的相关流程
  • 自动保存图片相关思路
  • 实战保存聊天图片
  • 对保存图片call的相关分析
  • 代码实现保存聊天图片
  • 实际效果
  • 项目地址

前言

本文基于anhkgg大佬的文章《微信PC端技术研究(2)-拿下语音》原文链接:https://bbs.pediy.com/thread-249274.htm

anhkgg大佬的这篇文章找到了保存语音消息的接口,这里直接给出相关特征码,方便定位(我使用的微信版本依旧是2.6.8.52)

偏移为0x30E326,下面的特征码

67E3E319    C745 FC 0100000>mov dword ptr ss:[ebp-0x4],0x1
67E3E320    FF77 34         push dword ptr ds:[edi+0x34]             ; 长度
67E3E323    FF77 30         push dword ptr ds:[edi+0x30]             ; 内容
67E3E326    E8 85F07300     call WeChatWi.6857D3B0
67E3E32B    8D85 58FFFFFF   lea eax,dword ptr ss:[ebp-0xA8]
67E3E331    50              push eax
67E3E332    E8 090E0000     call WeChatWi.67E3F140
C745 FC 01000000 FF77 ?? FF77 ?? E8 ???????? 8D85 ???????? 50 E8 ????????

基于保存语音的相关延伸

其实这个地方不单单有语音消息,还有图片消息,当我们发送一条图片消息时

[edi+0x30]的内容里面保存有这一次发送图片的相关数据,包括微信ID等一系列原始的数据。我们当然可以在这个地方写HOOK来保存图片,但是没有必要。因为这里的消息内容过多,处理起来相对会比较麻烦。

图片处理的相关流程

既然这个地方是最原始的消息内容,那么后面肯定会对消息进行相关处理。而且我们已经知道微信的接收的图片会用异或加密的方式保存到本地。那么我们不妨猜测一下图片相关的处理流程。

首先接收到原始的消息后,会对消息进行一系列的处理,其中就包括判断消息是否是图片。那么如果是图片则会取出图片数据,然后在内存中对图片进行加密。加密完成之后调用文件操作的API,写入加密后的图片到本地。

整个过程如图所示:

自动保存图片相关思路

既然了解图片处理的流程,而且已经有了接收图片消息的call,那么我们就可以在接收到图片消息之后,在CreateFileW创建图片之前,找到对图片进行加密的算法和函数,将未加密前的图片保存出来。

实战保存聊天图片

在OD中找到保存语音的call,发送图片消息让程序断下的同时,对CreateFileW进行下断。之后F9运行

此时文件路径为xlog,这个明显不符合我们的要求,继续F9运行

一直找到图片路径带有Image关键字时,在创建图片

此时我们点击K显示堆栈,找到第一层返回地址,右键显示调用

当微信运行到这里的时候,图片加密已经完成,我们要在这个函数之前找到图片的加密算法,其实就在上面一点点的位置,鼠标稍微往上翻一下就能看到

找到这个地方之后清除剩下的所有的断点,只保留这一个

对保存图片call的相关分析

再次发送一张图片,程序断下。这段代码首先用循环的方式对图片进行加密,循环的次数即ecx的值,也就是图片的大小。其中有两个数据比较重要。

我们先在内存中查看[ebp-0x14]的内容,想要知道这段数据是什么其实很简单。先下CreateFileW断点

当CreateFileW断点断下后,执行到返回,查看打开的文件句柄

此时打开的图片句柄为0xF80,此时再下WriteFile断点

WriteFile断下后可以看到句柄为F80,写入的缓冲区地址为39FE820,而[ebp-0x14]的地址正好也是39FE820。也就是说[ebp-0x14]这个位置保存的是加密后的图片数据

回到之前的断点,再次发送一张图片,查看[ebp-0x4]的数据


此时[ebp-0x4]中保存了接收的图片,而ecx保存了图片的大小

这里借用PCHunter查看->进程内存,将这一段数据dump下来


问题就在于这里只是一张大小为4KB的缩略图,回到OD,再次按F9运行

断点断下,但是此时ecx的值变成0x5A140

用同样的方法dump下内存,大小为360KB,这个就是我们需要的原图了。

也就是说这个地方会端下来两次,第一次是缩略图,第二次才是我们要的原图。

代码实现保存聊天图片

示例代码如下:

void HookSaveImages()
{DWORD dwBaseAddress = (DWORD)GetModuleHandle(TEXT("WeChatWin.dll"));//需要hook的地址SaveImageAddress = dwBaseAddress + SaveImages;//跳回的地址SaveImageAddressBackAddress = SaveImageAddress + 5;//组装跳转数据BYTE jmpCode[5] = { 0 };jmpCode[0] = 0xE9;//计算偏移*(DWORD*)& jmpCode[1] = (DWORD)FnSaveImages - SaveImageAddress - 5;// 保存以前的属性用于还原DWORD OldProtext = 0;// 因为要往代码段写入数据,又因为代码段是不可写的,所以需要修改属性VirtualProtect((LPVOID)SaveImageAddress, 5, PAGE_EXECUTE_READWRITE, &OldProtext);//写入自己的代码memcpy((void*)SaveImageAddress, jmpCode, 5);// 执行完了操作之后需要进行还原VirtualProtect((LPVOID)SaveImageAddress, 5, OldProtext, &OldProtext);
}
__declspec(naked) void FnSaveImages()
{__asm{mov ebx, dword ptr ss : [ebp - 0x4];mov ImageData, ebx;mov ImageDataLen, ecx;pushad;pushfd;}//调用接收消息的函数FnSaveImagesCore();//恢复现场__asm{popfdpopad//跳回被HOOK指令的下一条指令jmp SaveImageAddressBackAddress;}
}
void FnSaveImagesCore()
{//如果图片长度大于10KB则保存if (ImageDataLen >= 10240){//获取临时文件夹目录char temppath[MAX_PATH] = { 0 };GetTempPathA(MAX_PATH, temppath);char imagedir[20] = { "WeChatRecordImages" };//拼接目录char WeChatExpressionsPath[MAX_PATH] = { 0 };sprintf_s(WeChatExpressionsPath, "%s%s\\", temppath, imagedir);//创建目录存放图片CreateDir(WeChatExpressionsPath);//保存图片CreateFileWithCurrentTime(WeChatExpressionsPath, (char*)".jpg", ImageData, ImageDataLen);}
}

实际效果

项目地址

最后附上我的微信机器人项目地址:

https://github.com/TonyChen56/WeChatRobot

PC微信逆向:实现自动保存加密的聊天图片相关推荐

  1. 图片句柄_PC微信逆向:自动保存加密的聊天图片

    前言 本文基于anhkgg大佬的文章<微信PC端技术研究(2)-拿下语音>原文链接:https://bbs.pediy.com/thread-249274.htm anhkgg大佬的这篇文 ...

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

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

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

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

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

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

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

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

  6. vc++ PC微信 逆向HOOK接口

    企业微信项目地址: https://github.com/smallevilbeast/wxwork_pc_api wechat_pc_api 使用HOOK技术将核心功能封装成dll,并提供简易的接口 ...

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

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

  8. PC微信逆向:分析发送xml名片call

    文章目录 微信版本 定位发送xml名片call 发送xml名片call的切入点 定位选择联系人的call 定位发送xml名片的call 定位接收者的微信ID 定位发送xml名片的call 验证发送xm ...

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

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

最新文章

  1. 是否有可能从python中的句子语料库重新训练word2vec模型(例如GoogleNews-vectors-negative300.bin)?
  2. mysql 12安装教程下载_MySQL 8.0.12.0安装教程
  3. 犹太人从未透露的12个秘密(图)
  4. MyBatis在Oracle中插入数据并返回主键的问题解决
  5. Java-数组的使用
  6. [ios]iOS模拟器应用程序目录结构
  7. 更改计算机用户名后无法共享文件夹,怎样使文件夹不被共享
  8. Oracle Rownum 伪列详解
  9. 零基础带你学习MySQL—MySQL常用的数据类型(列类型)(五)
  10. 『PyTorch』第十五弹_torch.nn.Module的属性设置查询
  11. apache配置Options详解
  12. 从零开始搭建我的网上商城 - Pika商城
  13. 【工控老马】基于MODBUS协议的上位机与PLC及智能仪表之间的通信实现方法
  14. windows xp 下载老版本的chrome浏览器
  15. ES6 Javascript Nodejs Mindmap
  16. 主题: 编译工具配置出现的问题总结
  17. 国际数字文创产业园区助力成都打造文创名城
  18. android-23是什么手机,Android 8.1!首款helio P23/MT6763T手机曝光!
  19. 2016计蒜之道初赛第一场----A青云的服务器密钥【贪心】
  20. 资源收集贴(持续更新...)

热门文章

  1. 深度学习(Deep Learning)算法简介
  2. 微信常见问题汇总及解决方案
  3. 计算机在未关机的情况下重启,系统已在未先正常关机的情况下重新启动。游戏就断电重启。...
  4. 达梦数据库常用sql语句大全
  5. 高以翔突然离世:没有一份工作,值得你拿命去拼
  6. java指令大全,Vi 指令大全[转载]
  7. 归纳常见几种下载文件方式
  8. lsof交叉编译_lsof交叉编译 | 学步园
  9. centos7上用nginx安装nextcloud(PHP72)
  10. python中常用的内置函数,可迭代对象,迭代器对象