琢石成器之自动化去广告神器(Green Creator)

最近发了几个去广告的APK,难道你以为那是我自己干的吗,不不不,你太天真了,这都是自动处理出来的成果

引言

俗话说的好”工欲善其事,必先利其器”,在日常工作中,如果拥有一款或N款好用的工具,那么工作效率将会成几何倍提升。这篇文章与其说是写一个去广告的工具,不如说是写一个自动化工具更为准确。我不会讲代码的细节,“一千个人眼里有一千个哈姆雷特”,每个人写代码的风格都不一样,最重要只有思路(实际上这个思路也并不高明,唯一的重点就是清楚原理),你们可以用喜欢且擅长的语言及方式来进行实现,不过最终我会放出自己的源代码(我的代码相对于单一目标的实现可能会有些繁杂,只需要一两百行的代码我写了两千行还不到头哈哈,所以在文中只会贴上需要的部分,想要阅读完整代码的可以上我的github,当然在这之前请记住”文明社会”这四个字)。

那么开始步入正题,我们要开发的是一款自动化去广告的工具,何为自动化,自动化就是解放双手,让程序完成需要你动手的一系列操作。那么,想要自动化就必须先知道正常手工是如何操作的,接下来,我们来探讨一下APK如何去广告这件事情。

本文所叙都是在APK没有加壳/加密或者已经完美脱壳/解密的情况下

如何添加广告

兵家云:“知己知彼,百战不殆”,假如你知道这个程序是如何被添加上广告的,那么你的后续操作将会轻松很多,因为你不必再花费大量的时间对广告SDK进行分析。我们先了解一下广告是怎样以一种形式存在,以Google的广告为例,Google的广告使用范围很广,在Google Play上无论是应用还是游戏,有很大部分都是使用其提供的广告组件。
在Google提供的Android集成开发环境Android Studio上,对着Project点击右键Open Module Setting然后可以看到这么一个东西

TIM截图20170805215309.png

这是什么呢?这是Google提供的广告SDK,勾选后他将会自动下载开发工具包并将其集成到你的Project上,没错,广告就是从这么一个SDK里来的,它就是我们的敌人!我们到他的官方网站可以看到接入指南(https://developers.google.com/admob/android/quick-start),可以看到加载广告的第一步就是初始化SDK

package ...
import ...
import com.google.android.gms.ads.MobileAds;

public class MainActivity extends AppCompatActivity {
    ...
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713
        MobileAds.initialize(this, "YOUR_ADMOB_APP_ID");
    }
    ...
}

初始化的参数有一个ADMOB_APP_ID,这是开发者的凭证,填上这个ID才可以拿到属于你的那份广告收益。在页面的下半部分还可以看到其广告的几种类型,其实我猜市面上的大部分广告组件都是类似的:
1. Banner:横幅广告,这种无论是在桌面端还是移动端都非常常见,它占用你屏幕的一小部分来显示一个横幅的广告视图,但是大多数情况下并不能关闭它;
2. Interstitial:悬浮窗广告,这个在Html和Android上较为常见,它占用屏幕的面积并不固定,有可能是占用一半屏幕甚至是整个屏幕,不过用户却可以手动将他关闭(不能关闭的那叫流氓)。
3. Rewarded Video:其实就是视频广告,占用全屏,而且你还得等他全部播放完才能关闭他,当然也有些只需观看一定时间即可。

Native暂时不做考虑,这是谷歌一种比较高级的广告形式(好像也并没有广泛使用?)。
想要接入这些广告也十分简单,比如Banner,你只要在布局文件上添加一个AdView然后像这样加载它即可

package ...

import ...
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;

public class MainActivity extends AppCompatActivity {
    private AdView mAdView;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MobileAds.initialize(getApplicationContext(),
            "ca-app-pub-3940256099942544~3347511713");

        mAdView = (AdView) findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
    }
    ...
}

而Interstitial甚至都不需要添加View,只需要loadAd然后在需要的时候调用show()方法将他显示出来即可。
好了,就说这些,不然我都要以为我是Google的顶级广告形式 - 人工广告了,接下来谈谈去广告的方法。

传统的绿化方式

此处仅从APK本身入手,不讨论如Hook,Hosts等手段。

从代码的层面上,我们知道了广告如何添加,那么想要将其移除相信对大家也不是什么难事,一般去广告的流程大致是这样的:

    反编译APK --> 移除相关代码 --> 重打包测试

对于移除相关代码,有多种实现方式,比如Banner,你完全可以将其visibility属性设置为GONE就能把他隐藏掉(虽然我没测试过是否有效,哈哈)。不过我更加偏向于删除其加载的入口调用,可以来实战演示一下,下面以ADM(Advanced Download Manager)为例,相信很多人都知道这个软件吧,Android上的下载神器。没去广告之前他是这样子的:

Screenshot_20170805-224029.png

