首页
论坛
课程
招聘
[原创]实现某app的抢红包功能
2020-7-29 22:32 6842

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

2020-7-29 22:32
6842

目录

 

目录

内容摘要

  • 写这个插件的原因是因为经常使用这个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. 接下来的话就是写代码 验证自己的猜想了 ,后来经过测试及调整 就有了如下代码:
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);
        }
    })
}

效果展示

  • 附几张效果图

最后总结

  • 最后得到的结论有这么几点:
    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只要收到红包消息就可以直接打开红包;只要一步就搞定了,相对来说是比较简单的了;
  • 本贴仅限学习交流使用,切勿用于非法行径,否则后果自付
  • 如有侵权,请联系作者删除

[公告]看雪技术峰会,技术大牛大型线下交流见面会,2020年10月23日 上海浦东喜来登由由大酒店!

最后于 2020-7-29 22:32 被Snark编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (7)
雪    币: 582
活跃值: 活跃值 (1147)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
supperlitt 活跃值 2020-7-30 08:55
2
0
我也想抢红包,,
雪    币: 230
活跃值: 活跃值 (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
学习_pyja 活跃值 2020-7-30 09:32
3
0
向大佬学习
雪    币: 734
活跃值: 活跃值 (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
spman 活跃值 2020-7-30 09:44
4
0
不错,学习一下.
雪    币: 102
活跃值: 活跃值 (386)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Imxz 活跃值 2020-7-30 10:08
5
0
"然后在通过objection hook 对应view 观察发现" 这句话下面的图片码没打全
雪    币: 212
活跃值: 活跃值 (79)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
乔瑞 活跃值 2020-8-7 13:47
6
0
app可以分享下吗
雪    币: 201
活跃值: 活跃值 (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxiaoyangg 活跃值 2020-8-7 16:25
7
0
待楼主写个dy live抢红包
雪    币: 1
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
千秋事佐闲茶 活跃值 2020-9-28 10:23
8
0
runnable.run();
游客
登录 | 注册 方可回帖
返回