iOS 逆向之网易云音乐去除开屏广告

| categories: iOS | tags: iOS

最近更换了自己的 Apple 账号,然后发现网易云音乐在该区没有上架。由于不想在一台手机上搞两个账号互相切换,于是便想到将 App 重签名一下安装到手机中。同时,自己蛮讨厌开屏广告的,就顺手写了个 Tweak 来屏蔽开屏广告。期间有一些小坑,写篇博客来记录一下。

clutch 砸壳失败

第一步就是砸壳了,结果发现使用 clutch 砸壳出错,没有成功生成脱壳的 IPA 文件。具体原因没有深究,但是看错误提示,猜测应该是 clutch 不支持 StickerPack 的扩展导致的。

尝试使用 dumpdecrypted 来砸壳,测试成功。砸壳的方法参考了这篇博客。得到砸壳后的可执行文件之后,从越狱机中将 App 拷贝出来,替换掉可执行文件即可。

Theos 默认不支持 ARC

这个是最近发现的,原来 Theos 默认并不使用 ARC 编译 Objective-C 文件。解决办法是在 Theos 工程的 Makefile 中添加下面一句:

ADDITIONAL_OBJCFLAGS = -fobjc-arc

Tweak 实现原理

由于开屏广告的显示时间非常靠前,不可能等到 App 启动后,从网络获取到数据后再显示,一般的做法就是提前加载好之后要显示开屏广告数据缓存到本地,App 每次刚启动后,直接从本地取出数据,然后显示需要的开屏广告给用户。

将二进制拖到 Hopper 中,搜索关键字 advertisement 浏览一下搜索结果,很快便发现了一个名叫 NMAdvertisementManager 类。一番分析后,实现逻辑的 Tweak 的代码如下:

%hook NMAdvertisementManager

- (void)fetchStartupAdvertisement {
	[[%c(NMAdvertisementManager) defaultManager] performSelector:@selector(clearCachedResources)];
	[[%c(NMAdvertisementManager) defaultManager] performSelector:@selector(removeOldAdItems)];
}
%end

逻辑是:hook 了获取数据的函数,每次这个函数被调用的时候,就清除本地缓存的广告数据。这样本地没有了广告数据,也就不会再显示开屏广告了。

最后

虽然我理解 App 加开屏广告的初衷,但是作为一个用户,真的非常讨厌这个行为。有些 App 甚至是在程序从后台切到前台的情况都会显示广告,非常烦人。好了,用逆向来把生活变得美好一些吧。

参考资料




Previous     Next

Published under (CC) BY-NC-SA