Android逆向-Android基础逆向(6-2)

本文章首发自I春秋平台,未经允许静止转载

0x0 前言

应用商店APP中,各种第三方广告横行,插屏广告,还有横屏广告等让用户苦恼不堪。本次对第三方广告原理进行探索以及对第三方广告进行通杀尝试。

0x01 内容说明

1.第三方广告平台,有米广告sdk细节探索。
2.去除插屏广告普遍方法。
3.样本分析,对第三方广告进行通杀尝试。

广告相关

什么是广告?

广义来说,就是和游戏无关的都是广告。

植入广告的目的是什么?

(1)做推广
(2)获利
(3)其它

植入广告原理分析

用一个载体去承载广告,然后显示出来。使用的技术用静态布局,或者使用动态加载等方式。还是来看一下如果植入广告的具体操作吧。

0x02 有米第三方广告注入分析

1.说明

在第三方SDK进行引入的时候,程序员需要按照第三方的要求进行配置。
第三方广告主要涉及的内容有:
(1)应用ID或者KEY
(2)第三方sdk提供的Activity
(3)第三方sdk提供的service
(4)第三方要求的Android权限设置

2.有米官方文档分析

本次分析主要是针对无积分广告类型进行分析。
官方文档传送门

2.1 有米广告基本配置

除了导入sdk之外,有米广告需要配置应用信息。
这个信息需要在有米后台进行应用创建,就会得到相对应的key。

然后进行应用配置

AdManager.getInstance(this).init("5404dc241a8c4c9f", "6a5a3987ecbd349c",true);

如果是别人的加入的广告,改这里的key,可以让广告变成自己的,从而让自己变成受益人,但是不推荐这样做。

2.2 Androidmanifest.xml配置

2.2.1 Android 权限添加
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

这些权限是必须权限,用来获取广告,一般的广告都是需要Android权限来从服务器获取。
有米在代码里还添加了权限扫描验证,如果没有权限就会报错。

2.2.2 SDK Activity添加
<activity  
            android:name="er.kj.iy.video.VideoActivity"  
            android:configChanges="keyboard|keyboardHidden|screenSize|orientation"  
            android:screenOrientation="landscape"  
            android:theme="@android:style/Theme.NoTitleBar" />  

        <!-- 其他组件 -->  
        <activity  
            android:name="er.kj.iy.SD"  
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"  
            android:theme="@android:style/Theme.NoTitleBar" />  
2.2.3 service
   <service  
            android:name="er.kj.iy.QW"  
            android:exported="false" />  

这里的service是我们进行通杀的要点。

3.总结说明

当以上的内容全部满足的时候,有米第三方的sdk才能正常工作,如果其中的一个出了问题,那么广告也就不会出现了。所以我们主要针对其中的流程进行处理,就可以对广告进行去除。

4.有米官方demo分析

4.1 demo展示。


可以看到一共有五种广告。
插屏广告是我们最常见的广告,和今日推荐五秒类似,只不过五秒广告会自动退出,插屏广告需要自己手动退出。

我们来看一张gif图片,看一下五秒广告。

很多app软件都会出现这种广告,而且还会出现误点现象等,影响app的用户体验。

4.2 demo 反编译处理

工具:Android Killer

实验环境:夜神模拟器

说明:Android killer是集成工具,所以就不使用apktool,以及工具。

4.2.1 进行反编译

Android killer 使用非常方便,拖放文件即可。

首先来搞定一下“五秒广告”,我们通过对Androidmanifest.xml妙用来让这个五秒广告不进行执行。
关键点在于

 <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>

思路:
这个两行决定了谁是首先启动的Activity,我们只要改变这个位置,就可以直接跳过“五秒广告”的骚扰,不过在跳过的时候需要对代码进行一定的分析。
这个并不是我们这篇的重点,但是也是一个非常灵活的技巧。

4.2.2 其他方法去除

思路:
广告无非就是从服务器发送过来的一段数据,那么这段数据总会有一个容器去接收它,那么我们就要从service进行入手了。既然要通过service进行广告的传递,那如果我们去除service,是不是广告也就不攻自破了呢。
尝试:
我们尝试去掉和广告相关的service,然后进行反编译。
首先找到位置,删除

