返回列表 发新帖

【游戏逆向】关于跳过广告领取奖励的解决策略

  [复制链接]

90

主题

4149

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
6201
好评
120
信誉
146

考神MT论坛新人MT论坛最佳新人MT论坛活跃会员MT论坛侠客

发表于 2024-11-29 14:46:39 来自手机  | 显示全部楼层 | 阅读模式  来自 湖北
本帖最后由 弥天 于 2024-11-29 14:46 编辑

好久没发帖了,是的,我还活着
一直想试着去实现一下这类功能,但没有太多"理由"去实践,闲逛时看到了这篇求助
求助帖:一个小游戏
OK嗷,是我想要玩的游戏(x),盘它!
经过我一天的从无到有的分析(实际有效分析不超过2h),终于完成了(软件的广告执行流程也了解的差不多了),话不多说,教程开始。
软件没有加固,也没有校验,适合新手
根据题主的布局定位我们直接去这个类里面看看,直接就是一个转java
很快嗷,我就看到了这个类

English不是很好的同学可以看这里

是不是瞬间就一目了然了
接下来就思路清晰了,有传参,看看调用

就一个,直接进去看看

嗯,这就是广告的部分相关流程了

很明显这个方法的逻辑就是在广告播放结束后重启游戏音乐,然后给我们奖励
那么this.this$1.this$0.m_bRewardedVideoVerify的值就显得尤为重要了,函数在调用完dGameAppAndroidActivity.Instance.OnRewardedVerify这个方法后
又将m_bRewardedVideoVerify的值更改为false,很显然如果这个值为真,那么就会给我们奖励
所以我们重新回到OnRewardedVerify函数
  1. public class dGameAppAndroidActivity extends Activity {
  2.     public void OnRewardedVerify(boolean z) {
  3.         this.m_webView.loadUrl("javascript:window.rewardedVideoVerifyed(" + z + ")");
  4.     }
  5. }
复制代码
boolean 值,我们直接改true试试结果
  1. public class dGameAppAndroidActivity extends Activity {
  2.     public void OnRewardedVerify(boolean z) {
  3.         this.m_webView.loadUrl("javascript:window.rewardedVideoVerifyed(true)");
  4.     }
  5. }
复制代码
保存签名安装,点击触发看看(懒得搞gif动图那套,给你们说说得了)
这个游戏的广告,前两到三次会给你一个可以跳过的广告,跳过会弹出弹窗,我们点击放弃奖励就会返回游戏界面(正常情况下也不会有奖励)
那么我们修改以后再试试呢

成功获得奖励(图片转的gif将就着看,懒得录视频)
那么我们就可以确定了,直接将OnRewardedVerify方法写死,这样也不需要赋值调用了


直接复制invoke到广告被调用之前,最理想的就是获取到点击事件,在onclick监听触发后就执行我们的代码
这就结束了?不不不!
这个app的onclick不是button!它是一个webview!(两个坑之一,另一个是沟槽的loadUrl("javascript:window.rewardedVideoVerifyed(true)"))
是的,这个app并不是一个完整的javaapp,他的广告部分是通过Java实现的,而游戏则全采用的JavaScript(沟槽的害我定位到构式穿山甲无敌内置广告apk里面了)
回归正题,onclik找不到那我们就只能退而求其次找广告调起的函数了
怎么找呢?

直接通过OnRewardedVerify奖励事件一步一步找调用不就好了☝️第一次调用

之前定位的adclose,在广告播放完成后执行,时机靠后
第二次调用

adload,在ad请求后执行load,时机靠后
第三次调用

