菜鸡的去广告方式

  • 引用一下AloneMonkey大佬的去广告思路
  1. 找到对应的Controller或者View使用 logify.pl 打印方法调用日志。
  2. class-dump头文件从类名或方法名中根据一些关键字比如Ad,找找线索。
  3. 使用frida或者其它的动态函数调用跟踪工具看看调用流程。
  4. 还原符号,使用LLDB对类的所有方法断点看调用。
  5. 直接从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请求(看它的响应消息里面能找到包含相关搜索内容的关键字)QQ20200331-182656
  • 观察发现所有的相关搜索的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必须是被请求的而非响应

参考:

是时候申请个域名了http://dev.null,做个服务专门处理这种业务。。。

1 个赞

%hook NSURL

  • (instancetype)URLWithString:(NSString *)URLString
    {
    if([URLString containsString:@“baidu.com”])
    {

    URLString = [urlString stringByReplacingOccurrencesOfString:@"baidu.com" withString:@"360.com"];
    

    }
    return %orig;
    }
    %end

为什么我这样就不行呢