- 引用一下AloneMonkey大佬的去广告思路
- 找到对应的Controller或者View使用
logify.pl
打印方法调用日志。- class-dump头文件从类名或方法名中根据一些关键字比如Ad,找找线索。
- 使用frida或者其它的动态函数调用跟踪工具看看调用流程。
- 还原符号,使用LLDB对类的所有方法断点看调用。
- 直接从Malloc stack看View对象是在哪里生成的。
- 由于我非常的菜,C没学过OC没学过,所以一般就是第二种靠蒙的方式,麻烦、费时但是效果还是有一点点点的。
- 那么有没有一种不用脑子、简单、我这种菜鸟也会的通用版本呢?
思路:
-
我之前最常用的方法是通过UI布局去找广告视图所在的类,再根据类找广告的方法,但这么做步骤多、需要调试,比较麻烦。我想到广告是会变的,肯定是联网从服务器中请求的,那么就肯定可以对广告的url请求做文章。
-
那又可能会想到,把url抓出来,再找出是哪个类的哪个方法,再hook这个方法,去掉广告。不不不,这样太麻烦了,和上面有什么区别,不是我这种菜鸡想要的。
-
菜鸡想要的是我只用抓包出url,其他都不用做,
然后用一种通用的方法干掉广告。(好吧,这完全不是一种通用的方法,很多时候都不行,这个例子能成只是运气好。还是上面的那个方法最靠谱) -
那就需要从根源上(稍微偏根源一点点)找出网络请求的方法。然鹅脑子中并没有这个概念,所以根据百度,请求网络有get和post两种方式,例如请求网络的方法一般为:
NSURL *url = [NSURL URLWithString:@"xxxxxx"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
。。。。。。
。。。。。。
。。。。。。
不复制了
-
又根据百度,不管get还是post,不论同步还是异步,暂时没见到哪个能省掉或者不用这种写法的:
NSURL *url = [NSURL URLWithString:@"xxxxxx"]
-
那么思路就有了,我们直接对URLWithString这个方法动手,就是从根源上动手,不就很简单粗暴了?看下它的声明方式:
-
怎么写已经很明显了,就是hook NSURL这个类的类方法:+(instancetype)URLWithString:(NSString *)URLString,当url为广告的url或者其他你不想看见的东西的url时,返回一个别的url给它。
举个栗子:
- 今日头条文章下方有个相关搜索,它和文章内容都在在WKCompositingView里面,并没有一个单独的容器。
- 然后通过抓包找到了它的GET请求(看它的响应消息里面能找到包含相关搜索内容的关键字)
- 观察发现所有的相关搜索的GET地址都是包含如下字段的:
https://is.snssdk.com/2/article/information/v23/?XXXXXXXXXXXXXXXXXXXXXXXXXX
- 所以尝试一下:
%hook NSURL
+ (id)URLWithString:(NSString *)URLString
{
if([URLString containsString:@"https://is.snssdk.com/2/article/information/v23"])
{
NSLog(@"小老弟,让我改掉这个请求");
URLString = @"https://is.snssdk.com/2/article/fu*ku/";
}
return %orig;
}
%end
- 看看效果
- 已经成功去掉了,也就是说这种方式可行,成功通过hook URLWithString的方式,改变了它原本想要请求的的地址
- 同理对于广告也可以这么做
- 但显然,它的作用范围是有限的:url必须是被请求的而非响应