吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7935|回复: 28
收起左侧

[Android 原创] 小白的《盛名时刻表》APP去广告记录及点滴感悟(处女贴)

[复制链接]
winding 发表于 2017-12-19 11:40
小白的《盛名时刻表》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版本)


三.初试过程
拿到样本,放模拟器里跑一下,发现几处广告的位置第一处,启动软件时(第一次开没有),后来开才有
2.jpg
全屏广告,主体应该是接入的某个广告联盟,延时的(5秒);下边还有一个,是介绍APP自己官网的广告(或者是LOGO)。
第二处,
5.jpg
打开是一个淘宝的链接。这个是嵌在布局里的。另外这个页面使用说明里还有一丁点广告。
26.jpg
第三处,
4.jpg
订酒店这个地方,应该时接入去哪儿的接口,在打开的网页的最下方。3处广告,3种类型,说实话选这个样本有点后悔了。 再拿到androidkiller里反编译。。。。。能反编;
6.jpg
入口能打开看一下smali部分,不像有壳(其实只见过360smali的样子,这个不是,其他的壳啥样子也不知道,但这里内容很丰富,应该没错了)
7.jpg
回编,运行,能跑起来,OK,这个可以搞了。


1.尝试去除启动广告
启动广告是一开始就加载的,所以先不找关键点了,正向撸一撸捋一捋。先看AndroidManifest.xml ,这是必须的,因为广告在主页面之前全屏显示,肯定是一个活动,所有活动都要在AndroidManifest.xml里注册的。
8.jpg
service找到两处带有DOWNLOAD的服务,高度怀疑。咋确定呢?百度一下。
9.jpg
原来这个是友盟推送的,AndroidManifest.xml里前边有很多umeng的活动,都是它的了。再百度百度umeng是个啥东西,还是不能确定这就是启动时的广告。搜另外一个TX的(qq.e):
10.jpg
这个妥妥的广告无疑了。题外:多看多见识多搜索,小白需要积累很多东西,像这个服务,如果锁定不了qq的关键词,只凭ads搜不到这个服务的,然后把qq.e记本本上。 现在找个突破点(如果没有找到就从程序开始顺着撸)。开始延时的界面上,“5秒跳过”是安卓原生提示框,搜一下“秒跳过”试试。
12.jpg
Splash ad 可以确定这就是初始加载广告了。 发现关键活动了,同时发现这个activitySplashadSplash目录下。有一整个Splash目录,那一定要看看。
13.jpg
除了ActivitySplashAd,还有ActivitySplashDefaultActivitySplashOwn。看到这里基本有数了,猜测应该是从程序入口到这里,Default应该是真正主界面(或者相关),ad是哪个联盟的广告,own猜测是全屏广告下部那个介绍APP自己官网的广告。 撸撸启动过程验证我们的想法。 到程序入口ActivityLauncher,查看JAVA源码,搜索上边三个活动,都有调用路径。再看具体在哪里,怎么调用的。ActivityLauncheroncreate,没有多少内容,好像调用了父类,然后是ini()Ini()部分内容:
14.jpg
这里有指向ActivitySplashDefault的出口。再追一下,Ini()里通过调用iniadsplash(),指向ActivitySplashAd;通过调用iniOwnSplash()指向ActivitySplashown。里面还有一些交叉调用,没理会,知道情况就好。 这里没有去费劲看那一堆源码,因为不懂JAVA看着费劲,大体浏览一遍,只看出口即可。同样的办法把三个splash也简单看一遍,DefaultADOWN之间没有相互调用。这样,程序的启动逻辑就搞清楚了。ActivityLauncher可以分别指向DefaultADOWN,可以启动后三者中的一个或多个,后三者相互之间没有调用。 具体修改,最适合我们小白的办法,刚才浏览的时候看到ActivitySplashAd里有这处:
15.jpg
几秒跳过的关键词也在这里,如果直接从关键词附近分析的话,也很容易找到。ActivitySplashown里类似:
16.jpg
猜测是两个时间的比对,延时的关键也就在这里了,搜一下minloadtime怎么定义的:
17.jpg
oncreate()里,类一开始就定义了这个时间。那最简单的办法就是把minLoadTime改为0了,先改own里的。
18.jpg
0X5改成0X0,保存,回编,运行,看效果。没有变化,失败了。再想一下,我们在广告里的确没见过“点击跳过”这几个字,有三种可能,own我们没改对、own的调用条件不具备,或者我们一开始的猜测是错的,这个own不是全屏广告底下那个APP官网广告。想了半天,没有想到验证这个own用途的好办法,暂时放弃。再改ActivitySplashAd里的,办法一样。保存,回编,运行,看效果。OK,广告没了,模拟器卡的时候会看到顶上一闪而过的“0秒跳过”。 这样启动全屏广告没了,最后结果只改了一个0X5 虽然广告没了,但其实前边一大堆判断和调用,不够简洁。翻一翻程序入口ActivityLauncher里基本是计数器的初始化计算啥的,没有实质内容,我们干脆在andriodmanifest.xml里把程序入口由ActivityLauncher改为ActivitySplashDefault,把中间这一堆全跳过去。这样改有些风险,因为我们没弄明白ActivitySplashown到底啥用处,而从ActivitySplashDefaultActivitySplashown是没有调用的。不过own基本内容跟AD那个很像,估计也不是啥好东西,一块剁掉试试。
20.jpg
把箭头处入口名换成ActivitySplashDefault,直接复制一下,改完:
21.jpg
保存,回编,运行,测试各个功能,没发现缺啥file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gifOK,成了。而且启动的确麻利了点。如果这里失败了呢?那就退一步,改ActivityLauncher的代码吧,把那一堆浪费资源的判断剁掉或者绕过去,直接给出default一个出口就行。