requestad,ad请求,修改此处刚刚好,时机完美
我们进去看看流程
  1. public class myPlayableTT extends myPlayable {
  2.     protected void requestRewardedVideo() {
  3.         if (myConfig.TT_REWARDED_ID.length() == 0) {
  4.             return;
  5.         }
  6.         long currentTimeMillis = System.currentTimeMillis();
  7.         long j = this.m_nRequestRewardedTime;
  8.         if (j <= 0 || currentTimeMillis >= j + 10000) {
  9.             this.m_nRequestRewardedTime = currentTimeMillis;
  10.             AdSlot build = new AdSlot.Builder().setCodeId(myConfig.TT_REWARDED_ID).setSupportDeepLink(true).setAdCount(1).setImageAcceptedSize(1080, 1920).setUserID("user123").setOrientation(this.m_activity.getRequestedOrientation() == 0 ? 2 : 1).setMediaExtra("media_extra").setAdLoadType(this.m_bFirstRequestRV ? TTAdLoadType.LOAD : TTAdLoadType.PRELOAD).build();
  11.             this.m_bFirstRequestRV = false;
  12.             Log.i("TTAds", "requestingRewardedVideo " + myConfig.TT_REWARDED_ID);
  13.             this.mTTAdNative.loadRewardVideoAd(build, new myPlayableTT$5(this));
  14.         }
  15.     }
  16. }
复制代码
先是一个简单的广告id判断,为空则未准备好
然后就是获取当前请求广告的时间戳,只有是第一次或者和上一次间隔10000以上才执行
里面就是普通的循环利用以及ad的构建,没什么太大的用处,就不讲解了(之前是有讲解的,但是我写完没保存,全没了....)
之后就调用了loadad
我们直接大手一挥,全部清空!
直接调用OnRewardedVerify就是干!
保存,签名,安装,闪退!
哈哈,我已经猜到了,谨慎的trace过后发现是没有初始化.....
好好好不愧是沟槽的this.m_webView.loadUrl("javascript:window.rewardedVideoVerifyed(true)")啊
找到m_webView的初始化

在同类下的Login函数中,那么我们再把Login函数的调用再加上不久好啦!
invoke,保存,签名,安装,闪退!
再次进行谨小慎微的trace
原来是requestRewardedVideo函数所在的myPlayableTT类没有实现这两个函数的实例,这还不简单,创建一个不就好了?
创建一个activity实例变量作为引用
  1. .field private activity:Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;
复制代码
结果沟槽的init函数没有任何传参,我还得自己写个函数去初始化
  1. public class myPlayableTT extends myPlayable {
  2.     public myPlayableTT() {
  3.         this.m_bShowing = false;
  4.         this.m_bInterstitialReady = false;
  5.         this.m_bBannerNeedRetryRequest = false;
  6.         this.m_bSplashShowing = false;
  7.         this.m_nRVRetryCount = 2;
  8.         this.m_nSplashRetryCount = 2;
  9.         this.m_bFirstRequestRV = true;
  10.     }
  11. }
复制代码
初始化函数
  1. .method public setActivity(Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;)V
  2.     .registers 2

  3.     iput-object p1, p0, Lcom/createmaster/dgame/dGameAppAndroidCore/myPlayableTT;->activity:Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;

  4.     return-void
  5. .end method
复制代码
最后再进行调用
  1. .method protected requestRewardedVideo()V
  2.     .registers 6

  3.     iget-object v1, p0, Lcom/createmaster/dgame/dGameAppAndroidCore/myPlayableTT;->activity:Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;

  4.     if-eqz v1, :cond_a

  5.     invoke-virtual {v1}, Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;->Login()V

  6.     invoke-virtual {v1}, Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;->OnRewardedVerify()V

  7.     :cond_a
  8.     return-void
  9. .end method
复制代码
这次总该没问题了吧
保存,签名,安装,不闪退!
但是

沟槽的广告加载中,但是这个弹窗似乎可以定位到?

嘿嘿,定位到函数,只是一个show,找调用

