0x00 背景

最近看到一个小游戏,但是它使用了supersonicads的sdk,广告极其多,非常烦,所以我就逆向了一下它,顺便分析了一下supersonicads的工作原理。

0x01 supersonic广告sdk分析

首先贴一下该sdk的用法:Rewarded Video Integration for Android。简单地总结一下,就是在需要显示广告的时候调用mMediationAgent.showRewardedVideo(placementName);,然后在回调函数onRewardedVideoAdRewarded实现自己想要给予用户的奖励。在我这次逆向的游戏中,如果你没有star无法进行游戏了,该游戏就会调用showRewardedVideo给你播放一部视频广告,然后播完广告后给你回复一颗star,你才能继续游戏。

很自然地,我想到先分析showRewardedVideo这个函数,于是我下载了supersonic的sdk,然后在

这个网站http://www.javadecompilers.com/result上反编译了一下。我分析了很久源码,发现showRewardedVideo这个函数最终会调用到com.supersonicads.sdk.controller.SupersonicWebView的showRewardedVideo,该函数定义如下:

其中injectJavascript会生成一段javascript,并用webview来load它。这段javascript会调用游戏加载时已经下载好的一段javascript中的showRewardedVideo函数。这段js函数由mobileController.html这个html加载,名字为http://supersonicads-a.akamaihd.net/mobileSDKController/versions/2.0.10/sdk_controller.min.gz.js。该js使用了一个叫做PubSubJS的库,使用该库注册一个showRewardedVideo接口,然后由刚刚的webview来调用这个接口。当webview播放完动画后,会调用t.callSDKFunction("adCredited",e,"adCreditedSuccess","adCreditedFailed")这段js来触发java的native方法adCredited。该函数是被导出成javascript的接口的:

接下来该函数调用mOnRewardedVideoListener.onRVAdCredited,这里com.supersonic.adapters.supersonicads.SupersonicAdsAdapter实现了OnRewardedVideoListener这个接口,并实现了onRVAdCredited方法,如下:

可以看到,这个方法又会调用this.mRewardedVideoManager.onRewardedVideoAdRewarded(placement, this);,触发onRewardedVideoAdRewarded事件。

以上就是supersonic广告sdk播放一个rewardedVideo的周期。

然而,理想是丰满的,现实是骨感的,当我发现了它的原理后,我尝试使用burp进行截取sdk_controller.min.gz.js并进行修改,却发现只有前两次好像修改有了效果,之后无论怎么修改该js都没有效果,甚至把该js文件删了广告都照样播放...这个让我的分析一度停止了一个多星期。

好在今天,我有终于了新的进展。我发现supersonic它不光只使用了它自己的sdk,还整合了很多别家的广告sdk、接口,比如“applovin”,“chartboost”,“flurry”,“vungle”,“adcolony”等等。而这些广告sdk只要实现一个com.supersonic.mediationsdk.AbstractAdapter,就能在showRewardedVideo触发时被调用到。

由于时间问题,我无法分析所有这些sdk,只分析了“applovin”的sdk。

0x02 applovin广告sdk分析

在com.supersonic.adapters.applovin的AppLovinAdapter类中,有showRewardedVideo函数如下:

可以看到该函数会调用mAppLovinRV.show(),跟踪此show函数来到com.applovin.adview的AppLovinIncentivizedInterstitial类中,发现下面的代码:

至此一经开始受到proguard的混淆的影响了,不过我们仍然可以用jd-gui跟踪下去,来到com.applovin.impl.sdk z类的a函数:

注意看该函数调用了一个b函数:

该b函数又调用了localAppLovinInterstitialAdDialog.showAndRender(localAppLovinAdImpl),此showAndRender函数为虚函数,我们要找到它实现的地方,发现它的实现在com.applovin.impl.adview的af类中:

注意到它启动了一个AppLovinInterstitialActivity Activity,这个Activity在com.applovin.adview包中,发现它里面有一些MediaPlayer的启动与关闭代码,bingo,这个Activity就是用来播放广告的了。

注意到它的c函数:

里面调用了setOnCompletionListener(new k(this)),我们追踪这个k类,它在com.applovin.adview包中:

我们发现它又调用回了AppLovinInterstitialActivity的a函数,该a函数如下:

注意到它调用了videoPlaybackEnded函数,这个函数也是个虚函数,我们来找一下它被实现的地方,在com.supersonic.adapters.applovin的AppLovinAdapter类中:

bingo,正是它触发了onRewardedVideoAdRewarded函数!

到此为止,“AppLovin”的一个广告周期我们也分析完了。下面说一下我是如何发现supersonic会调用不同adapter的。

0x03 java无源码调试

比较简单的方法为

adb forward tcp:9999 jdwp:[pid]

jdb -attach localhost:9999

即可。然后可以使用stop in来设置断点在函数上。

另一种方法是将dex反编译成.java文件后,启动android studio,新建一个空项目,然后把生成的.java文件全部拷贝到项目src里。之后启动你的app,然后点击“attach debugger”即可。

这个好处是你可以直接在反编译的代码上加上断点。不过虽然断点是准确的,但是当你真正debug的时候其实代码是跑偏的,毕竟只是反编译出来的,行数什么的都是不对的。

虽然这两种方法都不是很好用,但是可以通过下断点显示函数的调用栈来获得不少信息,对于这次的分析来说是勉强够用了。我就是通过函数的调用栈发现了每次会调用不同的广告sdk接口。如果有什么可以debug smali或者bytecode的方法还请联系我! 我发现用jeb可以很方便地debug smali,有可能需要设置setprop ro.debuggable 1,不然jeb无法attach进程。

0x04 去广告

