对未实现的参数进行猜测
- 有可能是在打开红包时创建的参数
- 我们要分析红包Manager所有的方法, 所以接下来我们hook管理类的所有方法
- 通过方法logify.pl 这个方法(前几篇文章有)
- WCRedEnvelopesLogicMgr -> 只是注释了C++的方法
- 然后编译安装插件
image.png
插件分析过程编译安装插件的Tips
- 调试插件编译运行到微信的过程中
- 每次记得自己杀掉微信的进程, 不要编译杀掉, 因为微信有检测
继续分析
- 最终达到的效果是, 是收到一条红包消息, 去执行拆开红包的逻辑
找到关键参数
- 上面的第三个方法
- 制作插件的过程中, 头文件比较多(因为要声明很多属性方法), 建议创建.h文件来管理, 所以只要import该头文件就可以了
image.png
- hook响应方法并打印
image.png
- 打印的关键参数
image.png
容易忽略的细节
- cgicmdid的类型为3时, 这个红包才是可以抢的
- 此处省略了分析, 关键还是多看打印的参数
- 还有c字段判断是否是自己发送的
- 以及receiveStatus字段判断自己是否已经抢过这个红包
完善的事情
- 抢红包多种情况的判断, 什么时候可以抢
- cgicmdid
- isSender
- receiveStatus
- 群聊红包等 (hbstatus字段)
image.png
- 最后基本上所有的逻辑都已经梳理完毕, 请自行完成插件
下方是接下来,有可能有问题的代码, 有两点是在调试过程发现的
(void)CheckMessageStatus:(NSString *)uid Msg:(CMessageWrap *)msg{//会调用多次!!!
- 通过排查问题得出参数缺失!!!
[mutable_dic setObject:msg.m_nsFromUsr forKey:@"sessionUserName"];
%hook CMessageMgr //- (void)CheckMessageStatus:(NSString *)uid Msg:(CMessageWrap *)msg{//会调用多次!!! - (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(CMessageWrap *)msg{ NSString *m_c2cNativeUrl = msg.m_oWCPayInfoItem.m_c2cNativeUrl; if((msg.m_uiMessageType == 49) && [m_c2cNativeUrl containsString:@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?"]){//判断是一个红包消息! NSUInteger len = [@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]; NSString * NativeUrl2 = [m_c2cNativeUrl substringFromIndex:len]; NSMutableDictionary * url_dic = [%c(WCBizUtil) dictionaryWithDecodedComponets:NativeUrl2 separator:@"&"]; NSMutableDictionary * mutable_dic = [%c(NSMutableDictionary) dictionary]; [mutable_dic setObject:@"1" forKey:@"msgType"]; [mutable_dic setObject:url_dic[@"sendid"] forKey:@"sendId"]; [mutable_dic setObject:url_dic[@"channelid"] forKey:@"channelId"]; MMContext * context = [%c(MMContext) currentContext]; Class ccMgr = [%c(CContactMgr) class]; CContactMgr * contactMgr = [context getService:ccMgr]; CContact * selfContact = [contactMgr getSelfContact]; id displayName = [selfContact getContactDisplayName]; [mutable_dic setObject:displayName forKey:@"nickName"]; [mutable_dic setObject:[selfContact m_nsHeadImgUrl] forKey:@"headImg"]; if(msg){ WCPayInfoItem * payInfoItem = [msg m_oWCPayInfoItem]; [mutable_dic setObject:[payInfoItem m_c2cNativeUrl] forKey:@"nativeUrl"]; } // MMMsgLogicManager * redEnvelopesLogicMgr = [[%c(MMContext) currentContext] getService:[%c(MMMsgLogicManager) class]]; // WeixinContentLogicController * currentLogicController = [redEnvelopesLogicMgr GetCurrentLogicController]; // // if (currentLogicController) // { // // CBaseContact * m_contact = [currentLogicController m_contact]; // if (m_contact) // { // // NSString * nsUsrName = [m_contact m_nsUsrName]; // // if ( nsUsrName ) // { // [mutable_dic setObject:nsUsrName forKey:@"sessionUserName"]; // } // } // } //通过排查问题得出参数缺失!!! [mutable_dic setObject:msg.m_nsFromUsr forKey:@"sessionUserName"]; //保存一下开红包需要的参数! [[WeChatRedEnvelopParamQueue sharedQueue] enqueue:mutable_dic]; //拼接参数 NSMutableDictionary * params = [%c(NSMutableDictionary) dictionary]; [params setObject:@"0" forKey:@"agreeDuty"]; [params setObject:mutable_dic[@"channelId"] forKey:@"channelId"]; [params setObject:@"1" forKey:@"inWay"]; [params setObject:mutable_dic[@"msgType"] forKey:@"msgType"]; [params setObject:mutable_dic[@"nativeUrl"] forKey:@"nativeUrl"]; [params setObject:mutable_dic[@"sendId"] forKey:@"sendId"]; //手动拆开红包! WCRedEnvelopesLogicMgr * redMgr = [[%c(MMContext) currentContext] getService:[%c(WCRedEnvelopesLogicMgr) class]]; //真正拆开红包的方法!! [redMgr ReceiverQueryRedEnvelopesRequest:params]; }else{ %orig; } %orig; } %end