伪代码如下
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);
}
未完成的部分
- 标红的都不理解
-
还有下面的判断,请指教,谢谢
标红的都不理解
网友评论