2.尝试去除第二处的淘宝广告
既然是淘宝的广告,笨办法搜一下taobao先。发现还不少


22.jpg
发现还不少。仔细看看,3处是友盟的,8处在一个agoo文件夹下边。这个agooandriodmanifest.xml里见到过,就是友盟。
23.jpg
那么这个淘宝广告其实就是友盟的广告了。从哪里入手呢?这处广告,其实就是一个控件,我们搜一搜控件名“智能鱼缸灯”。有了。
24.jpg
这是个布局文件,activity_more.xml。上下翻一翻,还有好多别的广告。这里在布局中把这一块内容删掉,不显示,也就达到目的了。为了确认一下,我们去找找代码看看。刚才搜taobao的时候,有个activitymore.smali就是它。(安卓开发好像布局都加这个_符号。。。)
30.jpg
看到一个taobao的网址,浏览器里打开一下,就是这个广告,下边那个网址,应该是广告计数结算用的。这里switch判断条件是一串数字,猜测是控件IDkiller里转成16进制搜索一下,果然有了,fishbaby
32.jpg
好了,确定了,开始改。直接改布局。对布局文件不熟悉,那用笨办法,从中心向外删,注意标签有成对的别删单了就好。
28.jpg
因为注意到APP这处广告点开前有个很小的图片,把这个image标签一块删掉。回编运行一下。
29.jpg
这样修改就成功了,我们再完善下。
34.jpg
把这几个广告VIEW同样的方式从布局里去除掉,虽然不知道在哪里显示的。然后在ActivityMore.smali里,把代码去掉。
35.jpg
2131493024转16进制是0x7f0c00a0,搜一下,嗯是switch9。
41.jpg
同时在JAVA源码里看到上一个CASE里是检测有无安装安卓市场的,虽然不知道这个功能在哪,一块处理了。2131493019转16进制0x7f0c009b,switch8。把switch8和switch9里内容全清了,只剩goto出口。或者干脆把这两个分支剪掉。其中还有一个分支是软件更新的,如果想弄也在这里。
36.jpg
这个就处理完了,再处理使用说明里那一点点。从这个页面里随便找点词搜搜,我搜了“使用的是”
37.jpg
strings里找到了注册的字符串,但这个不全,到“出行伙伴!”就正好结束了,没到广告的位置。没关系,再搜这个字符串的name,肯定有调用。搜explain,有了。
39.jpg
如果搜不到咋办呢?刚才我们在ActivityMore里处理的那一堆CASE,肯定是相邻或者相类似的按钮,使用说明和处理的taobao广告挨着,翻一翻 42.jpg
这个CASE像,搜这个资源ID2131493016,找到name,再搜namepnl_introduct


43.jpg

的确是使用说明,那么这个CASE调用的ActivityAbout就是了,浏览一下,也能定位。在ActivityAboutxml布局文件里,把相关的4textview删掉,还有二维码和微博的图片,附近找imageview,只找到一个离得近的(另一个离得也近但明显不是),删掉。回编,看效果。
40.jpg
好了。


3.第三处去哪儿的广告。《站站查询》的机票按钮,《订火车票》的酒店按钮,都会出现广告。前一个是嵌入打开的网页页面的,机票广告,后一个是在打开网页页面底部的广告栏,去哪儿的广告。怀疑这两个都是去哪儿接口自带的广告,既想留功能又想去广告,小白表示无力弄不了了,有大神看到的话指点指点。本次记录就成为半成品了。


四.完善
两个目标。1.TX广告我们已经去掉了,把它的组件砍干净。2.去掉软件更新。友盟这个,因为不光推广告,还有统计功能,嵌入太深。到UM官网了转一圈,发现很多活动都要加调用,内部的调用太多;搜搜工程,里面资源文件加上smali文件1000多个。
60.jpg
作为小白,处理起来太繁琐,也难免出错,不弄了,,以后用空慢慢再试试瘦身手术。到AndroidManifest.xml里把所有umeng的活动、服务全删掉拉倒了。)


1.砍组件。把上一步生成的APK留一份,防止砍过头了。A.砍程序入口处。ActivityLauncher。搜一下哪里调用
44.jpg
一个自身,一个错误处理。自身整个文件删掉,错误处理里把这一句替换成现在的入口ActivitySplashDefault(不知道这样处理好不好)。ActivitySplashAdAndroidManifest.xml里删掉注册这个活动的这一行,其他3smali文件(带$的是子类)直接删掉。
45.jpg
ActivitySplashown同样处理(这个一开始就没拿准,但搜了下没有调用这个类的)。
46.jpg
只剩default了。测试一下,程序正常运行,嘿嘿。B.砍TX广告。还记得开始我们搜qq.e确定tx广告么,搜索结果里有篇博文是教怎么植入tx广告的,我们去学习一下,因为不知道有哪些库文件啊。
47.jpg
找到一个架包跟这个很像,gdt  ad  v2  就是它了,工程内搜一下这个文件名,看有没有引用。。。只有smaliqq/e下有,这个文件夹要整个删的。。。把gdtadv2.jar文件删掉。
48.jpg
smali文件夹中找到qq/e,整个删掉。工程内搜索qq.e关键字,涉及的内容删掉。也没多少了,只剩服务和活动声明了,估计都在qq/e里呢。到这里回编测试一下,OK,大体点了点各个功能都没问题。 2.改更新。之前的修改中,我们已经知道软件更新功能的关键位置了,在activitymore。在JAVA里撸一撸。当时我们发现,是在一处按钮监听的一个CASE里,也就是说,是手动更新的。找一找有没有自动更新功能,果然有个autoCheckUpdate()
63.jpg
但是很奇怪,从activitymoreoncreate往这个函数撸,撸不到,不能启动就没法自动更新啊。全局搜一下autoCheckUpdate(),看看软件启动的时候有没有调用。。。额。。。坑啊,别处还有一个定义同名方法的。
64.jpg
在这个smskb类里,貌似能从oncreate撸到autocheckupdate…..JAVA反编的好像不准确,JAVA又不懂,大概是)。那去找这个smskb类是不是启动时调用了。搜索一下,果然ActivitySplashDefault用一个showMainScr()方法撸过来。这里有坑,而我们用的又是最新版本,只好又去下了一个20171210的版本测试,果然启动后点“更多”,就跳出更新框了,没等我们去点软件更新那个按钮。如果取消,更多选项卡就进不去了。蛋疼,早知道用旧版本搞了。原谅我,我是小白。
72.jpg
观察smskbautocheckupdate的代码,65眼力定位到这里
66.jpg
一个if判断,直接改 goto/16 :cond_0,跳走。用旧版软件测试,不自动更新了。activitymore那儿,看看当时那一堆CASE。嗯,这个调用autocheckupdate的就是那个更新按钮了
78.jpg
smali里搜一下,是switch1,把这个分支清空。
79.jpg 80.jpg
我们已经把更新的功能去掉了,到布局文件里,把点击检查更新这几个字去掉,最后效果。


