处女作,有写错的地方,请各路大佬明确指出。
逆向分析方法:
WeChatWin模块基址:0x5CD60000
a、不停的向测试号发送消息,不要点开,让未读消息总数不断增加(此方法比搜特征码、字符串更通用,所有版本都可以用这个方法快速定位);
b、
1⃣️、在ce里面首次搜索《未知的初始值》、发送消息、接着再搜索《增加的数值》
2⃣️、点一下微信界面或者拖动一下微信界面、搜《未变动的数值》
1⃣️和2⃣️结合使用。
c、不停过滤之后,只剩几条稳定的数据,在od里面下内存写入断点,此时断在此处:
5D78A8EF 8943 30 mov dword ptr ds:[ebx+0x30],eax ; 未读消息总数-内存写入断点
d、看数据窗口,可以看到这样的数据结构:
16CC09D0 5F73C350 WeChatWi.5F73C350
16CC09D4 00000000
16CC09D8 170A82B8 UNICODE "wxid_8v3brokcw。。。。"
16CC09DC 00000013
16CC09E0 00000013
16CC09E4 00000000
16CC09E8 00000000
16CC09EC 16F92CD8 UNICODE "微信昵称"
16CC09F0 00000005
16CC09F4 00000005
16CC09F8 00000000
16CC09FC 00000000
16CC0A00 00000001
16CC0A04 00000000
16CC0A08 00000000 此处为收发标记:1=自己发送的,0=收到消息
16CC0A0C 64364FD1 PicFace.64364FD1
16CC0A10 03146B18 UNICODE "想日啥想日在新"
16CC0A14 00000007
16CC0A18 00000007å…………
16CC0A1C 00000000
e、根据以往的经验,直接搜汇编指令:
mov dword ptr ds:[esi],0x5F73C350
定位到收消息内存分配的地方:
5D650035 8D8E D8000000 lea ecx,dword ptr ds:[esi+0xD8]
5D65003B C706 50C3735F mov dword ptr ds:[esi],WeChatWi.5F73C350
5D650041 E8 DA040000 call WeChatWi.5D650520 ; 收消息调用malloc内存分配
但从相关字符串和行为来看,此处其实是内存释放,底层调用了free函数,所以走到此处的时候就填充了完整的消息结构
换不同的寄存器分别搜一遍(除了ebp、esp没必要搜):
mov dword ptr ds:[寄存器],0x5F73C350
收消息真正内存分配位置:
5D6505AE C707 50C3735F mov dword ptr ds:[edi],WeChatWi.5F73C350
2、收消息最佳hook位置:
5DA4D0D7 E8 04500000 call WeChatWi.5DA520E0 ; 收消息hook这里
消息存储在局部变量:EBP-0x408的位置
相关附图: