首页
社区
课程
招聘
[原创]实现某app的抢红包功能
发表于: 2020-7-29 22:32 20280

[原创]实现某app的抢红包功能

2020-7-29 22:32
20280

目录

分析步骤

脱完壳之后会有很多dex, 这里我就没去找对应的dex,这里我是直接用脚本把所有的dex都 反编译成java代码,然后就sublime看的,这样感觉比较方便(个人喜好 )合并dex脚本

脱完壳后就开始找关键代码了,直接打开app 进入到收红包消息的界面,运行该命令,找到顶层的activety

adb shell dumpsys activity top | grep ACTIVITY

new RedpaperApi().getRedpaper(...) 这个接口

 
function hookChatRoom() {
    Java.perform(function(){
        var Gson  = Java.use("com.google.gson.Gson");
        var IMMessage = Java.use("com.netease.nimlib.sdk.msg.model.IMMessage");
        var CustomBaseMode = Java.use("com.xxx.xx.module.nim.custom.CustomBaseMode");
        var AnchorBean = Java.use("com.xxx.xx.model.AnchorBean");
        var UserInfo = Java.use("com.xxx.xx.constant.UserInfo");
        var GsonNew = Gson.$new();
        var BaseChatRoomActivity = Java.use("com.xxx.xx.module.live.chatroom.BaseChatRoomActivity");
        var YRequest = Java.use("com.hzlh.sdk.net.YRequest");
        // hook http 请求的返回值
        YRequest.handleResult.implementation = function(obj, callBack) {
            console.log("YRequest.handleResult: ", GsonNew.toJson(obj));
            return this.handleResult(obj, callBack);
        }
        BaseChatRoomActivity.handleCustomMessage.implementation = function(chatRoomMessage) {
            var imMessage = Java.cast(chatRoomMessage, IMMessage);
            var json = GsonNew.toJson(imMessage.getRemoteExtension());
            var custMsg = GsonNew.fromJson(json, CustomBaseMode.class);
            var customBaseMode = Java.cast(custMsg, CustomBaseMode);
            var dataType = customBaseMode.getDataType();
            var userId = UserInfo.getBase().getAppUserId();
            if(dataType == 301){
                //send("红包来了。。。。。。。。。。。。。。");
                console.log("红包来了。。。。。。。。。。。。。。");
                var redcontent = customBaseMode.getContent();
                console.log("data: ", redcontent)
                var authorId = Java.cast(GsonNew.fromJson(redcontent, AnchorBean.class), AnchorBean).getAnchorpersonId();
                //创建一个线程 收到红包消息就去抢红包
                var jRunnable = Java.use('java.lang.Runnable');
                var MyRunnable = Java.registerClass({
                        name: 'com.example.MyRunnable',
                        implements: [jRunnable],
                        methods: {
                            run: function(){
                                console.log("thread run...");
                                var ChatRoomEventView = "com.xxx.xx.module.live.chatroom.event.ChatRoomEventView";
                                var RedpaperApi = Java.use("com.xxx.xx.Api.redpaper.RedpaperApi");
                                var AppCallBack = Java.use("com.xxx.xx.model.AppCallBack");
                                var a = 1;
                                Java.choose(ChatRoomEventView, {
                                    onMatch:function(instance){
                                        if(a == 1) {
                                            console.log("getRedpaper : ", instance, authorId, userId);
                                            RedpaperApi.$new().getRedpaper(instance.mContext.value, authorId, userId, AppCallBack.$new(instance.mContext.value));
                                            a ++;
                                        }
                                    }, onComplete:function(){
                                    }
                                })    
                            }
                        }
                    });
                //console.log("--------start thread--------");
                var runnable = MyRunnable.$new();
                runnable.run();
            }else if(dataType == 64){
                console.log("抽奖来了。。。。。。。。。。。。。");
                console.log("data: ", customBaseMode.getContent())
            }else if(dataType == 251){
                console.log("福利来了。。。。。。。。。。。。。");
                console.log("data: ", customBaseMode.getContent())
            }  
            return this.handleCustomMessage(chatRoomMessage);
        }
    })
}

adb shell dumpsys activity top | grep ACTIVITY

