啟動廣告是現在很多應用都會在加載時出現的一種廣告類型,一般會展示幾秒鐘,用戶需要等待該廣告加載結束才能進入應用主界面,但是很多用戶并不喜歡這種廣告,因為它不僅影響了用戶體驗,而且還增加了等待的時間,于是一些用戶就開始尋找去除啟動廣告的方法,甚至一些開發者也會在自己的應用中加入去除啟動廣告的功能,此種情況很容易引起作為廣告提供方的開發者的反感,那么這種屏蔽啟動廣告的方法是如何實現的呢?
一、原理介紹
1. 通過尋找廣告的唯一識別符
每一個廣告都會有一個唯一的標識符,一般在應用啟動時會將該標識符記錄下來,然后通過查找該標識符,就可以將該廣告屏蔽掉,這種方法比較簡單,但只限于針對某個應用的特定版本和特定廣告,因為廣告商可能會不斷更換標識符。
2. 攔截網絡請求
一般來說,廣告需要通過網絡請求加載顯示,所以我們可以攔截應用中的網絡請求,通過匹配請求的鏈接地址來屏蔽廣告,這種方法更加通用,但需要我們了解廣告提供方的API,不僅需要考慮到廣告鏈接地址的匹配問題,還需要避免不必要的網絡請求,以免影響用戶的正常體驗。
3. 修改系統文件
對于 Android 系統,我們可以通過修改 hosts 文件來屏蔽廣告,因為 hosts 文件可以用來域名解析,我們可以在該文件中添加廣告域名的解析地址,并將其解析到本地的一個 ip 地址即可,這樣所有與這個廣告域名有關的請求都會被解析到本地的 ip 地址上,從而達到屏蔽廣告的效果,但該方法需要獲取 ROOT 權限,對于一般用戶來說不太友好。
二、詳細介紹
1. 查找廣告識別符
我們可以通過一些腳本和工具,來分析應用的代碼結構,查找廣告唯一識別符的位置,然后通過 hook 的方式將其替換成空字符串或隨機字符串,來達到屏蔽廣告的效果。
下面是一個簡單的 Python 腳本實現,具體方法為通過 frida 框架 hook 應用中的字符串查找函數,判斷是否為廣告唯一識別符,如果是則將其替換成空字符串:
“`python
import frida
# hook 應用中的字符串查找函數
def on_message(message, data):
if message[‘type’] == ‘send’:
print(str(message[‘payload’]))
if ‘packed_trust_id’ in str(message[‘payload’]):
me
ssage[‘payload’] = message[‘payload’].replace(‘”packed_trust_id”: “xxxxxxxxxxx”‘, ‘”packed_trust_id”: “”‘)
message[‘payload’] = message[‘payload’].replace(‘”trust_id”: “”‘, ‘”trust_id”: “xxxxxxxxxxx”‘)
# 手機連接模擬器或真機
device = frida.get_device_manager().enumerate_devices()[-1]
# 打開應用
session = device.attach(“com.example.app”)
# 加載 JavaScript 腳本
with open(‘script.js’, ‘r’, encoding=’utf-8′) as f:
script = session.create_script(f.read())
# 監聽消息
script.on(“message”, on_message)
# 加載 JavaScript 腳本
script.load()
“`
2. 攔截網絡請求
我們可以通過一些中間件來攔截應用內的網絡請求,從而實現去除應用內的廣告,這種方法通用性強,但實現起來比較復雜,需要了解一些網絡協議和相關技術,下面是 Python 中攔截 HTTP 請求的一個例子:
“`python
import mitmproxy.http
def request(flow: mitmproxy.http.HTTPFlow):
# 判斷該請求是否為廣告請求
if ‘https://ad.xx.com/api’ in flow.request.url:
# 如果是,則將響應體修改為 JSON 格式的字符串 {“code”: 0}
flow.response.text = ‘{“code”: 0}’
def response(flow: mitmproxy.http.HTTPFlow):
# 判斷該響應是否為廣告響應
if ‘https://ad.xx.com/api’ in flow.request.APPurl:
# 如果是,則將響應體修改為 JSON 格式的字符串 {“code”: 0}
flow.response.text = ‘{“code”: 0}’
“`
3. 修改系統文件
我們可以通過修改 Android 系統中的 hosts 文件來實現屏蔽廣告的效果,這種方法簡單易行,但需要獲取 ROOT 權限,下面是一個 Python 實現 hosts 文件修改的腳本:
“`python
import os
# 添加廣告域名到 hosts 文件中
def append_hosts():
os.system(‘su’)
os.system(‘echo “127.0.0.1 ad.xx.com” >> /etc/hosts’)
# 刪除廣告域名記錄
def remove_hosts():
os.system(‘su’)
os.system(‘sed -i “/127\.0\.0\APP開發.1 ad\.xx\.com$/d” /etc/hosts’)
“`
以上就是三種屏蔽啟動廣告的方法,不過這些方法都可能會影響到應用的運行,尤其是修改系統文件的方法,需要慎重使用。此外,對于一些付費應用,存在去除廣告的行為是不道德的,因為開發者只有通過廣告才能獲得收益,我們應該尊重其付出的勞動成果。