|
|
发表于
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函数
- public class dGameAppAndroidActivity extends Activity {
- public void OnRewardedVerify(boolean z) {
- this.m_webView.loadUrl("javascript:window.rewardedVideoVerifyed(" + z + ")");
- }
- }
复制代码 boolean 值,我们直接改true试试结果
- public class dGameAppAndroidActivity extends Activity {
- public void OnRewardedVerify(boolean z) {
- this.m_webView.loadUrl("javascript:window.rewardedVideoVerifyed(true)");
- }
- }
复制代码 保存签名安装,点击触发看看(懒得搞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请求,修改此处刚刚好,时机完美
我们进去看看流程
- public class myPlayableTT extends myPlayable {
- protected void requestRewardedVideo() {
- if (myConfig.TT_REWARDED_ID.length() == 0) {
- return;
- }
- long currentTimeMillis = System.currentTimeMillis();
- long j = this.m_nRequestRewardedTime;
- if (j <= 0 || currentTimeMillis >= j + 10000) {
- this.m_nRequestRewardedTime = currentTimeMillis;
- 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();
- this.m_bFirstRequestRV = false;
- Log.i("TTAds", "requestingRewardedVideo " + myConfig.TT_REWARDED_ID);
- this.mTTAdNative.loadRewardVideoAd(build, new myPlayableTT$5(this));
- }
- }
- }
复制代码 先是一个简单的广告id判断,为空则未准备好
然后就是获取当前请求广告的时间戳,只有是第一次或者和上一次间隔10000以上才执行
里面就是普通的循环利用以及ad的构建,没什么太大的用处,就不讲解了(之前是有讲解的,但是我写完没保存,全没了....)
之后就调用了loadad
我们直接大手一挥,全部清空!
直接调用OnRewardedVerify就是干!
保存,签名,安装,闪退!
哈哈,我已经猜到了,谨慎的trace过后发现是没有初始化.....
好好好不愧是沟槽的this.m_webView.loadUrl("javascript:window.rewardedVideoVerifyed(true)")啊
找到m_webView的初始化

在同类下的Login函数中,那么我们再把Login函数的调用再加上不久好啦!
invoke,保存,签名,安装,闪退!
再次进行谨小慎微的trace
原来是requestRewardedVideo函数所在的myPlayableTT类没有实现这两个函数的实例,这还不简单,创建一个不就好了?
创建一个activity实例变量作为引用
- .field private activity:Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;
复制代码 结果沟槽的init函数没有任何传参,我还得自己写个函数去初始化
- public class myPlayableTT extends myPlayable {
- public myPlayableTT() {
- this.m_bShowing = false;
- this.m_bInterstitialReady = false;
- this.m_bBannerNeedRetryRequest = false;
- this.m_bSplashShowing = false;
- this.m_nRVRetryCount = 2;
- this.m_nSplashRetryCount = 2;
- this.m_bFirstRequestRV = true;
- }
- }
复制代码 初始化函数
- .method public setActivity(Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;)V
- .registers 2
- iput-object p1, p0, Lcom/createmaster/dgame/dGameAppAndroidCore/myPlayableTT;->activity:Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;
- return-void
- .end method
复制代码 最后再进行调用
- .method protected requestRewardedVideo()V
- .registers 6
- iget-object v1, p0, Lcom/createmaster/dgame/dGameAppAndroidCore/myPlayableTT;->activity:Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;
- if-eqz v1, :cond_a
- invoke-virtual {v1}, Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;->Login()V
- invoke-virtual {v1}, Lcom/createmaster/dgame/dGameAppAndroidCore/dGameAppAndroidActivity;->OnRewardedVerify()V
- :cond_a
- return-void
- .end method
复制代码 这次总该没问题了吧
保存,签名,安装,不闪退!
但是

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

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

转java
- public class dGameAppAndroidActivity extends Activity {
- public void Login() {
- WebView.setWebContentsDebuggingEnabled(true);
- WebView webView = new WebView(this);
- this.m_webView = webView;
- WebSettings settings = webView.getSettings();
- settings.setCacheMode(2);
- settings.setJavaScriptEnabled(true);
- settings.setAppCacheEnabled(false);
- settings.setSupportZoom(false);
- settings.setDomStorageEnabled(true);
- settings.setDatabaseEnabled(true);
- settings.setJavaScriptCanOpenWindowsAutomatically(true);
- settings.setDatabasePath(getApplicationContext().getCacheDir().getAbsolutePath());
- settings.setAllowUniversalAccessFromFileURLs(true);
- settings.setAllowFileAccess(true);
- settings.setMediaPlaybackRequiresUserGesture(false);
- settings.setAllowFileAccessFromFileURLs(true);
- this.m_webView.setWebChromeClient(new dGameAppAndroidActivity$2(this));
- this.m_webView.addJavascriptInterface(new JSApis(this), "androidJSApis");
- setContentView(this.m_webView);
- this.m_showRewardedHandler = new dGameAppAndroidActivity$3(this);
- this.m_webView.setVisibility(8);
- this.m_webView.setVisibility(4);
- this.m_webView.setWebViewClient(new dGameAppAndroidActivity$4(this));
- this.m_webView.setBackgroundColor(0);
- this.m_webView.loadUrl("http://127.0.0.1/index.html");
- }
- }
复制代码 原来这个沟槽的在Login里面初始化,我说呢,直接删除
- public void Login() {
- WebView.setWebContentsDebuggingEnabled(true);
- WebView webView = new WebView(this);
- this.m_webView = webView;
- WebSettings settings = webView.getSettings();
- settings.setCacheMode(MSGTYPE_SHOWINTERSTITIALVIDEO);
- settings.setJavaScriptEnabled(true);
- settings.setAppCacheEnabled(false);
- settings.setSupportZoom(false);
- settings.setDomStorageEnabled(true);
- settings.setDatabaseEnabled(true);
- settings.setJavaScriptCanOpenWindowsAutomatically(true);
- settings.setDatabasePath(getApplicationContext().getCacheDir().getAbsolutePath());
- settings.setAllowUniversalAccessFromFileURLs(true);
- settings.setAllowFileAccess(true);
- settings.setMediaPlaybackRequiresUserGesture(false);
- settings.setAllowFileAccessFromFileURLs(true);
- this.m_webView.setWebChromeClient(new dGameAppAndroidActivity$2(this));
- setContentView(this.m_webView);
- this.m_showRewardedHandler = new dGameAppAndroidActivity$3(this);
- this.m_webView.setVisibility(8);
- this.m_webView.setVisibility(MSGTYPE_SHOWBANNER);
- this.m_webView.setWebViewClient(new dGameAppAndroidActivity$4(this));
- this.m_webView.setBackgroundColor(0);
- this.m_webView.loadUrl("http://127.0.0.1/index.html");
- }
复制代码 保存,签名,安装,不闪退!

成功!!!!
教程完结,一个辣鸡小游戏居然敢耗费我这么久的宝贵时间,你的弥天大大今晚就要狠狠的玩弄你的螺丝和螺孔!!!!
懒得总结了,你们自己总结一下吧
|
-
查看全部评分
总评分:好评 +6
金币 +8
|