iOS app 防止抓包

抓包原理

  • 其實原理很是簡單:一般抓包都是通過代理服務(wù)來冒充你的服務(wù)器,客戶端真正交互的是這個假冒的代理服務(wù),這個假冒的服務(wù)再和我們真正的服務(wù)交互,這個代理就是一個中間者 ,我們所有的數(shù)據(jù)都會通過這個中間者,所以我們的數(shù)據(jù)就會被抓取。HTTPS 也同樣會被這個中間者偽造的證書來獲取我們加密的數(shù)據(jù)。

防止抓包

  • 我們可以在請求配置中清空代理,讓請求不走代理
  • 目的是為了在創(chuàng)建NSURLSession對象的時候,自動將代理設(shè)置為一個空的字典(@{})。換句話說,它將攔截所有使用NSURLSession類創(chuàng)建對象的方法,將代理字典設(shè)置為空,然后再繼續(xù)原本的邏輯。
  • 通過這種方式,你可以確保所有使用NSURLSession創(chuàng)建的實例都會自動啟用空的代理設(shè)置。

在AppDelegate 配置 是否允許抓包

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

以下是我的實現(xiàn)方式 直接上干貨
新建一個NSURLSession 擴展
.h

@interface NSURLSession (Extensions)

+ (void)proxyEnabled:(BOOL)enabled;

@end

.m

#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);
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容