81.jpg 82.jpg
这样就不更新了,只显示版本号。


五.几点体会


1.小白中,零基础、没想过当大牛、只是感兴趣所以来学逆向的应该还是占很大比例,如我。这种情况选择学习路径很重要,需要处理好学理论和动手实践的关系。建议从对着最简单的静态smali帖子和教程,动手学起入门,一定要动手,因为我们本来就没理论。在一个小小的领域练习、熟悉到一定程度,得考虑专题化补理论基础,因为没理论稍微一点问题就被难住,比如练习改smali一段时间,可以系统学一下smali语法、apk内大体构架和各文件运作关系、xml文件各标签等等;对于跨领域、需要突破知识壁障的,建议触手式的接触练习一下就好,不宜去啃理论,比如这时候去啃arm汇编指令、地址偏移,就头大了(原来有其他语言基础的另说)。


2.练习中,有时找到突破点是有偶然性的,这种如果找到突破点改完就拉倒,提升效果有限。修改成功后,可以回过头来捋一捋,多熟悉程序的运作过程,争取多把偶然的变成必然的、心中有数的,能提高静态分析的能力。


3.记笔记,任何知识点都记下来,任何经验点都记下来。作为小白欠缺的是基础,这些一句话两句话的知识点经验点就是最好的弥补。然后还要多翻看反编的工程,遇到不熟悉的东西搜索一下,是管啥的,然后记下来。
样本  链接:https://pan.baidu.com/s/1eSPIcaI 密码:zepc
抱歉,经@aaa981226 提醒,修改完的成品在夜神里没问题,但在真机和其他模拟器里出错。链接里不再放成品了,如有照贴修改的请注意,可能是最后砍东西的时候出了差错,再次抱歉。
3.jpg
73.jpg
71.jpg
68.jpg
67.jpg
49.jpg
38.jpg
33.jpg
31.jpg
27.jpg

免费评分

参与人数 11威望 +1 吾爱币 +22 热心值 +11 收起 理由
至尊笨 + 1 + 1 用心讨论,共获提升!
hotwater10 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
卡斯柯酷 + 1 + 1 支持支持
keats + 1 + 1 前排学习
凌乱的思绪 + 1 学习了
qtfreet00 + 1 + 12 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
shilinzhilang + 1 + 1 谢谢@Thanks!
bdk236 + 1 + 1 看不懂,感谢大神分享,很仔细。
古月仙人 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
愚无尽 + 1 + 1 码字辛苦了 原创支持
zhaojunkai + 1 + 1 加油!!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| winding 发表于 2017-12-19 14:20
aaa981226 发表于 2017-12-19 12:22
安装了楼主第二个版本,安装完后,显示程序未安装,选择第三个版本安装后,提示更新,更新后,变成了官方的 ...

修改完的的确有问题,谢谢提醒。

如果自用,去广告的方法很简单,也说的很仔细了,自己动手改改就好。
aaa981226 发表于 2017-12-19 12:02
非常感谢楼主,盛名一直使用中,感谢楼主去广告,我想问的是,楼主说  我们已经把更新的功能去掉了,  那以后怎么更新数据呀,因为这个软件数据更新是一项重要的环节
 楼主| winding 发表于 2017-12-19 11:54
kk1212 发表于 2017-12-19 11:59
做的非常的详细,学习了
aaa981226 发表于 2017-12-19 12:03
本帖最后由 aaa981226 于 2017-12-19 12:06 编辑

另外楼主提供了三个版本,我下载哪一个呢
QQ拼音截图未命名.png
aaa981226 发表于 2017-12-19 12:22
安装了楼主第二个版本,安装完后,显示程序未安装,选择第三个版本安装后,提示更新,更新后,变成了官方的原版
post927 发表于 2017-12-19 13:10
不明真相的围观群众~~~ʅ(´◔౪◔)ʃ
nonin 发表于 2017-12-19 14:52
支持 楼主加油!
Murderer 发表于 2017-12-19 14:59
楼主不错,条理清晰
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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