写在前面
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在大规模封号,有需要自行研究吧。如果需要图文教程就留言,我抽空再写写,没有人看就不费劲了。
免责声明
文章仅供交流学习使用,请不要侵害表情包作者版权,如因此产生法律纠纷,与本人无关。