目的

1.去除启动页广告
2.去除列表推荐广告
3.去除评论顶部推荐广告
4.去除烦人的置顶

工具及软件

越狱的手机,iOS 9.3.1 
dumpdecrypted.dylib ipa脱壳
class-dump 导出头文件
Thor 手机上抓包
Reveal Mac上界面布局分析

开干

抓包

利用Thor软件,抓一个列表返回的json数据,分析特定的字符串。
json数据
通过分析返回的数据,我们可以知道,“stick_label:'置顶'”。暂时记录,留着后面用。

去除启动页广告

用Reveal分析app布局,由于广告闪屏跳转太快,未能捕捉到完整的页面,不过没关系。通过最底层的红色view,我们可以找到这是一个由TTAdSplashControllerView展示的视图,也就是启动页广告。
启动页
我们在头文件中看看TTAdSplashControllerView有什么方法。图中方框标记的,即为当前广告视图的初始化方法,我们利用Theos去hook该方法。
头文件
另外,我们也将广告视图上面的子视图的show方法hook掉。

%hook TTAdSplashControllerView /*去除启动页广告*/ - (void)setModel:(NSArray *)model{}#这个是广告的数据模型的set方法,我们直接替代。这样也不会给他返回数据了 - (id)initWithFrame:(struct CGRect)arg1 model:(id)arg2{ return nil;

}

%end

%hook TTAdSplashView /*这个是广告视图的子视图,我们直接hook掉他们的显示方法,这样他们也不会再显示*/ - (void)showADVideoView{};

- (void)showADImage{};

%end

去除评论顶部广告

每篇文章的评论顶部都有一个推广App的广告,我们通过Reveal分析可以知道它的类是ExploreDetailADContainerView。方法和去除启动页广告一样,就是直接去除他的数据,这样就不会显示广告。但是这种做法的前提是开发这个App的人员对数据做了判断,如果他没有判断,那App肯定会崩溃的,我之所以敢肯定他做了判断是因为,有的评论页面有广告,有的评论页面没广告,因此他肯定做了判断的。

+ (void)trackAppHideIfExists:(id)arg1; @property(nonatomic) double referHeight; // @synthesize referHeight=_referHeight; @property(retain, nonatomic) NSMutableDictionary *showEvents; // @synthesize showEvents=_showEvents; @property(retain, nonatomic) NSMutableDictionary *adViewFrames; // @synthesize adViewFrames=_adViewFrames; @property(retain, nonatomic) NSMutableArray *adViews; // @synthesize adViews=_adViews; @property(retain, nonatomic) TTAdDetailViewModel *viewModel; // @synthesize viewModel=_viewModel; @property(nonatomic) __weak id <TTAdDetailContainerViewDelegate> delegate; // @synthesize delegate=_delegate; @property(nonatomic) _Bool isVideoAd; // @synthesize isVideoAd=_isVideoAd; @property(copy, nonatomic) NSArray *adModels; // @synthesize adModels=_adModels;

可以清楚的看到一个属性TTAdDetailViewModel *viewModel;,我们hook它的set方法。

%hook ExploreDetailADContainerView

/*去除顶部广告*/ - (void)setAdModels:(NSArray *)adModels{ }

%end

去除置顶咨询和列表广告

上面两个去除都很简单,我们找到他的初始化方法或者启动数据模型,直接干掉就可以了。但是这个置顶的咨询和列表中的广告就不一样了。他是在数据源里面,因此我们找到数据源,删除数据源中的广告模型即可。这样既不影响App的正常使用,而且也非常便捷。

我们找到当前列表的dataSource,为ExploreMixedListBaseView,但是在ExploreMixedListBaseView的头文件里面没有看到任何数据和数据模型之类的,因此推测有一个专门管理数据的类,通过各个属性名的直接排除,我们看到@property(retain, nonatomic) ExploreFetchListManager *fetchListManager;  我们直接查看ExploreFetchListManager 的头文件  

在ExploreFetchListManager的头文件中,我们看到一个数组@property(retain, nonatomic) NSArray *items;,那我们直接打印这个数据,看看运行的时候,输出的是啥。

NSArray *items
不难发现,这就是我们要找的数据。查看ExploreOrderedData的头文件,也不难发现我们之前抓包提取的特殊参数stick_label

到此,我们找到数据了,我们只要对数据进行判断,处理,然后重新返还给他即可

%hook ExploreFetchListManager

- (void)setItems:(NSArray *)items{ NSMutableArray *temArray = [NSMutableArray new]; NSMutableArray *adArray = [NSMutableArray new]; NSLog(@"****1items = %@",items); if(items.count > 0){ for (ExploreOrderedData * model in items) {

[temArray addObject: model];

}

}
[temArray enumerateObjectsUsingBlock:^(ExploreOrderedData * model, NSUInteger idx, BOOL * _Nonnull stop) { if([[model stickLabel] isEqualToString:@"置顶"] || [[model adIDStr] length] > 0){

[adArray addObject: model];

}
}]; if(adArray.count > 0){

[temArray removeObjectsInArray:adArray];

}
items = [temArray mutableCopy];

%orig;

}
%end

到此,所有的广告,都被去除了。
deb插件下载
上面这个是去广告的deb插件,越狱手机直接安装即可。安装完,重新打开软件,还你一个清爽的头条。