可以看到底部的横幅图片,这就是Banner广告。在上一节中我们知道它调用了AdView的loadAd方法来加载广告,那么我们只要找到这个方法的调用点,然后将其删除就可以让广告无法顺利加载出来。那么怎么做呢?

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows环境下32位汇编语言程序设计 第2版(罗文斌) 完整光盘内容,包含每章内容的完整代码 本光盘所包含目录的说明 根目录下的 *.pdf ;附录A、B、C的电子版文档 Chapter02\Test ;测试编译环境 Chapter03\HelloWorld ;Hello World Chapter04\FirstWindow ;用Win32汇编写第一个窗口 Chapter04\FirstWindow-1 ;用Win32汇编写第一个窗口 Chapter04\SendMessage ;窗口间的消息互发 Chapter04\SendMessage-1 ;窗口间的消息互发 Chapter05\Menu ;使用资源 - 使用菜单 Chapter05\Icon ;使用资源 - 使用图标 Chapter05\Dialog ;使用资源 - 使用对话框 Chapter05\Listbox ;使用资源 - 使用列表框 Chapter05\Control ;使用资源 - 使用子窗口控件 Chapter05\ShowVersionInfo ;使用资源 - 显示版本信息资源的程序 Chapter05\VersionInfo ;使用资源 - 使用版本信息资源 Chapter06\Timer ;定时器的使用 Chapter07\DcCopy ;在两个窗口的 DC 间互相拷贝屏幕 Chapter07\Clock ;模拟时钟程序 Chapter07\BmpClock ;用 Bitmap 图片做背景的模拟时钟程序 Chapter07\TestObject ;一些常见的绘图操作 Chapter08\CommDlg ;使用通用对话框 Chapter09\Toolbar ;使用工具栏 Chapter09\StatusBar ;使用状态栏 Chapter09\Richedit ;使用丰富编辑控件 Chapter09\Wordpad ;一个完整的文本编辑器例子 Chapter09\SubClass ;窗口的子类化例子 Chapter09\SuperClass ;窗口的超类化例子 Chapter10\MemInfo ;显示当前内存的使用情况 Chapter10\Fragment ;内存碎片化的演示程序 Chapter10\FindFile ;全盘查找文件的例子 Chapter10\FormatText ;文件读写例子 Chapter10\FormatText\FileMap ;使用内存映射文件进行文件读写的例子 Chapter10\MMFShare ;使用内存映射文件进行进程间数据共享 Chapter11\Dll\Dll ;最简单的动态链接库例子 - 编写 DLL Chapter11\Dll\MASM Sample ;最简单的动态链接库例子 - 使用 DLL Chapter11\Dll\VC++ Sample ;最简单的动态链接库例子 - 在VC++中使用汇编编写的DLL Chapter11\KeyHook ;Windows 钩子的例子 - 监听键盘动作 Chapter11\RecHook ;Windows 日志记录钩子的例子 - 监听键盘动作 Chapter12\Counter ;有问题的程序 - 一个计数程序 Chapter12\Thread ;用多线程的方式解决上一个程序的问题 Chapter12\Event ;使用事件对象 Chapter12\ThreadSynErr ;一个存在同步问题的多线程程序 Chapter12\ThreadSyn\UseCriticalSection ;使用临界区对象解决多线程同步问题 Chapter12\ThreadSyn\UseEvent ;使用事件对象解决多线程同步问题 Chapter12\ThreadSyn\UseMutex ;使用互斥对象解决多线程同步问题 Chapter12\ThreadSyn\UseSemaphore ;使用信号灯对象解决多线程同步问题 Chapter13\CmdLine ;使用命令行参数 Chapter13\Process ;创建进程的例子 Chapter13\ProcessList ;显示系统中运行的进程列表 Chapter13\Patch1 ;一个内存补丁程序 Chapter13\Patch2 ;一个内存补丁程序 Chapter13\Patch3 ;一个内存补丁程序 Chapter13\HideProcess9x ;Windows 9x下的进程隐藏 Chapter13\RemoteThreadDll ;用 DLL 注入的方法实现远程进程 Chapter13\RemoteThread ;不依靠任何外部文件实现远程进程 Chapter14\TopHandler ;使用筛选器处理异常 Chapter14\SEH01 ;最基本结构化异常处理例子 Chapter14\SEH02 ;改进后的结构化异常处理例子 Chapter14\Unwind ;异常处理中的展开操作例子 Chapter15\Ini ;使用 INI 文件 Chapter15\Reg ;操作注册表的例子 Chapter15\Associate ;操作注册表实现文件关联 Chapter16\TcpEcho ;实现 TCP 服务器端的简单例子 Chapter16\Chat-TCP ;用 TCP 协议实现的聊天室例子 Chapter17\PeInfo ;查看 PE 文件的基本信息 Chapter17\Import ;查看 PE 文件的导入表 Chapter17\Export ;查看 PE 文件的导出表 Chapter17\Resource ;查看 PE 文件的资源列表 Chapter17\Reloc ;查看 PE 文件的重定位信息 Chapter17\NoImport ;不使用导入表调用 API 函数 Chapter17\AddCode ;在 PE 文件上附加可执行代码的例子 Chapter18\OdbcSample ;用ODBC操作数据库的例子 Appendix A\EchoLine ;控制台输入输出的例子 Appendix B\MsgWindow01 ;消息机制试验 1 Appendix B\MsgWindow02 ;消息机制试验 2 Appendix B\MsgWindow03 ;消息机制试验 3 Appendix B\MsgWindow04 ;消息机制试验 4 Appendix C\BrowseFolder ;浏览目录对话框
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值