iOS app 防止抓包

抓包原理

其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再和我们真正的服务交互,这个代理就是一个中间者 ,我们所有的数据都会通过这个中间者,所以我们的数据就会被抓取。HTTPS 也同样会被这个中间者伪造的证书来获取我们加密的数据。

防止抓包

我们可以在请求配置中清空代理,让请求不走代理
目的是为了在创建NSURLSession对象的时候,自动将代理设置为一个空的字典(@{})。换句话说,它将拦截所有使用NSURLSession类创建对象的方法,将代理字典设置为空,然后再继续原本的逻辑。
通过这种方式,你可以确保所有使用NSURLSession创建的实例都会自动启用空的代理设置。

在AppDelegate 配置 是否允许抓包

#if DEBUG
     [NSURLSession proxyEnabled: YES]; //允许抓包
#else
      [NSURLSession proxyEnabled:NO]; //禁止抓包
#endif

以下是我的实现方式 直接上干货
新建一个NSURLSession 扩展
.h

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSURLSession (Extensions)
+ (void)proxyEnabled:(BOOL)enabled;
@end
NS_ASSUME_NONNULL_END

.m

#import "NSURLSession+Extensions.h"

#import <objc/runtime.h>

@implementation NSURLSession (Extensions)

static BOOL proxyEnabled = YES;

+ (void)load {
    [super load];
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [NSURLSession class];
        [self swizzleMethodWithClass:class
                    originalSelector:NSSelectorFromString(@"sessionWithConfiguration:")
                    swizzledSelector:NSSelectorFromString(@"_sessionWithConfiguration:")];
        [self swizzleMethodWithClass:class
                    originalSelector:NSSelectorFromString(@"sessionWithConfiguration:delegate:delegateQueue:")
                    swizzledSelector:NSSelectorFromString(@"_sessionWithConfiguration:delegate:delegateQueue:")];
    });
}

+ (void)proxyEnabled:(BOOL)enabled {
    proxyEnabled = enabled;
}

+ (NSURLSession *)_sessionWithConfiguration:(NSURLSessionConfiguration *)configuration {
    if (!proxyEnabled) {
        configuration.connectionProxyDictionary = @{};
    }
    return [self _sessionWithConfiguration:configuration];
}

+ (NSURLSession *)_sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
                                   delegate:(nullable id<NSURLSessionDelegate>)delegate
                              delegateQueue:(nullable NSOperationQueue *)queue {
    if (!proxyEnabled) {
        configuration.connectionProxyDictionary = @{};
    }
    return [self _sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue];
}

+ (void)swizzleMethodWithClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector {
    Method originalMethod = class_getClassMethod(cls, originalSelector);
    Method swizzledMethod = class_getClassMethod(cls, swizzledSelector);
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

@end

除此之外如果还想要更加严格的可以添加如下检测

iOS越狱检测
代理检测和模拟器检测

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 抓包原理 其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假...
    UILable攻城狮阅读 1,955评论 1 3
  • iOS 如何防止抓包 1、抓包原理 为了防止被抓包那么就要了解抓包的原理。 其实原理很是简单:一般抓包都是通过代理...
    Best_Kai阅读 4,060评论 3 11
  • 大致有两种做法,一种是检测到有代理服务器,就不发送网络请求;一种是不发送给代理服务器,而是正常发给目标服务器。 第...
    終于阅读 5,609评论 1 5
  • 计算机网络基础## 计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和...
    jackfrued阅读 4,829评论 6 64
  • 补充更新完善app安全方案:2019.12.13 证书放到app里面,用来校验信任链的话,如果别人使用青花瓷抓包,...
    空空小僧阅读 28,213评论 46 88