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

简介: 对未实现的参数进行猜测

对未实现的参数进行猜测


  1. 有可能是在打开红包时创建的参数
  2. 我们要分析红包Manager所有的方法, 所以接下来我们hook管理类的所有方法
  3. 通过方法logify.pl 这个方法(前几篇文章有)


  1. WCRedEnvelopesLogicMgr -> 只是注释了C++的方法
  2. 然后编译安装插件



微信图片_20220510042555.png
image.png


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


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


继续分析


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


找到关键参数


  1. 上面的第三个方法
  2. 制作插件的过程中, 头文件比较多(因为要声明很多属性方法), 建议创建.h文件来管理, 所以只要import该头文件就可以了

微信图片_20220510042607.png

image.png


  1. hook响应方法并打印

微信图片_20220510042612.png
image.png


  1. 打印的关键参数

微信图片_20220510042616.png
image.png


容易忽略的细节


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


完善的事情


  1. 抢红包多种情况的判断, 什么时候可以抢


  1. cgicmdid
  2. isSender
  3. receiveStatus
  4. 群聊红包等 (hbstatus字段)

微信图片_20220510042622.png

image.png


  1. 最后基本上所有的逻辑都已经梳理完毕, 请自行完成插件


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


(void)CheckMessageStatus:(NSString *)uid Msg:(CMessageWrap *)msg{//会调用多次!!!
  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




目录
相关文章
|
存储 移动开发 开发框架
使用UniApp实现视频数组自动下载与播放功能:一步步指导
使用UniApp实现视频数组自动下载与播放功能:一步步指导
270 0
|
1月前
|
数据采集 JavaScript 前端开发
【逆向基础】JS逆向入门:小白也可以看懂
【逆向基础】JS逆向入门:小白也可以看懂
序---在开发的过程中首先写开发文档,查一查开发文档怎么写,开发一个流程标准化页面
序---在开发的过程中首先写开发文档,查一查开发文档怎么写,开发一个流程标准化页面
|
6月前
|
数据可视化 测试技术 API
阅读源码有哪些好方式与好步骤
阅读源码是理解软件工作原理的关键。首先,了解背景、目的和技术栈。从文件头部的文档注释开始,逐步深入到复杂代码。利用Git、调试器和分析工具辅助理解。保持批判性思维,质疑代码设计并验证理解。拆分代码块,画图展示结构,使用版本控制追踪变更。搜索、阅读文档、API和单元测试以深化理解。参与讨论,做笔记,回顾历史版本,了解上下文,并通过实践加强领悟。每个人的方法可能不同,关键是持续学习和适应。
59 1
|
Android开发 iOS开发
iOS 逆向编程(四)实操 Jailbreak 进阶必备软件
iOS 逆向编程(四)实操 Jailbreak 进阶必备软件
101 0
|
缓存 JavaScript iOS开发
iOS 逆向编程(十四)Cycript 语法入门
iOS 逆向编程(十四)Cycript 语法入门
193 0
|
数据安全/隐私保护 iOS开发 开发者
iOS 逆向编程(三)实操 Jailbreak 详细流程
iOS 逆向编程(三)实操 Jailbreak 详细流程
246 1
|
前端开发 JavaScript 定位技术
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
134 0
|
SQL JSON 机器人
pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程
pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程
|
缓存 Java 开发工具
Tinker 热修复原理及手写实现
Tinker 热修复原理及手写实现
168 0