获取、导出微信所有表情

前言

适用:PC端微信 2.6.8.51版本
发布于2019年8月25日
本文仅作技术研究

一直在想微信收藏的表情包为什么不能右键另存为到本地
像QQ一样多好,有时候想把微信的表情导入到QQ里面用也不行,多不方便

百度查了一下,都是找CustomEmotions目录下的文件,将后缀名改成gif,貌似已经被和谐了,现在都不管用了

于是就开始研究了一下,发现有个捷径可以将微信里面的收藏所有表情导出,甚至可以把聊天中对方发的表情存下来

开始步入正题

首先就是OD看一波,看看进程都加载了什么模块,能不能从中发现一些信息
在这里插入图片描述

看看加载模块
在这里插入图片描述
首先筛选出与表情相关,最有可能用到模块
WeChatResource.dll 应该是关于资源的,表情好像也跟资源有关吧
WeChatWin.dll 似乎是一个主模块!20多M!比exe还大,估计整个程序的框架主逻辑都在这里面
WXAMDecoder.dll 看名字是跟解密有关的,表情的缓存文件似乎是被加密过了,应该会跟这个有关

接下来开个监控软件,监控一下发表情的时候都有什么文件读写操作
在这里插入图片描述

你会发现微信会打开这些文件名为哈希值的文件,且没有后缀名
随便找一个文件,拖到十六进制里面看看
在这里插入图片描述
你会发现这些文件前面几个字节都是这个标识符:V1MMWX

很明显这些文件的数据都是经过加密的,应该是微信开发人员自定义的文件格式
这时候就可以想到,我们每发一个表情,微信就在本地生成对应的缓存文件,这个缓存文件可能是使用表情加密后生成

那么回到我们刚刚筛选出的那几个模块,其中有一个似乎跟加解密有关的模块:WXAMDecoder.dll

然后我们来看看这个模块都有写什么导出函数
在这里插入图片描述
看见这些导出函数名,是不是心里突然兴奋了一下?似乎还有几个跟图片有关的!
我们来筛选一下
WxAMFrame_delete 框架删除?沾不上关系
WxAMFrame_new 跟框架一对的似乎
wxam_dec_decode_buffer_4 解密buffer,这个有嫌疑!
wxam_dec_getWXGFInfo_4 取用微信gif信息,emmm,是有点远方亲戚关系
wxam_dec_get_option_4 这个应该不是了
wxam_dec_init_4 解密初始化,可以忽略
wxam_dec_isWXGF_4 是否微信的gif,有点远方亲戚关系
wxam_dec_rewind_buffer_4 这个看名字不像
wxam_dec_uninit_4 这个也不像
wxam_dec_wxam2picSeq_4 am转到pic?
wxam_dec_wxam2pic_4 am转到pic?
wxam_dec_wxpc2jpg_4 pc转到jpg?

好吧,有些看着像又不像,先不管了,全部打上断点试一下都会调哪些接口
然后发个表情,马上击中要害
在这里插入图片描述
经验告诉我,首先看堆栈里面传的都是什么
果然不出所料,根据前面几个字节判断,GIF89似乎是gif图片文件的标识符!
这么说第一个是储存表情buff的指针,第二个是size!
为了验证自己的猜想是否正确,来写个小程序把对应的buff dump出来看看是不是图片!
在这里插入图片描述
简单的用易语言写了2行代码,没错,就2行足矣,将目标进程的指定的内存地址数据dump出来并生成一个1.gif的文件
在这里插入图片描述

似乎是一张图片!打开看看

在这里插入图片描述

没错,就是我在微信里发的表情

在这里插入图片描述
瞬间明白,原来发表情会走这个接口:wxam_dec_isWXGF_4
看接口名字,似乎是判断是不是微信的gif?
于是我换了一个静态的表情发出去,也会调用这个接口,看来非gif也会调这个接口

后来发现一个问题,就是发过的表情,再发就不会调用这个接口了,估计是调用之前会检查一下缓存文件是否存在,如果存在就不调了

