美文网首页
关于听云sdk关于hook NSURLSession的反编译

关于听云sdk关于hook NSURLSession的反编译

作者: child_cool | 来源:发表于2018-10-18 10:59 被阅读65次

伪代码如下

void _nbsHookNSURLSession() {
    r12 = _objc_msgSend;
    rax = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    rax = [rax retain];
    var_48 = rax;
    rax = [NSURLSession sessionWithConfiguration:rax];
    rax = [rax retain];
    rdx = 0x0;
    var_40 = rax;
    rax = [rax dataTaskWithURL:rdx];
    rax = [rax retain];
    var_38 = rax;
    r15 = [rax class];
    rbx = @selector(resume);
    if (class_getInstanceMethod(r15, rbx) != 0x0) {
            r14 = @selector(superclass);
            do {
                    if ((*0x1000f56c8)(r15, rbx) != 0x0) {
                            rax = class_getInstanceMethod(r15, rbx);
                            var_30 = rax;
                            method_getImplementation(rax);
                            r13 = r14;
                            r14 = rbx;
                            rbx = r12;
                            r12 = objc_retainBlock(__NSConcreteStackBlock);
                            var_50 = imp_implementationWithBlock(r12);
                            rdi = r12;
                            r12 = rbx;
                            rbx = r14;
                            r14 = r13;
                            [rdi release];
                            rdx = var_50;
                            rcx = method_getTypeEncoding(var_30);
                            class_replaceMethod(r15, rbx, rdx, rcx);
                    }
                    r15 = (r12)(r15, r14, rdx, rcx);
            } while (class_getInstanceMethod(r15, rbx) != 0x0);
    }
    (r12)(var_38, @selector(cancel), rdx);
    (r12)(var_40, @selector(finishTasksAndInvalidate), rdx);
    r14 = _objc_release;
    [var_38 release];
    [var_40 release];
    [var_48 release];
    r13 = [(r12)(@class(_priv_NBSURLSession), @selector(class), rdx) retain];
    var_30 = [objc_getClass("NSURLSession") retain];
    r15 = [objc_getMetaClass(class_getName(r13)) retain];
    r12 = [objc_getMetaClass("NSURLSession") retain];
    rdx = @"nbs_sessionWithConfiguration:delegate:delegateQueue:";
    rsi = r12;
    if ((*0x1000f56d0)(r15, rsi, rdx) != 0x0) {
            rdx = @"nbs_dataTaskWithRequest:completionHandler:";
            rsi = var_30;
            if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                    rdx = @"nbs_downloadTaskWithRequest:completionHandler:";
                    rsi = var_30;
                    if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                            rdx = @"nbs_downloadTaskWithResumeData:completionHandler:";
                            rsi = var_30;
                            if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                    rdx = @"nbs_uploadTaskWithRequest:fromData:completionHandler:";
                                    rsi = var_30;
                                    if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                            rdx = @"nbs_uploadTaskWithRequest:fromFile:completionHandler:";
                                            rsi = var_30;
                                            if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                                    rdx = @"nbs_downloadTaskWithRequest:";
                                                    rsi = var_30;
                                                    if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                                            rdx = @"nbs_uploadTaskWithRequest:fromFile:";
                                                            rsi = var_30;
                                                            if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                                                    rdx = @"nbs_uploadTaskWithRequest:fromData:";
                                                                    rsi = var_30;
                                                                    if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                                                            rdx = @"nbs_uploadTaskWithStreamedRequest:";
                                                                            rsi = var_30;
                                                                            if ((*0x1000f56d0)(r13, rsi, rdx) != 0x0) {
                                                                                    (*_ARunTimeHook)(r12, @selector(sessionWithConfiguration:delegate:delegateQueue:), @selector(nbs_sessionWithConfiguration:delegate:delegateQueue:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(dataTaskWithRequest:completionHandler:), @selector(nbs_dataTaskWithRequest:completionHandler:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(downloadTaskWithRequest:completionHandler:), @selector(nbs_downloadTaskWithRequest:completionHandler:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(downloadTaskWithResumeData:completionHandler:), @selector(nbs_downloadTaskWithResumeData:completionHandler:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(uploadTaskWithRequest:fromData:completionHandler:), @selector(nbs_uploadTaskWithRequest:fromData:completionHandler:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(uploadTaskWithRequest:fromFile:completionHandler:), @selector(nbs_uploadTaskWithRequest:fromFile:completionHandler:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(downloadTaskWithRequest:), @selector(nbs_downloadTaskWithRequest:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(uploadTaskWithRequest:fromFile:), @selector(nbs_uploadTaskWithRequest:fromFile:));
                                                                                    (*_ARunTimeHook)(var_30, @selector(uploadTaskWithRequest:fromData:), @selector(nbs_uploadTaskWithRequest:fromData:));
                                                                                    rsi = @selector(uploadTaskWithStreamedRequest:);
                                                                                    rdx = @selector(nbs_uploadTaskWithStreamedRequest:);
                                                                                    (*_ARunTimeHook)(var_30, rsi, rdx);
                                                                            }
                                                                    }
                                                            }
                                                    }
                                            }
                                    }
                            }
                    }
            }
    }
    (r14)(r12, rsi, rdx);
    (r14)(r15, rsi, rdx);
    (r14)(var_30, rsi, rdx);
    (r14)(r13, rsi, rdx);
    return;
}

