小白的《盛名时刻表》APP去广告记录及点滴感悟(处女贴)
小白的《盛名时刻表》APP去广告记录及点滴感悟(处女贴)一.开始之前
1.广告是众多APP作者的一点辛劳慰藉,如果流量没问题,能帮着点点就点点吧。这篇记录仅处于学习交流的目的,无意侵害APP作者权益。
2.作为一名安卓逆向的小白,今天这个处女贴,目的是记录一款APP去广告的过程,和众多小白交流,小白以上层阶(少白、大白,小菜、大菜,小牛、大牛,大神)请略过。
3.所用样本是在论坛内一大神的帖子里见到的https://www.52pojie.cn/thread-383523-1-1.html。然后到APP自己官网上下载的最新版。
二.准备
1.android killer
2.随便一款模拟器,我用的夜神
3.样本——《盛名时刻表》V11.2 数据库版本2017.12.28(别问我为什么是12.28版本)
三.初试过程
拿到样本,放模拟器里跑一下,发现几处广告的位置第一处,启动软件时(第一次开没有),后来开才有
全屏广告,主体应该是接入的某个广告联盟,延时的(5秒);下边还有一个,是介绍APP自己官网的广告(或者是LOGO)。
第二处,
打开是一个淘宝的链接。这个是嵌在布局里的。另外这个页面使用说明里还有一丁点广告。
第三处,
订酒店这个地方,应该时接入去哪儿的接口,在打开的网页的最下方。3处广告,3种类型,说实话选这个样本有点后悔了。 再拿到androidkiller里反编译。。。。。能反编;
入口能打开看一下smali部分,不像有壳(其实只见过360壳smali的样子,这个不是,其他的壳啥样子也不知道,但这里内容很丰富,应该没错了)
回编,运行,能跑起来,OK,这个可以搞了。
1.尝试去除启动广告
启动广告是一开始就加载的,所以先不找关键点了,正向撸一撸捋一捋。先看AndroidManifest.xml ,这是必须的,因为广告在主页面之前全屏显示,肯定是一个活动,所有活动都要在AndroidManifest.xml里注册的。
在service找到两处带有DOWNLOAD的服务,高度怀疑。咋确定呢?百度一下。
原来这个是友盟推送的,AndroidManifest.xml里前边有很多umeng的活动,都是它的了。再百度百度umeng是个啥东西,还是不能确定这就是启动时的广告。搜另外一个TX的(qq.e):
这个妥妥的广告无疑了。题外:多看多见识多搜索,小白需要积累很多东西,像这个服务,如果锁定不了qq的关键词,只凭ads搜不到这个服务的,然后把qq.e记本本上。 现在找个突破点(如果没有找到就从程序开始顺着撸)。开始延时的界面上,“5秒跳过”是安卓原生提示框,搜一下“秒跳过”试试。
Splash ad 可以确定这就是初始加载广告了。 发现关键活动了,同时发现这个activitySplashad在Splash目录下。有一整个Splash目录,那一定要看看。
除了ActivitySplashAd,还有ActivitySplashDefault和ActivitySplashOwn。看到这里基本有数了,猜测应该是从程序入口到这里,Default应该是真正主界面(或者相关),ad是哪个联盟的广告,own猜测是全屏广告下部那个介绍APP自己官网的广告。 撸撸启动过程验证我们的想法。 到程序入口ActivityLauncher,查看JAVA源码,搜索上边三个活动,都有调用路径。再看具体在哪里,怎么调用的。ActivityLauncher的oncreate,没有多少内容,好像调用了父类,然后是ini()。Ini()部分内容:
这里有指向ActivitySplashDefault的出口。再追一下,Ini()里通过调用iniadsplash(),指向ActivitySplashAd;通过调用iniOwnSplash()指向ActivitySplashown。里面还有一些交叉调用,没理会,知道情况就好。 这里没有去费劲看那一堆源码,因为不懂JAVA看着费劲,大体浏览一遍,只看出口即可。同样的办法把三个splash也简单看一遍,Default、AD、OWN之间没有相互调用。这样,程序的启动逻辑就搞清楚了。ActivityLauncher可以分别指向Default、AD、OWN,可以启动后三者中的一个或多个,后三者相互之间没有调用。 具体修改,最适合我们小白的办法,刚才浏览的时候看到ActivitySplashAd里有这处:
几秒跳过的关键词也在这里,如果直接从关键词附近分析的话,也很容易找到。ActivitySplashown里类似:
猜测是两个时间的比对,延时的关键也就在这里了,搜一下minloadtime怎么定义的:
在oncreate()里,类一开始就定义了这个时间。那最简单的办法就是把minLoadTime改为0了,先改own里的。
把0X5改成0X0,保存,回编,运行,看效果。没有变化,失败了。再想一下,我们在广告里的确没见过“点击跳过”这几个字,有三种可能,own我们没改对、own的调用条件不具备,或者我们一开始的猜测是错的,这个own不是全屏广告底下那个APP官网广告。想了半天,没有想到验证这个own用途的好办法,暂时放弃。再改ActivitySplashAd里的,办法一样。保存,回编,运行,看效果。OK,广告没了,模拟器卡的时候会看到顶上一闪而过的“0秒跳过”。 这样启动全屏广告没了,最后结果只改了一个0X5。 虽然广告没了,但其实前边一大堆判断和调用,不够简洁。翻一翻程序入口ActivityLauncher里基本是计数器的初始化计算啥的,没有实质内容,我们干脆在andriodmanifest.xml里把程序入口由ActivityLauncher改为ActivitySplashDefault,把中间这一堆全跳过去。这样改有些风险,因为我们没弄明白ActivitySplashown到底啥用处,而从ActivitySplashDefault到ActivitySplashown是没有调用的。不过own基本内容跟AD那个很像,估计也不是啥好东西,一块剁掉试试。
把箭头处入口名换成ActivitySplashDefault,直接复制一下,改完:
保存,回编,运行,测试各个功能,没发现缺啥file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif。OK,成了。而且启动的确麻利了点。如果这里失败了呢?那就退一步,改ActivityLauncher的代码吧,把那一堆浪费资源的判断剁掉或者绕过去,直接给出default一个出口就行。
2.尝试去除第二处的淘宝广告
既然是淘宝的广告,笨办法搜一下taobao先。发现还不少
发现还不少。仔细看看,3处是友盟的,8处在一个agoo文件夹下边。这个agoo在andriodmanifest.xml里见到过,就是友盟。
那么这个淘宝广告其实就是友盟的广告了。从哪里入手呢?这处广告,其实就是一个控件,我们搜一搜控件名“智能鱼缸灯”。有了。
这是个布局文件,activity_more.xml。上下翻一翻,还有好多别的广告。这里在布局中把这一块内容删掉,不显示,也就达到目的了。为了确认一下,我们去找找代码看看。刚才搜taobao的时候,有个activitymore.smali就是它。(安卓开发好像布局都加这个_符号。。。)
看到一个taobao的网址,浏览器里打开一下,就是这个广告,下边那个网址,应该是广告计数结算用的。这里switch判断条件是一串数字,猜测是控件ID,killer里转成16进制搜索一下,果然有了,fishbaby。
好了,确定了,开始改。直接改布局。对布局文件不熟悉,那用笨办法,从中心向外删,注意标签有成对的别删单了就好。
因为注意到APP这处广告点开前有个很小的图片,把这个image标签一块删掉。回编运行一下。
这样修改就成功了,我们再完善下。
把这几个广告VIEW同样的方式从布局里去除掉,虽然不知道在哪里显示的。然后在ActivityMore.smali里,把代码去掉。
2131493024转16进制是0x7f0c00a0,搜一下,嗯是switch9。
同时在JAVA源码里看到上一个CASE里是检测有无安装安卓市场的,虽然不知道这个功能在哪,一块处理了。2131493019转16进制0x7f0c009b,switch8。把switch8和switch9里内容全清了,只剩goto出口。或者干脆把这两个分支剪掉。其中还有一个分支是软件更新的,如果想弄也在这里。
这个就处理完了,再处理使用说明里那一点点。从这个页面里随便找点词搜搜,我搜了“使用的是”
在strings里找到了注册的字符串,但这个不全,到“出行伙伴!”就正好结束了,没到广告的位置。没关系,再搜这个字符串的name,肯定有调用。搜explain,有了。
如果搜不到咋办呢?刚才我们在ActivityMore里处理的那一堆CASE,肯定是相邻或者相类似的按钮,使用说明和处理的taobao广告挨着,翻一翻。
这个CASE像,搜这个资源ID2131493016,找到name,再搜namepnl_introduct
的确是使用说明,那么这个CASE调用的ActivityAbout就是了,浏览一下,也能定位。在ActivityAbout的xml布局文件里,把相关的4行textview删掉,还有二维码和微博的图片,附近找imageview,只找到一个离得近的(另一个离得也近但明显不是),删掉。回编,看效果。
好了。
3.第三处去哪儿的广告。《站站查询》的机票按钮,《订火车票》的酒店按钮,都会出现广告。前一个是嵌入打开的网页页面的,机票广告,后一个是在打开网页页面底部的广告栏,去哪儿的广告。怀疑这两个都是去哪儿接口自带的广告,既想留功能又想去广告,小白表示无力弄不了了,有大神看到的话指点指点。本次记录就成为半成品了。
四.完善
两个目标。1.TX广告我们已经去掉了,把它的组件砍干净。2.去掉软件更新。友盟这个,因为不光推广告,还有统计功能,嵌入太深。到UM官网了转一圈,发现很多活动都要加调用,内部的调用太多;搜搜工程,里面资源文件加上smali文件1000多个。
作为小白,处理起来太繁琐,也难免出错,不弄了,,以后用空慢慢再试试瘦身手术。到AndroidManifest.xml里把所有umeng的活动、服务全删掉拉倒了。)
1.砍组件。把上一步生成的APK留一份,防止砍过头了。A.砍程序入口处。ActivityLauncher。搜一下哪里调用
一个自身,一个错误处理。自身整个文件删掉,错误处理里把这一句替换成现在的入口ActivitySplashDefault(不知道这样处理好不好)。搜ActivitySplashAd。AndroidManifest.xml里删掉注册这个活动的这一行,其他3个smali文件(带$的是子类)直接删掉。
ActivitySplashown同样处理(这个一开始就没拿准,但搜了下没有调用这个类的)。
只剩default了。测试一下,程序正常运行,嘿嘿。B.砍TX广告。还记得开始我们搜qq.e确定tx广告么,搜索结果里有篇博文是教怎么植入tx广告的,我们去学习一下,因为不知道有哪些库文件啊。
找到一个架包跟这个很像,gdtadv2就是它了,工程内搜一下这个文件名,看有没有引用。。。只有smali中qq/e下有,这个文件夹要整个删的。。。把gdtadv2.jar文件删掉。
到smali文件夹中找到qq/e,整个删掉。工程内搜索qq.e关键字,涉及的内容删掉。也没多少了,只剩服务和活动声明了,估计都在qq/e里呢。到这里回编测试一下,OK,大体点了点各个功能都没问题。 2.改更新。之前的修改中,我们已经知道软件更新功能的关键位置了,在activitymore。在JAVA里撸一撸。当时我们发现,是在一处按钮监听的一个CASE里,也就是说,是手动更新的。找一找有没有自动更新功能,果然有个autoCheckUpdate()。
但是很奇怪,从activitymore的oncreate往这个函数撸,撸不到,不能启动就没法自动更新啊。全局搜一下autoCheckUpdate(),看看软件启动的时候有没有调用。。。额。。。坑啊,别处还有一个定义同名方法的。
在这个smskb类里,貌似能从oncreate撸到autocheckupdate…..(JAVA反编的好像不准确,JAVA又不懂,大概是)。那去找这个smskb类是不是启动时调用了。搜索一下,果然ActivitySplashDefault用一个showMainScr()方法撸过来。这里有坑,而我们用的又是最新版本,只好又去下了一个20171210的版本测试,果然启动后点“更多”,就跳出更新框了,没等我们去点软件更新那个按钮。如果取消,更多选项卡就进不去了。蛋疼,早知道用旧版本搞了。原谅我,我是小白。
观察smskb里autocheckupdate的代码,图65眼力定位到这里
一个if判断,直接改 goto/16 :cond_0,跳走。用旧版软件测试,不自动更新了。到activitymore那儿,看看当时那一堆CASE。嗯,这个调用autocheckupdate的就是那个更新按钮了
到smali里搜一下,是switch1,把这个分支清空。
我们已经把更新的功能去掉了,到布局文件里,把点击检查更新这几个字去掉,最后效果。
这样就不更新了,只显示版本号。
五.几点体会
1.小白中,零基础、没想过当大牛、只是感兴趣所以来学逆向的应该还是占很大比例,如我。这种情况选择学习路径很重要,需要处理好学理论和动手实践的关系。建议从对着最简单的静态smali帖子和教程,动手学起入门,一定要动手,因为我们本来就没理论。在一个小小的领域练习、熟悉到一定程度,得考虑专题化补理论基础,因为没理论稍微一点问题就被难住,比如练习改smali一段时间,可以系统学一下smali语法、apk内大体构架和各文件运作关系、xml文件各标签等等;对于跨领域、需要突破知识壁障的,建议触手式的接触练习一下就好,不宜去啃理论,比如这时候去啃arm汇编指令、地址偏移,就头大了(原来有其他语言基础的另说)。
2.练习中,有时找到突破点是有偶然性的,这种如果找到突破点改完就拉倒,提升效果有限。修改成功后,可以回过头来捋一捋,多熟悉程序的运作过程,争取多把偶然的变成必然的、心中有数的,能提高静态分析的能力。
3.记笔记,任何知识点都记下来,任何经验点都记下来。作为小白欠缺的是基础,这些一句话两句话的知识点经验点就是最好的弥补。然后还要多翻看反编的工程,遇到不熟悉的东西搜索一下,是管啥的,然后记下来。
样本链接:https://pan.baidu.com/s/1eSPIcaI 密码:zepc
抱歉,经@aaa981226 提醒,修改完的成品在夜神里没问题,但在真机和其他模拟器里出错。链接里不再放成品了,如有照贴修改的请注意,可能是最后砍东西的时候出了差错,再次抱歉。 aaa981226 发表于 2017-12-19 12:22
安装了楼主第二个版本,安装完后,显示程序未安装,选择第三个版本安装后,提示更新,更新后,变成了官方的 ...
修改完的的确有问题,谢谢提醒。
如果自用,去广告的方法很简单,也说的很仔细了,自己动手改改就好。 非常感谢楼主,盛名一直使用中,感谢楼主去广告,我想问的是,楼主说我们已经把更新的功能去掉了,那以后怎么更新数据呀,因为这个软件数据更新是一项重要的环节 新手,发帖使用不熟悉,凑合着看吧{:1_909:} 做的非常的详细,学习了 本帖最后由 aaa981226 于 2017-12-19 12:06 编辑
另外楼主提供了三个版本,我下载哪一个呢 安装了楼主第二个版本,安装完后,显示程序未安装,选择第三个版本安装后,提示更新,更新后,变成了官方的原版 不明真相的围观群众~~~ʅ(´◔౪◔)ʃ 支持 楼主加油! 楼主不错,条理清晰