进行反编译

最后进行测试

我们发现“五秒广告”已经成功去除,在查看其他广告的时候,也发现同样被去除了。

4.2.3 总结

在有米第三方广告中,我们只要去除和广告息息相关的service,就可以成功的进行去除广告,那么其他第三方广告是不是也是相同属性呢。为了提高普遍性,我们对几个样本进行通杀尝试。

0x03 通杀尝试

样本一

样本材料:机器人九号 APP
实验工具:Android killer
实验环境:夜神模拟器 6.0.1.0

样本分析

首先我们现在夜神模拟器上对样本进行安装。

然后打开样本,进行简单的观察。

我们发现有一个“五秒广告”,那么这个就是我们要杀死的主角了。

样本测试

先进行反编译,然后打开Androidmanifest.xml文件

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="robot9.robot.deified.com.robot9" platformBuildVersionCode="25" platformBuildVersionName="7.1.1">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
    <permission android:name="robot9.robot.deified.com.robot9.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
    <uses-permission android:name="robot9.robot.deified.com.robot9.permission.C2D_MESSAGE"/>
    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:name="robot9.robot.deified.com.robot9.Utilities.RobotApplication" android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize" android:name="xa.qwe.xz.Uxa" android:theme="@android:style/Theme.Light.NoTitleBar"/>
        <service android:exported="false" android:name="xa.qwe.xz.Znd"/>
        <service android:exported="false" android:name="xa.qwe.xz.Exl"/>
        <receiver android:name="xa.qwe.xz.Axk">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
        <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:name="com.google.android.gms.ads.AdActivity" android:theme="@android:style/Theme.Translucent"/>
        <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:name="com.qq.e.ads.ADActivity"/>
        <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:name="robot9.robot.deified.com.robot9.Robot9Activity" android:screenOrientation="portrait" android:theme="@style/Theme.AppCompat.NoActionBar"> &gt;
<intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="robot9.robot.deified.com.robot9.View.RobotPreference"/>
        <activity android:name="robot9.robot.deified.com.robot9.View.EmptyActivity" android:theme="@android:style/Theme.Translucent"/>
        <activity android:name="robot9.robot.deified.com.robot9.View.FreshScreenActivity" android:theme="@android:style/Theme.Translucent"/>
        <service android:enabled="true" android:name="robot9.robot.deified.com.robot9.Service.RobotAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService"/>
            </intent-filter>
            <meta-data android:name="android.accessibilityservice" android:resource="@xml/auto_robot_permissions"/>
        </service>
        <activity android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" android:theme="@style/Theme.IAPTheme"/>
        <activity android:exported="false" android:name="com.google.android.gms.common.api.GoogleApiActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
        <receiver android:enabled="true" android:exported="false" android:name="com.google.android.gms.measurement.AppMeasurementReceiver"/>
        <receiver android:enabled="true" android:name="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver" android:permission="android.permission.INSTALL_PACKAGES">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER"/>
            </intent-filter>
        </receiver>
        <service android:enabled="true" android:exported="false" android:name="com.google.android.gms.measurement.AppMeasurementService"/>
        <receiver android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
                <category android:name="robot9.robot.deified.com.robot9"/>
            </intent-filter>
        </receiver>
        <receiver android:exported="false" android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"/>
        <service android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdService">
            <intent-filter android:priority="-500">
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        <provider android:authorities="robot9.robot.deified.com.robot9.firebaseinitprovider" android:exported="false" android:initOrder="100" android:name="com.google.firebase.provider.FirebaseInitProvider"/>
    </application>
</manifest>

我们注意到有很多行的包名展示的是com.google.android,一般来说这种包名意味着这个app里嵌入了第三方谷歌的广告。

广告的特征词是“ads”

那么我们找到和google相关的service进行删除测试

但是在实际实验的时候,“五秒广告”并没有去除,原本是怀疑可能这个方法不能达到通杀的时候,再次对Androidmanifest.xml文件进行细致的审计,突然发现了,整个APP中不止是嵌入了一个谷歌的第三方广告,还有一个qq的第三方广告。