解决方法:

用OD调一下吧,估计也就几个判断和跳转的问题

WeChatWin.dll + 0x7DB79
在这里插入图片描述
没错就这里了,如果跳过的话就不会调用接口了,所以只要把它nop即可!

彩蛋

后面发现原来打开收藏表情的那个窗口,也会调用wxam_dec_isWXGF_4
就是这个窗口
在这里插入图片描述
然后可以把wxam_dec_isWXGF_4 接口勾上,全部都写出文件,就能把自己收藏的全部表情转存到本地了!

如果写出过的表情,也不会再调用wxam_dec_isWXGF_4 接口,还是用OD调一下,改一个跳转就可以了

WeChatWin.dll + 0x2841D6
在这里插入图片描述
改成imp就好了,每次打开收藏表情的窗口,都能调用wxam_dec_isWXGF_4 接口

成果

最后撸起袖子敲一把代码,写成了一个dll,注入到微信进程内即可获取、导出微信所有表情了
成品下载:https://pan.baidu.com/s/1fDVs_n01jGuXF9-QNC1a9Q
提取码: cb4d

运行微信,随便打开一个人的聊天框,然后运行 RemoteInject.exe
在这里插入图片描述
注入成功后弹出提示框,转存的表情会放入微信运行目录下的GetWeChatPic文件夹

在这里插入图片描述

图片的名称使用了哈希值命名
在这里插入图片描述

源代码:

使用VS2015以上编译

