对未实现的参数进行猜测
- 有可能是在打开红包时创建的参数
- 我们要分析红包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
网友评论