转java
  1. public class dGameAppAndroidActivity extends Activity {
  2.     public void Login() {
  3.         WebView.setWebContentsDebuggingEnabled(true);
  4.         WebView webView = new WebView(this);
  5.         this.m_webView = webView;
  6.         WebSettings settings = webView.getSettings();
  7.         settings.setCacheMode(2);
  8.         settings.setJavaScriptEnabled(true);
  9.         settings.setAppCacheEnabled(false);
  10.         settings.setSupportZoom(false);
  11.         settings.setDomStorageEnabled(true);
  12.         settings.setDatabaseEnabled(true);
  13.         settings.setJavaScriptCanOpenWindowsAutomatically(true);
  14.         settings.setDatabasePath(getApplicationContext().getCacheDir().getAbsolutePath());
  15.         settings.setAllowUniversalAccessFromFileURLs(true);
  16.         settings.setAllowFileAccess(true);
  17.         settings.setMediaPlaybackRequiresUserGesture(false);
  18.         settings.setAllowFileAccessFromFileURLs(true);
  19.         this.m_webView.setWebChromeClient(new dGameAppAndroidActivity$2(this));
  20.         this.m_webView.addJavascriptInterface(new JSApis(this), "androidJSApis");
  21.         setContentView(this.m_webView);
  22.         this.m_showRewardedHandler = new dGameAppAndroidActivity$3(this);
  23.         this.m_webView.setVisibility(8);
  24.         this.m_webView.setVisibility(4);
  25.         this.m_webView.setWebViewClient(new dGameAppAndroidActivity$4(this));
  26.         this.m_webView.setBackgroundColor(0);
  27.         this.m_webView.loadUrl("http://127.0.0.1/index.html");
  28.     }
  29. }
复制代码
原来这个沟槽的在Login里面初始化,我说呢,直接删除
  1. public void Login() {
  2.         WebView.setWebContentsDebuggingEnabled(true);
  3.         WebView webView = new WebView(this);
  4.         this.m_webView = webView;
  5.         WebSettings settings = webView.getSettings();
  6.         settings.setCacheMode(MSGTYPE_SHOWINTERSTITIALVIDEO);
  7.         settings.setJavaScriptEnabled(true);
  8.         settings.setAppCacheEnabled(false);
  9.         settings.setSupportZoom(false);
  10.         settings.setDomStorageEnabled(true);
  11.         settings.setDatabaseEnabled(true);
  12.         settings.setJavaScriptCanOpenWindowsAutomatically(true);
  13.         settings.setDatabasePath(getApplicationContext().getCacheDir().getAbsolutePath());
  14.         settings.setAllowUniversalAccessFromFileURLs(true);
  15.         settings.setAllowFileAccess(true);
  16.         settings.setMediaPlaybackRequiresUserGesture(false);
  17.         settings.setAllowFileAccessFromFileURLs(true);
  18.         this.m_webView.setWebChromeClient(new dGameAppAndroidActivity$2(this));
  19.         setContentView(this.m_webView);
  20.         this.m_showRewardedHandler = new dGameAppAndroidActivity$3(this);
  21.         this.m_webView.setVisibility(8);
  22.         this.m_webView.setVisibility(MSGTYPE_SHOWBANNER);
  23.         this.m_webView.setWebViewClient(new dGameAppAndroidActivity$4(this));
  24.         this.m_webView.setBackgroundColor(0);
  25.         this.m_webView.loadUrl("http://127.0.0.1/index.html");
  26.     }
复制代码
保存,签名,安装,不闪退!

成功!!!!
教程完结,一个辣鸡小游戏居然敢耗费我这么久的宝贵时间,你的弥天大大今晚就要狠狠的玩弄你的螺丝和螺孔!!!!
懒得总结了,你们自己总结一下吧
已有8人评分好评 金币 理由
(◔◡◔) + 1
cxp521 + 1 + 1 很给力!
龙一 + 1 赞一个!
尧. + 1 + 1
wowoa + 1 + 1
恩熙 + 1 + 1 勾槽定侓
北风吹纷飞 + 1 + 1
cuicui + 1 + 1 牛逼

查看全部评分 总评分:好评 +6  金币 +8 

本帖被以下淘专辑推荐:

回复

使用道具 举报

90

主题

4149

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
6201
好评
120
信誉
146

考神MT论坛新人MT论坛最佳新人MT论坛活跃会员MT论坛侠客