RemoteInject.exe
// RemoteInject.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "windows.h"
#include "atlstr.h"
#include <TlHelp32.h>char* GetProgramDll()
{static char exeFullPath[MAX_PATH] = { 0 }; // Full pathchar *nWeak;GetModuleFileNameA(NULL, exeFullPath, MAX_PATH);nWeak = strrchr(exeFullPath, '\\');memcpy(nWeak + 1, "GetWeChatPic.dll", strlen("GetWeChatPic.dll"));return exeFullPath;
}DWORD GetProcessPid(CString nProcessName)
{PROCESSENTRY32 nPT;nPT.dwSize = sizeof(nPT);HANDLE nSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);BOOL nRet = Process32First(nSnapShot, &nPT);while (nRet){if (nProcessName.MakeLower() == CString(nPT.szExeFile).MakeLower()){return nPT.th32ProcessID;}nRet = Process32Next(nSnapShot, &nPT);}return 0;
}int main()
{	printf("适用:PC端微信 2.6.8.51版本\r\n更新与2019年8月25日\r\n");DWORD nPid = GetProcessPid("wechat.exe");HANDLE nHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPid);printf("进程ID:%d  -  进程句柄:%d\r\n", nPid, nHandle);CHAR *DllPath = GetProgramDll();int nLen = strlen(DllPath)+1;LPVOID pBuf = VirtualAllocEx(nHandle, NULL, nLen, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);if (!pBuf){printf("申请内存失败!\r\n");		getchar();return 0;}if (!WriteProcessMemory(nHandle, pBuf, DllPath, nLen, 0)){printf("写入内存失败!\r\n");getchar();return 0;}HANDLE hRemoteThread = CreateRemoteThread(nHandle, NULL, NULL,(LPTHREAD_START_ROUTINE)LoadLibraryA, pBuf, 0, 0);WaitForSingleObject(hRemoteThread, -1);CloseHandle(hRemoteThread);VirtualFreeEx(nHandle, pBuf, 0, MEM_FREE);printf("注入完成!\r\n");getchar();return 0;
}
GetWeChatPic.dll
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <shellapi.h>DWORD FileBuff;
DWORD FileSize;CHAR FileName[MAX_PATH];FILE *pFile;DWORD Old_wxam_dec_isWXGF_4;void MyHook(LPVOID HookAddress, LPVOID NewAddress, DWORD *OldAddress,DWORD HookBytesNum)
{BYTE JumpByte[6] = { 0x68,0x00,0x00,0x00,0x00,0xc3 };*(DWORD*)(JumpByte + 1) = (DWORD)HookAddress + HookBytesNum;*OldAddress = (DWORD)VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);memcpy((LPVOID)*OldAddress, HookAddress, HookBytesNum);memcpy((BYTE*)*OldAddress + HookBytesNum, JumpByte,6);*(DWORD*)(JumpByte + 1) = (DWORD)NewAddress;WriteProcessMemory((HANDLE)-1, HookAddress, JumpByte, 6, 0);}DWORD GetHash(char *nBuff,int nBuffSize)
{DWORD nHash = 0;for (int i = 0; i < nBuffSize; i++){nHash = ((nHash << 25) | (nHash >> 7));nHash = nHash + nBuff[i];}return nHash;
}char* GetProgramDir()
{static char exeFullPath[MAX_PATH] = { 0 }; // Full pathchar *nWeak;GetModuleFileNameA(NULL, exeFullPath, MAX_PATH);nWeak = strrchr(exeFullPath, '\\');memcpy(nWeak + 1, "GetWeChatPic", strlen("GetWeChatPic"));return exeFullPath;
}__declspec(naked) void Hook()
{__asm{pushad;mov eax, [esp + 36];mov FileBuff, eax;mov eax, [esp + 40];mov FileSize, eax;}sprintf_s(FileName, 256, "GetWeChatPic\\%08X.gif", GetHash((char*)FileBuff, FileSize));fopen_s(&pFile, FileName, "wb+");fwrite((LPVOID)FileBuff, FileSize, 1, pFile);fclose(pFile);__asm{popad;jmp Old_wxam_dec_isWXGF_4;}
}BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{{HMODULE nHmodule = GetModuleHandleA("WeChatWin.dll");BYTE HookByte2[2] = { 0x90,0x90 };DWORD pFunAddress = (DWORD)nHmodule + 0x7DB79;//聊天收发的表情全部保存下来WriteProcessMemory((HANDLE)-1, (LPVOID)pFunAddress, HookByte2, 2, 0);BYTE HookByte5[5] = { 0xe9,0x82,0,0,0 };pFunAddress = (DWORD)nHmodule + 0x2841DC;//打开收藏的表情全部保存下来WriteProcessMemory((HANDLE)-1, (LPVOID)pFunAddress, HookByte5, 5, 0);}HMODULE nHmodule = GetModuleHandleA("WXAMDecoder.dll");LPVOID pFunAddress = GetProcAddress(nHmodule, "wxam_dec_isWXGF_4");if (pFunAddress){MyHook(pFunAddress, Hook, &Old_wxam_dec_isWXGF_4, 9);SECURITY_ATTRIBUTES SecurityAttributes;SecurityAttributes.lpSecurityDescriptor = 0;SecurityAttributes.bInheritHandle = false;SecurityAttributes.nLength = sizeof(SecurityAttributes);CreateDirectoryA("GetWeChatPic", &SecurityAttributes);if (MessageBoxA(0, "注入成功!\r\n是否打开储存的表情文件夹?", "Tips", MB_ICONINFORMATION | MB_YESNO)==IDYES)ShellExecuteA(NULL, ("open"), ("explorer"), GetProgramDir(), NULL, SW_SHOW);}else{MessageBoxA(0, "注入失败!请重启微信进入到聊天框内再注入!", "Tips", MB_ICONERROR);}}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38354.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么制作微信表情包?这两种方法,亲测好用

分享两种微信表情包制作方法&#xff0c;一种是用微信自带的表情包制作工具&#xff0c;另一种是将视频转换成GIF表情包。 一、微信小程序自制 1.首先我们打开微信&#xff0c;点击底部的【发现】&#xff0c;进入【小程序】界面&#xff0c;在上方的搜索框里输入“微信创意表…

Python爬虫爬取表情包+Autojs微信自动导入表情包脚本(附源码)

废话不多说直接开始 Python爬取表情包 一、检查网页源码 发现可以找到图片地址&#xff0c;直接请求图片地址下载图片 二、打开开发者工具(F12) 通过xpath提取p标签下的img标签src属性为图片地址 三、编写程序 代码 import requests from fake_useragent import U…

表情识别/情绪识别:ExpW表情数据集

ExpW表情数据集 1、数据集介绍2、数据集处理3、数据集下载 1、数据集介绍 论文《Deep Facial Expression Recognition: A Survey》里对其进行了介绍&#xff1a; ExpW [47]: The Expression in-the-Wild Database (ExpW) contains 91,793 faces downloaded using Google imag…

基于文字识别与情感语义分析的(熊猫头)Emoji表情包搜索神器 —— 可以识别本地表情包或者爬取网络表情包

AI Sticker Searcher 目录 generated with DocToc AI Sticker Searcher&#x1f303; 最新版本✨ 开始 1️⃣ 直接搜索表情包2️⃣ 本地没有表情包&#xff0c;想要爬取点表情包上传到云端识别搜索3️⃣ 当你本地有很多表情包图片&#xff0c;想要识别时4️⃣ 觉得云端搜索太慢…

获取千牛聊天对象(聊天记录中获取)

根据上一篇 获取千牛聊天记录 我们只要解析一下聊天记录的html就可以获取到聊天对象了。 先看实现效果吧实现原理就是在窗体中加了个Timer(定时器控件)定时获取html并解析就能获取到聊天对象了 但是有个问题,就是没有聊天记录的就获取不到了.... 这个问题留着下一篇解决吧.... …

旺旺打标工具,淘宝搜索打标软件(含旺旺打标API接口)

一、【旺旺打标工具,淘宝搜索打标软件】实现需求 指定的单品将会出现在手淘搜索首屏位置及淘内所有免fei流量入口位置。 二、【淘宝搜索打标】应用场景   使用淘宝搜索打标工具后,将宝贝推送到搜索页。 旺旺打标api接口返回示例&#xff1a; {"msg": "succe…

千牛卖家工作平台使用教程

千牛电脑版(卖家工作台) 1.13.19 免费版 千牛官方下载,千牛卖家版官方下载,千牛工作台,千牛卖家移动工作平台 让卖家可以更加便捷和高效的管理店铺&#xff0c;让生意游刃有余。千牛&#xff0c;为阿里巴巴官方出品的卖家一站式工作台&#xff0c;其核心是为卖家整合&#xff1…

淘宝千牛软件服务器fmsas端口与客户端的通信协议(完整版)

个人兴趣学习&#xff0c;不负法律责任 本例纯属学习和科研参考&#xff0c;请勿用在商务用途&#xff08;使用淘宝开放平台的api吧~~by凉 白开QQ&#xff09;。 前言&#xff1a; 帮朋友的过程中&#xff0c;突然想到一个像淘宝这样安全性这么强的互联网企业&#xff08;额&…

如果鸿蒙系统上线,使用体验与安卓相当,你会换系统么?

其实这个我觉得不是你会不会换的问题&#xff0c;而是华为如果给了很多手机装了鸿蒙系统&#xff0c;而且还保持了目前的UI使用体验&#xff0c;同时也能做到了底层优化的技术&#xff0c;让速度快&#xff0c;为何不用&#xff1f;其实目前在国产基本上没有谷歌的安卓原生态系…

鸿蒙(harmonyOS)应用开发-真机设备API版本查看

如何使用hdc工具查看鸿蒙真机版本 前言 在鸿蒙应用开发中&#xff0c;我们会在真机上进行调试&#xff0c;但是我们需要保证我们选择的API版本大于或等于手机的API版本&#xff0c;否则可能会出现兼容性问题。那么&#xff0c;如何查看真机的API版本呢&#xff1f;本文将介绍…

『牛角书』HarmonyOS鸿蒙实战 开发一个简单聊天助手APP

前言 我是通过b站上面老师的讲解&#xff0c;跟着老师编写了一个简单聊天助手app&#xff0c;简答实用&#xff0c;对于刚开始接触鸿蒙的我们来说很有帮助。 创建项目 所用软件为DevEco Studio&#xff0c;点击Create HarmonyOS Project&#xff0c;这里选择了第一个空的项目…

开发跨设备的鸿蒙(HarmonyOS) App

为了让更多的人看到本文&#xff0c;请各位读者动动小手&#xff0c;点击右上角【...】&#xff0c;将本文分享到朋友圈&#xff0c;thanks&#xff01; 现在的智能设备种类越来越多&#xff0c;而且这些智能设备的屏幕尺寸、分辨率都不同&#xff0c;例如&#xff0c;比较常见…

鸿蒙系统vivo能用吗,不是华为手机,也能用上鸿蒙系统

按照此前的进度&#xff0c;华为的鸿蒙 OS 系统已经在 Mate40 等多款华为系手机上小范围推送&#xff0c;从此前公布的消息来看&#xff0c;应该在 6 月份正式全面开放&#xff0c;让更多的用户用上这套华为自研的系统。 今天&#xff0c;华为召开了一场鸿蒙 OS 的合作伙伴峰会…

终于有人把鸿蒙OS讲明白了!并开放鸿蒙教程!

点击“开发者技术前线”&#xff0c;选择“星标????” 让一部分开发者看到未来 “ 本文面向的是开发人员&#xff0c;主要想通过科普让大家了解一下鸿蒙开发。接下来&#xff0c;我想给大家科普一下这个这么火的鸿蒙系统。 到底什么是鸿蒙 OS 在官网上看到鸿蒙 OS 的简介是…

不要总想着自己训练大模型,你的业务可能并不需要

至少企业知识库是这样。 我要训练大模型&#xff0c;我要做私有部署&#xff0c;我要做模型 Fine-tune&#xff0c;我要搞垂类 GPT。最近真是听了好多这样的话&#xff0c;让我想起之前刷到的一个视频&#xff1a; 我长大要开飞机&#xff0c;我想当宇航员&#xff0c;我要有所…

别光骂谷歌了!新版 Bing 花式“翻车”,还让用户向它道歉?

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 因为 ChatGPT&#xff0c;最近谷歌被“黑”得挺惨&#xff1a;先是它发布的 ChatGPT 竞品 Bard 全球首秀“大翻车”&#xff0c;导致谷歌市值一夜狂跌 7000 亿&#xff1b;接着又被自家员工嘲讽&…

4大主流小程序平台介绍及其优缺点对比

文章目录 人工智能福利文章微信小程序优点缺点 支付宝小程序优点缺点&#xff1a; 百度小程序优点缺点 字节小程序优点缺点 总结写在最后 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你…

【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统

极简个人博客 基于SpringBootvueiview极简个人博客 &#x1f4da;项目介绍 个人极简博客 【个人极简博客】是一个适用于初学者学习的博客系统&#xff0c;其中包含文章分类、写文章、标签管理、用户管理等基础功能&#xff0c;代码简洁注释完善&#xff0c;易上手学习。技术栈…

【从零开始】Docker Desktop:听说你小子要玩我

前言 &#x1f34a;缘由 捡起遗忘的Docker知识 由于本狗近期项目紧任务重&#xff0c;高强度的搬砖导致摸鱼时间下降。在上线项目时&#xff0c;看到运维大神一系列骚操作&#xff0c;dockerk8s的知识如过眼云烟&#xff0c;忘得干净的很。所以想重新恶补一下docker知识&…

云炬Android开发教程 Android studio的详细安装步骤

下面我们正式开始安装AS 一、基本的安装教程 下载好后双击运行安装包&#xff0c;点击下一步 - 勾选如图所示勾选选项&#xff0c;点击下一步- 自定义软件的安装路径&#xff0c;点击下一步- 开始运行Android studio&#xff0c;点击finish- 选择第二个&#xff0c;不导入已有…