new RedpaperApi().getRedpaper(...) 这个接口

  • 写这个插件的原因是因为经常使用这个app,而且每天早上这个app都会发红包,然而每次都抢不到,很懊恼,而最近也一直跟着 r0ysue 大佬在学习安卓逆向相关的知识,就突发奇想,所以就拿来练练手了
  • 本贴仅限学习交流使用,切勿用于非法行径,否则后果自付
  • 工具
    1. objection
    2. frida
    3. jadx
  • 分析步骤

    1. 先放到jadx中 发现该app是360的壳
      avatar
    2. 碰到这个壳直接用大佬的脚本就可以脱
      FART 或者 FRIDA-DEXDump
    3. 脱完壳之后会有很多dex, 这里我就没去找对应的dex,这里我是直接用脚本把所有的dex都 反编译成java代码,然后就sublime看的,这样感觉比较方便(个人喜好 )合并dex脚本

    4. 脱完壳后就开始找关键代码了,直接打开app 进入到收红包消息的界面,运行该命令,找到顶层的activety

      adb shell dumpsys activity top | grep ACTIVITY

    5. 然后 打开objection hook 该 Activity, 然后查看调用堆栈;
    6. 最后定为到这里,到这里收红包消息的地方已经被我我们找到
      avatar
      ![avatar]
    7. 接着就要找领红包的接口了,通过代码发现处理红包的逻辑在如下图的view中
    8. 然后在通过objection hook 对应view 观察发现
    9. 最终调用的地方是

      new RedpaperApi().getRedpaper(...) 这个接口

    10. 接下来的话就是写代码 验证自己的猜想了 ,后来经过测试及调整 就有了如下代码:
  • 附几张效果图
  • 最后得到的结论有这么几点:
    1. 逆向过程中思路很重要,就像r0ysue 大佬说的一样,要站在开发的角度上去想问题,开发功底有多强,那你逆向分析水平也不会差;
    2. 另外选对好的工具也非常的重要,就像objection 这款基于frida开发的工具,真的是非常的好用,逆向过程中基本上都不用写代码;大部分靠objection就能快速的找到突破点;
    3. 关于这款app表明上是加了壳,但对代码没有做过多的混淆,脱完壳后,基本上就是源码了,在通过抓包分析(这里推荐的抓包环境charles + postern,然后配上线ssl unpinning 的处理脚本,基本上可以抓到大部分app的明文数据包)基本上可以做到脱机处理,所以基本上没有太多的难点;另外发现这款app的IM通讯用的是第三方的sdk (网易云信),然后我就试着下载官网的sdk包,然后用这款app的appkey 和token 写到对应的代码中,发现轻而易举的登陆成功了,也是很神奇;
    4. 这个抢红包功能相对于wx的抢红包功能,其实也是大同小艺,只是wx的抢红包功能多了一步就是需要拿到红包的key之后,才能在去抢红包;这款app只要收到红包消息就可以直接打开红包;只要一步就搞定了,相对来说是比较简单的了;
  • 本贴仅限学习交流使用,切勿用于非法行径,否则后果自付
  • 如有侵权,请联系作者删除
  1. objection
  2. frida
  3. jadx
  1. 先放到jadx中 发现该app是360的壳
    avatar
  2. 碰到这个壳直接用大佬的脚本就可以脱
    FART 或者 FRIDA-DEXDump
  3. 脱完壳之后会有很多dex, 这里我就没去找对应的dex,这里我是直接用脚本把所有的dex都 反编译成java代码,然后就sublime看的,这样感觉比较方便(个人喜好 )合并dex脚本

  4. 脱完壳后就开始找关键代码了,直接打开app 进入到收红包消息的界面,运行该命令,找到顶层的activety

    adb shell dumpsys activity top | grep ACTIVITY

  5. 然后 打开objection hook 该 Activity, 然后查看调用堆栈;
  6. 最后定为到这里,到这里收红包消息的地方已经被我我们找到
    avatar
    ![avatar]
  7. 接着就要找领红包的接口了,通过代码发现处理红包的逻辑在如下图的view中
  8. 然后在通过objection hook 对应view 观察发现
  9. 最终调用的地方是

    new RedpaperApi().getRedpaper(...) 这个接口

  10. 接下来的话就是写代码 验证自己的猜想了 ,后来经过测试及调整 就有了如下代码:
  1. 逆向过程中思路很重要,就像r0ysue 大佬说的一样,要站在开发的角度上去想问题,开发功底有多强,那你逆向分析水平也不会差;
  2. 另外选对好的工具也非常的重要,就像objection 这款基于frida开发的工具,真的是非常的好用,逆向过程中基本上都不用写代码;大部分靠objection就能快速的找到突破点;
  3. 关于这款app表明上是加了壳,但对代码没有做过多的混淆,脱完壳后,基本上就是源码了,在通过抓包分析(这里推荐的抓包环境charles + postern,然后配上线ssl unpinning 的处理脚本,基本上可以抓到大部分app的明文数据包)基本上可以做到脱机处理,所以基本上没有太多的难点;另外发现这款app的IM通讯用的是第三方的sdk (网易云信),然后我就试着下载官网的sdk包,然后用这款app的appkey 和token 写到对应的代码中,发现轻而易举的登陆成功了,也是很神奇;
  4. 这个抢红包功能相对于wx的抢红包功能,其实也是大同小艺,只是wx的抢红包功能多了一步就是需要拿到红包的key之后,才能在去抢红包;这款app只要收到红包消息就可以直接打开红包;只要一步就搞定了,相对来说是比较简单的了;
  •                  内容摘要
  •                  分析思路
  •                  效果展示
  •                  最后总结

  • [招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

    最后于 2020-7-29 22:32 被Snark编辑 ,原因:
    收藏
    免费 7
    支持
    分享
    最新回复 (9)
    雪    币: 1385
    活跃值: (5609)
    能力值: ( LV3,RANK:25 )
    在线值:
    发帖
    回帖
    粉丝
    2
    我也想抢红包,,
    2020-7-30 08:55
    0
    雪    币: 232
    活跃值: (86)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    向大佬学习
    2020-7-30 09:32
    0
    雪    币: 729
    活跃值: (1195)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    4
    不错,学习一下.
    2020-7-30 09:44
    0
    雪    币: 105
    活跃值: (4608)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    5
    "然后在通过objection hook 对应view 观察发现" 这句话下面的图片码没打全
    2020-7-30 10:08
    0
    雪    币: 196
    活跃值: (391)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    app可以分享下吗
    2020-8-7 13:47
    0
    雪    币: 206
    活跃值: (84)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    7
    待楼主写个dy live抢红包
    2020-8-7 16:25
    0
    雪    币: 1
    活跃值: (41)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    8
    runnable.run();
    2020-9-28 10:23
    0
    雪    币: 576
    活跃值: (2035)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    9
    mark  感谢分享
    2021-7-29 14:43
    0
    游客
    登录 | 注册 方可回帖
    返回
    //