一、环境
1、微信版本
2、WeChatWin.dll基址
基址=0FD30000
大小=018A2000 (25829376.)
入口=10A0AA01 WeChatWi.
名称=WeChatWi
文件版本=2.8.0.121
路径=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
二、观察添加好友过程
1、发起添加好友
日志
调试字串: AddFriend wxid_xxxxx
调试字串: new NetSceneVerifyUser (id:330),name:wxid_xxxxx
调试字串: opCode : 1, fromScene : 6 verifyContent: chatroomName :
调试字串: VerifyUser doSceneImpl(seqid:330)
调试字串: in send NetSceneVerifyUser(id:330)
界面
2、点击确认
日志
调试字串: new NetSceneVerifyUser (id:332),name:wxid_xxxxx
调试字串: opCode : 2, fromScene : 6 verifyContent: 我是Kong chatroomName :
调试字串: VerifyUser doSceneImpl(seqid:332)
调试字串: in send NetSceneVerifyUser(id:332)
界面
3、添加好友流程
1、请求服务器判断是不是好友:opCode : 1
2、收到服务器的回复,判断是不是好友
2、如果不是好友,弹出添加好友界面
3、最后发起好友请求:opCode : 2
4、清粉思路
1、模拟添加好友,请求好友状态
2、拦截弹出好友界面,判断好友状态
3、配合通讯录,删除好友,就能实现无痕清粉功能
三、找Call过程
1、添加好友的界面
微信界面是用Duilib,参考Duilib的微信分支,Hook创建界面,得到界面的XML文件
界面文件名:main\VerifyDialog.xml
确认按钮:okbtn
2、判断好友状态
堆栈往下翻 看到 class AddFriendHelper
IDA看下AddFriendHelper
接收服务器的响应是在:AddFriendHelper::eventProc
里面判断各种情况:好友,删除,拉黑
这里就找到了判读好友的状态了
A7:删除
A8:好友
AC:拉黑
3、请求好友状态
点击确认按钮,发送的是opCode : 2,改为opCode : 1,就变成请求好友状态
搜索字符串下断点:opCode :
添加好友,触发这里的断点,第一次先跳过,点击添加好友界面的确认按钮,再次断下
堆栈往回找看到okbtn
IDA对应的地方,可以看出这里就是对各种按钮的处理
点击确认按钮:okbtn之后触发的代码
这里就找到了请求好友状态的Call