还原代码如下

/**
 方法交换
 
 @param class 要交换的对象
 @param originalSelector 原方法
 @param swizzledSelector 交换后的方法
 @param isInstanceMethod 是否是实例方法(减号方法)
 */
void methodSwizzle(Class class,
                   SEL originalSelector,
                   SEL swizzledSelector,
                   BOOL isInstanceMethod) {
    
    Method originalMethod=nil;
    Method swizzledMethod=nil;
    if (isInstanceMethod) {
        /// 获取类中的某个实例方法(减号方法)
        originalMethod = class_getInstanceMethod(class, originalSelector);
        swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    }else{
        /// 获取类中的某个类方法(加号方法)
        originalMethod= class_getClassMethod(class, originalSelector);
        swizzledMethod= class_getClassMethod(class, swizzledSelector);
    }
    
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

void nbsHookNSURLSession(){
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]];
    NSURLSessionDataTask *task = [session dataTaskWithURL:nil];
    
    // 判读是否有该方法的实现
    if (class_getInstanceMethod([NSURLSessionDataTask class], @selector(resume))) {
        do {
            /// 获取imp
            method_getImplementation(class_getInstanceMethod([NSURLSessionDataTask class], @selector(resume)));
            
            
        } while (class_getInstanceMethod([NSURLSessionDataTask class], @selector(resume)));
    }
    
    methodSwizzle([NSURLSession class], @selector(sessionWithConfiguration:delegate:delegateQueue:), @selector(nbs_sessionWithConfiguration:delegate:delegateQueue:), NO);
    
    methodSwizzle([NSURLSession class], @selector(dataTaskWithRequest:completionHandler:), @selector(nbs_dataTaskWithRequest:completionHandler:), YES);
    methodSwizzle([NSURLSession class], @selector(downloadTaskWithRequest:completionHandler:), @selector(nbs_downloadTaskWithRequest:completionHandler:), YES);
    
    methodSwizzle([NSURLSession class], @selector(downloadTaskWithResumeData:completionHandler:), @selector(nbs_downloadTaskWithResumeData:completionHandler:), YES);
    
    methodSwizzle([NSURLSession class], @selector(uploadTaskWithRequest:fromData:completionHandler:), @selector(nbs_uploadTaskWithRequest:fromData:completionHandler:), YES);
    
    methodSwizzle([NSURLSession class], @selector(uploadTaskWithRequest:fromFile:completionHandler:), @selector(nbs_uploadTaskWithRequest:fromFile:completionHandler:), YES);
    
    methodSwizzle([NSURLSession class], @selector(downloadTaskWithRequest:), @selector(nbs_downloadTaskWithRequest:), YES);
    methodSwizzle([NSURLSession class], @selector(uploadTaskWithRequest:fromFile:), @selector(nbs_uploadTaskWithRequest:fromFile:), YES);
    methodSwizzle([NSURLSession class], @selector(uploadTaskWithRequest:fromData:), @selector(nbs_uploadTaskWithRequest:fromData:), YES);
    
    methodSwizzle([NSURLSession class], @selector(uploadTaskWithStreamedRequest:), @selector(nbs_uploadTaskWithStreamedRequest:), YES);
}

未完成的部分

  • 标红的都不理解
  • 还有下面的判断,请指教,谢谢


    标红的都不理解

相关文章

网友评论

      本文标题:关于听云sdk关于hook NSURLSession的反编译

      本文链接:https://www.haomeiwen.com/subject/misjzftx.html