PC微信逆向获取聊天表情


写在前面

PC微信版本:3.5.0.46
今天有个老哥提出需求,问我能不能把微信的表情包保存到本地,因为之前找到过未加密图片数据的Hook点,本来以为差不多的,然而并不是,所以有了这篇文章。

思路

首先还是在接收消息的地方下断,发一个表情,查看消息内容,把xml数据拷贝出来,看看都用到了哪些属性,然后在OD里右键-查找-查找所有字串,搜索某个属性,把push这些属性的指令都下断。

然后再发一个表情消息,会在某个push属性的地方断下,取消掉之前所有的断点,再BP CreateFileW,然后一直运行直到CreateFileW的路径包含CustomEmotion,此时记下文件句柄(eax),取消CreateFileW的断点。

接着BP WriteFile,运行,直到句柄与刚才的句柄一致,此时查看堆栈窗口的文件buffer,发现开头的字符是5631xxxx,与之前保存的表情包文件头一致,那毫无疑问此处是加密数据了。

如果是跟图片一样使用异或加密,那跟图片走同样的函数就行了,肯定有差别,往上追溯也没有发现加密过程,一度怀疑人生。

后来发现不同的表情包,头部信息是一样的,转换为ASCII字符是V1MMWX,遂百度,这下就能找到资料了,不过年代较为久远,还有一些是小程序解密的,里面提到,除头部6个字节外,后面1024个字节使用RSA加密,剩下的部分使用异或加密,研究RSA解密还是算了吧。

后来在文本字串里搜索V1MMWX,还真有一个地方push了,于是下断,再次发送表情包,成功断下,这时微信的消息提示已经触发,可以看到任务栏的高亮,所以,此处应该是微信在解密表情包,然后加载到聊天界面(只是猜测)。

下拉查看堆栈,看到一些Gif开头的ASCII字符,一开始没想明白是什么,数据窗口跟随,发现就是原始数据,在表情包内容指针下面跟了一个表情包大小,很好,找找附近的返回,定位到CALL下断,得到以下内容:

Executable modules, 条目 132
 基址=5D5B0000
 大小=02624000 (39993344.)
 入口=5EADC59D WeChatWi.<模块入口点>
 名称=WeChatWi
 文件版本=3.5.0.46
 路径=D:\Tencent\WeChat\[3.5.0.46]\WeChatWin.dll

5D9A2E83    E8 885A0000     call    5D9A8910                         ; 表情位置:eax,大小:eax+4

不过这个地方有个缺点,重复的表情包不会再触发,应该是在某个地方触发了jmp,往上追,一直找到子线程调用,也没有发现那个jmp语句,索性不找了,把之前本地保存的加密表情全删了就行。

写在后面

HOOK的代码就不放了,据说TX在大规模封号,有需要自行研究吧。如果需要图文教程就留言,我抽空再写写,没有人看就不费劲了。

免责声明

文章仅供交流学习使用,请不要侵害表情包作者版权,如因此产生法律纠纷,与本人无关。