发表于 2024-11-29 14:47:05 来自手机  | 显示全部楼层  来自 湖北
自己的帖子,占个沙发没毛病
已有2人评分好评 金币 理由
龙一 + 1 优秀工程师
灵殖shik + 1 + 1

查看全部评分 总评分:好评 +1  金币 +2 

回复

使用道具 举报

133

主题

2336

回帖

9104

积分

硕士生

Rank: 6Rank: 6

金币
3832
好评
87
信誉
105
发表于 2024-11-29 14:53:27 来自手机  | 显示全部楼层  来自 辽宁
本帖最后由 小奶瓶 于 2024-11-29 14:58 编辑

感谢分享高质量教程,虽然可能看不懂学不会但是也要支持一下!
回复

使用道具 举报

229

主题

9647

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
2985
好评
27
信誉
91

考神MT论坛新人MT论坛活跃会员

发表于 2024-11-29 14:54:42 来自手机  | 显示全部楼层  来自 广东
看看看看
回复

使用道具 举报

6

主题

2312

回帖

6903

积分

硕士生

Rank: 6Rank: 6

金币
3744
好评
5
信誉
100
发表于 2024-11-29 14:56:16 来自手机  | 显示全部楼层  来自 贵州
看看
回复

使用道具 举报

9

主题

757

回帖

2526

积分

大学生

喵喵喵

Rank: 5Rank: 5

金币
1892
好评
2
信誉
100

MT论坛最佳新人MT论坛新人MT论坛帅哥

发表于 2024-11-29 14:57:24 来自手机  | 显示全部楼层  来自 广东
看看隐藏
回复

使用道具 举报

25

主题

4635

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1800
好评
2
信誉
121

考神MT论坛新人

发表于 2024-11-29 15:05:40 来自手机  | 显示全部楼层  来自 陕西
感谢分享
回复

使用道具 举报

18

主题

1722

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3607
好评
30
信誉
104

考神MT论坛新人MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2024-11-29 15:08:14 | 显示全部楼层  来自 陕西
看看隐藏
回复

使用道具 举报

13

主题

2146

回帖

7483

积分

硕士生

Rank: 6Rank: 6

金币
3570
好评
0
信誉
95

考神MT论坛新人

发表于 2024-11-29 15:08:23 | 显示全部楼层  来自 江苏
感谢分享
回复

使用道具 举报

152

主题

7921

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
11462
好评
10
信誉
104

MT论坛最佳新人考神MT论坛新人MT论坛帅哥

发表于 2024-11-29 15:16:03 来自手机  | 显示全部楼层  来自 云南
看看隐藏
回复

使用道具 举报

11

主题

642

回帖

3363

积分

大学生

Rank: 5Rank: 5

金币
1779
好评
6
信誉
107
发表于 2024-11-29 15:17:01 来自手机  | 显示全部楼层  来自 上海
看看学习
回复

使用道具 举报

14

主题

8108

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
10724
好评
22
信誉
101

2018国庆快乐2018国庆节MT论坛帅哥考神MT论坛新人MT论坛最佳新人MT论坛活跃会员

发表于 2024-11-29 15:17:30 来自手机  | 显示全部楼层  来自 江苏
看看如何
回复

使用道具 举报

61

主题

3486

回帖

1万

积分

博士生

轻音永不毕业

Rank: 7Rank: 7Rank: 7

金币
3499
好评
2
信誉
100

MT论坛新人考神

发表于 2024-11-29 15:17:42 来自手机  | 显示全部楼层  来自 广西
学习学习
回复

使用道具 举报

56

主题

656

回帖

1738

积分

高中生

NT_

Rank: 4

金币
459
好评
1
信誉
94

考神

QQ
发表于 2024-11-29 15:24:22 来自手机  | 显示全部楼层  来自 江苏–昆山
看看教程
回复

使用道具 举报

2

主题

2759

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1432
好评
0
信誉
100
发表于 2024-11-29 15:25:45 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表