我们删除service,然后反编译之后进行测试。

通杀结果测试

我们发现广告成功去除了。
由于gif录制工具导致录制时系统卡顿。可能会影响开启效果。

样本二

样本材料: 快乐小鸡 APP
实验工具:Android killer
实验环境:夜神模拟器 6.0.1.0

样本分析

安装测试

首先是“五秒广告”

然后有一个迷你型广告

样本测试

首先反编译,然后对Androidmanifest.xml文件的分析,和之前的样本分析流程一样。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.koodroid.chicken" platformBuildVersionCode="23" platformBuildVersionName="6.0-2704002">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
    <permission android:name="com.koodroid.chicken.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
    <uses-permission android:name="com.koodroid.chicken.permission.C2D_MESSAGE"/>
    <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="com.koodroid.common.MainApplication" android:theme="@style/AppTheme">
        <activity android:configChanges="orientation" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.koodroid.chicken.MainActivity" android:theme="@android:style/Theme.NoTitleBar"/>
        <activity android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.koodroid.chicken.RSplashActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:configChanges="keyboard|keyboardHidden|orientation" android:name="com.baidu.mobads.AppActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
        <service android:exported="false" android:name="com.qq.e.comm.DownloadService"/>
        <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:name="com.qq.e.ads.ADActivity"/>
        <meta-data android:name="UMENG_APPKEY" android:value="57eb8916e0f55a72de0001de"/>
        <meta-data android:name="UMENG_CHANNEL" android:value="Ali"/>
        <meta-data android:name="BaiduMobAd_APP_ID" android:value="a457abae"/>
        <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:name="com.google.android.gms.ads.AdActivity" android:theme="@android:style/Theme.Translucent"/>
        <activity android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" android:theme="@style/Theme.IAPTheme"/>
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
        <activity android:exported="false" android:name="com.google.android.gms.common.api.GoogleApiActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
        <receiver android:enabled="true" android:exported="false" android:name="com.google.android.gms.measurement.AppMeasurementReceiver"/>
        <receiver android:enabled="true" android:name="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver" android:permission="android.permission.INSTALL_PACKAGES">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER"/>
            </intent-filter>
        </receiver>
        <service android:enabled="true" android:exported="false" android:name="com.google.android.gms.measurement.AppMeasurementService"/>
        <provider android:authorities="com.koodroid.chicken.firebaseinitprovider" android:exported="false" android:initOrder="100" android:name="com.google.firebase.provider.FirebaseInitProvider"/>
        <receiver android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
                <category android:name="com.koodroid.chicken"/>
            </intent-filter>
        </receiver>
        <receiver android:exported="false" android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"/>
        <service android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdService">
            <intent-filter android:priority="-500">
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
    </application>
</manifest>

这个service,就是我们需要删除的广告服务

还有一些其他的和广告也一切删除了。

当这些服务都删除的时候,我们的去广告就成功了。

样本观察测试

我们发现样本的广告已经成功消除了。

0x04 通杀思考

  1. Android 开发的基础是java,相对于c/c++来说, 更加容易被反编译,所以不法分子通过二次打包app,给app加上了sdk第三方软件广告来获取利益,给用户体验造成了很大的影响。

2.当广告恶劣到一定程度的时候,就相当于是一种病毒,通过改变app的运行方式,强制使用app内部权限,导致app主次分离,影响app本生的功能。

3.删除一个东西很简单,但是知道删除什么东西才是难点。

4.app第三方广告通杀方面,将第三方sdk提供的service服务进行删除,就可以成功的通杀市面上大部分的广告,我们通杀的要点就是Androidmanifest.xml文件,service将在Androidmanifest文件进行注册,所以我们需要做的就是删除service的注册信息,那么service将失去其意义,广告也将被删除。

5.我们通过对Androidmanifest.xml文件进行过滤,过滤并删除与广告相关的servcice。进行简单的工具的制作,那么就可以进行自动化通杀广告,给app进行一个绿化的能力。

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘟嘟_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值