逆向实战(插件完) (29)

对未实现的参数进行猜测

  1. 有可能是在打开红包时创建的参数
  2. 我们要分析红包Manager所有的方法, 所以接下来我们hook管理类的所有方法
  3. 通过方法logify.pl 这个方法(前几篇文章有)
    1. WCRedEnvelopesLogicMgr -> 只是注释了C++的方法
    2. 然后编译安装插件
  4. image.png

插件分析过程编译安装插件的Tips

  1. 调试插件编译运行到微信的过程中
  2. 每次记得自己杀掉微信的进程, 不要编译杀掉, 因为微信有检测

继续分析

  1. 最终达到的效果是, 是收到一条红包消息, 去执行拆开红包的逻辑

找到关键参数

  1. 上面的第三个方法
  2. 制作插件的过程中, 头文件比较多(因为要声明很多属性方法), 建议创建.h文件来管理, 所以只要import该头文件就可以了
  3. image.png
  4. hook响应方法并打印
    image.png
  5. 打印的关键参数
    image.png

容易忽略的细节

  1. cgicmdid的类型为3时, 这个红包才是可以抢的
  2. 此处省略了分析, 关键还是多看打印的参数
  3. 还有c字段判断是否是自己发送的
  4. 以及receiveStatus字段判断自己是否已经抢过这个红包

完善的事情

  1. 抢红包多种情况的判断, 什么时候可以抢
    1. cgicmdid
    2. isSender
    3. receiveStatus
    4. 群聊红包等 (hbstatus字段)
    5. image.png
  2. 最后基本上所有的逻辑都已经梳理完毕, 请自行完成插件

下方是接下来,有可能有问题的代码, 有两点是在调试过程发现的

    • (void)CheckMessageStatus:(NSString *)uid Msg:(CMessageWrap *)msg{//会调用多次!!!
  1. 通过排查问题得出参数缺失!!!
    1. [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

你可能感兴趣的:(逆向实战(插件完) (29))