本帖最后由 bester 于 2020-2-15 01:20 编辑
原贴:https://www.52pojie.cn/thread-1103441-1-1.html
最近频繁刷某音刷到哥哥微信来了的铃声,刚好今天2.14大家云恋爱,我等单身狗只能舔屏,前几日看到楼主这篇帖子修改了PC微信的提示音,同时楼主也提出了一个缺陷,就是文件大小有限制,不能超过256kb
我个人的理解就是原提示音89.8 KB (92,044 字节),理论上覆盖这个提示音,不能超过这个大小,但是如果说自己增加一块资源段,理论上应该是可以放的,但是这块我们不作讨论,因为我不想去作实现,太没必要了
另外我不知道为什么楼主会说不能超过256kb,阅读了一下api说明,我也没有发现说有这个限制,那么我还是从api入手,看看是否有发现。
首先要理解的是,DLL中的资源是怎么被加载调用的,我们需要知道三个API:
FindResourceW 寻找资源
LoadResource 加载资源
SizeofResource 获取资源大小
只有加载了资源以后,才能对这个资源进行调用
所以我们可以通过这些API找到一个调用点,但是如果说资源比较多,我们要一个一个断下来看,也挺费时间,所以我直接看哪个API函数是播放WAV提示音的入手就可以了,PlaySoundW/PlaySoundA
一般来说都是宽字节,所以我们只需要断PlaySoundW即可,先从WeChatWin.dll里面找导入函数,至于为什么是这个dll,因为这个dll是PC微信实现功能的dll
直接在WeChatWin.dll领空ctrl+N,找到这个导入函数
然后按enter回车键,查找函数调用参考
因为我多次调试过了,所以知道是第一个,如果是第一次,请全部下断,然后让朋友给你发消息,会断下的那个就是播放声音的调用处
然后我们看他的3个参,直接从百度里面搜,看各个参数代表啥意思,大家可以看这篇帖子
https://blog.csdn.net/lindorx/article/details/78724518
然后找到里面的C++代码
PlaySound(TEXT("F:\\c.wav"),NULL,SND_FILENAME | SND_ASYNC);
那么就知道了第一个参数是文件路径或者是资源号,第二个可以为NULL,如果不为NULL,则表示是包含资源模块的模块句柄,第三个参数是播放模式
所以按照这个逻辑,我们自己写一个C++程序,调用一下我们的提示音.wav,然后用OD载入看看
然后OD反编译一下,得到如下代码
剩下的就是照着抄就可以了
[Asm] 纯文本查看 复制代码
7B18DD73 68 05000400 push 0x40005 //这里改 push 20001
7B18DD78 E8 1E0C7200 call 7B8AE99B //这里是获取资源句柄,可以不改
7B18DD7D 50 push eax //这里改push 0
7B18DD7E 6A 76 push 0x76 // 这里改 push 文件路径的地址
7B18DD80 FF15 F0AA297C call dword ptr ds:[<&WINMM.PlaySoundW>] ; winmm.PlaySoundW
文件路径的地址,自己找一个00的空段,写入文件路径,然后把地址改上去即可
重点注意:修改可能会导致需要补码的情况,另外还要考虑重定位,已测试如果直接修改保存,会导致PlaySoundW重定位不可用,大家慎重,坐等大佬放出直接保存的修改方法!!!
修改完毕后的图:
然后inline hook的话就是直接修改PlaySoundW函数,代码使用shellcode即可,我这里没有加判断,可自行添加,因为只有3个提示音,来消息,来电语音,挂断语音
[Asm] 纯文本查看 复制代码
04990007 C74424 04 60009904 mov dword ptr ss:[esp+0x4], 0x4990060 //赋值
0499000F C74424 08 00000000 mov dword ptr ss:[esp+0x8], 0x0 //赋值
04990017 C74424 0C 01000200 mov dword ptr ss:[esp+0xC], 0x20001 //赋值
0499001F 8BFF mov edi, edi //补码
04990021 55 push ebp //补码
04990022 8BEC mov ebp, esp //补码
04990024 - E9 CC28846E jmp winmm.731D28F5 //调用原函数
shellcode:C7 44 24 04 00 00 00 00 C7 44 24 08 00 00 00 00 C7 44 24 0C 01 00 02 00 8B
FF 55 8B EC E9 00 00 00 00
另外说明一点:使用inline hook的好处就是基本无视微信版本升级,除非他换API,不使用inline hook的话,如果微信资源文件更新导致地址变更就凉了,这点区别大家知晓一下 |