这里就进入正题了,但是不好意思,大家看了那么多分析,其实对于去广告并没有什么用处,哈哈。我去广告的方法还是通过分析游戏的so文件来进行的。游戏的so文件里有一个proceedSelectedGameMode函数,该函数中判断了star的数量够不够,如果不够,则调用startVideo函数显示广告。

我们只要将此处star的数量的判断改成永真即可不显示广告。

0x05 更多的一点分析

其实我还分析了一下so文件是如何和java的函数进行互相调用的。

比如刚刚的startVideo函数,进一步跟踪,发现它调用了showRewardVideoJNI函数,该函数如下:

我们看到这个函数使用了cocos2d的JniHelper来调用java函数,且它调用的是SuperSonicXBridge的showRewardVideo函数,该SuperSonicXBridge类调用了SuperSonicXBridge$1这个内部类,由该内部类调用了真正的supsersonic的showRewardVideo接口:

接下来分析广告播放完后的情况。在SupersonicXBridge中有如下函数:

这个函数毫无疑问会在广告结束后调用,该函数是一个JNI函数,我们来看它在so文件中的定义:

我们看到这个函数会调用一个v5,v5是v4这个对象的vptr+16处的函数。v4这个对象应该是SupersonicXDelegate的子类对象。我们先看一下SupersonicXDelegate这个类的虚表:

我们可以看到,0x526d78+0xa=0x526d88处正好是函数supersonicRVAdRewarded。接下来我们看一下GameModeScene这个类的虚表:

可以看到同样有函数supersonicRVAdRewarded。看一下这个函数的定义:

这个函数又调用了supersonicClose,supersonicClose的定义如下:

它调用了setUserRewarded这个函数,给用户进行奖励。

至此,整个广告播放过程也就结束了。

0x06 总结

本文分析了一下supersonic这个广告sdk的实现,大家有空可以分析一下今天没有提到的几个adapter,它们有的可能是用native java实现的,有的可能又用了webview实现,很有意思。

java 广告sdk开发_supersonicads广告sdk逆向分析以及无源码debug java相关推荐

  1. 【Android SDK 开发】Android SDK开发技术分享

    原文地址:https://blog.csdn.net/zhangxinjin/article/details/51602577 最近在工作中负责统一支付平台的SDK开发部分,就此总结下SDK开发的技术 ...

  2. JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  3. android手游sdk开发教程,Android SDK开发基本教程

    一.本文章总计460字,需要花费您5分钟时间进行阅读. A.先来理解SDK开发的基本流程.首先,在你的Project中新建一个module,指定为Android Library.再新建一个Activi ...

  4. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  5. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  6. java 安卓客户端开发_《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端...

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

  7. android逆向分析之从smali到java

    通过上一篇 android逆向分析之反编译,在dex2jar的前提下,我们获取到了源码,在apktool的前提下,我们可以获取到资源和smali文件,本篇主要讲述smali几个最基本的知识和smali ...

  8. Java基于ssm开发的校园超市系统超市商城源码超市网站

    简介 java使用ssm开发的校园超市系统,为方便学生不受时间限制,可以随时购物,不用到超市也能找到自己需要的日用品,开发了这个校园超市系统.学生用户可以注册浏览商品,加入购物车或者直接下单购买,在个 ...

  9. 华睿相机sdk 开发_相机SDK开发

    本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主体架构,然后将halcon的图像处理过程嵌套进去.所以做了一个basler相机采图并用halcon显示的demo,写这篇文章用于记录 ...

最新文章

  1. 事件绑定在IE下this是window的问题
  2. 包含重复数字序列的全排列Python解法
  3. 【debug】UnboundLocalError local variable a referenced before assignment
  4. 美联储降息首日:资本市场反向操作 道指狂泻800点
  5. html 页面怎么自动定位到某个标签,JS如何实现在页面上快速定位(锚点跳转问题)...
  6. hiho编程练习赛20
  7. 设计模式学习笔记(六:责任链模式)
  8. 试卷分析计算机基础,计算机基础试卷分析.doc
  9. mysql报错无效默认值1067_Mysql 报错:#1067
  10. 黑php的称呼,这三个称呼你都说对了吗?
  11. linux 配额不起作用,Linux 配额
  12. 安卓开发指南!程序员如何自我学习和成长?终获offer
  13. RAKsmart高防服务器怎么样
  14. 数模【数据的拟合方法-总结】【温度与电阻的关系模型、农业生产实验模型、血药浓度模型、化工氯气生产等级模型、人口预测模型】
  15. 什么是百度竞价包年?竞价包年骗局揭露
  16. m基于ACO蚁群优化的FCM模糊聚类算法matlab仿真
  17. 所有结点对的最短路径问题之Johnson算法
  18. 【AI学习总结】均方误差(Mean Square Error,MSE)与交叉熵(Cross Entropy,CE)损失函数
  19. 更快更稳更高效--Ubuntu Kylin 20.04 Pro SP1 正式发布
  20. 计算机组成原理——8086 CPU寄存器

热门文章

  1. TasNet端到端模型
  2. 学籍管理系统:详细设计说明书- -
  3. mongoDB——metadata之我见
  4. iPhone 导入照片显示时间不是拍摄时间
  5. 远程服务器登入信息,怎样查看服务器被远程登录的信息
  6. threejs+angular 实现面积测量
  7. 苹果 微信发件 服务器,如何使用iPhone自带的邮件客户端管理企业邮箱?
  8. 人工智能有哪些运用场景?有什么实际用途?
  9. ReentrantReadWriteLock、StampedLock
  10. cad绘制正八边形_CAD怎么画正八边形 看完你学会了么