热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

让别人的app变成自己的app—砸壳,破解,逆向,阻拦,重定向之路

让别人的app变成自己的app系列阻拦网络请求后进行网址或者ip替换注:~本文仅用于学习研究,请勿用于非法用途需要ios企业签名可以联络我1113704624~破解APP的方法很多

让别人的app变成自己的app系列 -- 阻拦网络请求后进行网址或者ip替换

注: ~ 本文仅用于学习研究,请勿用于非法用途 需要ios企业签名 可以联络 我1113704624 ~

破解APP的方法很多,如砸壳破解逆行等,或者者修改Macho文件,但因为很多网站因为加了密,这些办法都不行.今天我们在这里讲一个终极办法阻拦网络请求或者者替换IP的方法.

1:应用场景

  • \color{red}{除去设备锁,或时间锁}
    比方某些抢红包应用有设施锁或者者时间锁,按设施或者者按年付费,部分客户不想付费的话,我们可以通过阻拦网络,mock data 来破解此类应用;

  • \color{red}{部署多套授权的系统}
    少量人买了一套系统, app端访问的接口是写死在打包好的二进制文件,想部署多套应用无法部署.这个时候可以通过阻拦网络请求后进行服务器地址替换,完成多套部署.

2:实现原理

要想阻拦,我们需要先弄懂IOS的网络请求原理,请看下图

# 网络 <--> NSURLProtocol <--> 网络库

大部分的网络请求都要通过一个叫NSURLProtocol 的笼统类,既然都要通过这个笼统类,那我们是不是通过重载NSURLProtocol的方式进行网络请求的阻拦与过滤呢,答案当然是一定的.但世界上没有银弹,NSURLProtocol不能处理所有的问题,为什么呢.由于NSURLProtocol可以阻拦的网络请求包括NSURLSession,NSURLConnection。现在主流的iOS网络库,例如AFNetworking,Alamofire等网络库都是基于NSURLSession或者NSURLConnection的,所以这些网络库的网络请求都可以被NSURLProtocol所阻拦。

PS:基于CFNetwork的网络请求,以及WKWebView的请求是无法阻拦的。例如ASIHTTPRequest,MKNetwokit等网路库都是基于CFNetwork的,所以这些网络库的网络请求无法被NSURLProtocol阻拦。

3.实现步骤

1、创立NSURLProtocol子类

因为NSURLProtocol是一个笼统类,要使用它的时候需要创立它的一个子类。.m文件如下:

#import "ReplaceURLProtocol.h"// 为了避免canInitWithRequest和canonicalRequestForRequest的死循环static NSString *const URLProtocolHandledKey = @"URLProtocolHandledKey";// 老url网址static NSString *const old_url = @"baidu.com";// 新url网址static NSString *const new_url = @"google.com";@interface ReplaceURLProtocol()@property(nonatomic,strong)NSURLSession * session;@end@implementation ReplaceURLProtocol+(BOOL)canInitWithRequest:(NSURLRequest *)request{ return YES;}//改变请求request+(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request{ // 业务逻辑写这里 return request;}//开始请求-(void)startLoading{ //业务逻辑写这里}//中止请求-(void)stopLoading{}#pragma mark ---- NSURLSessionDelegate/* NSURLSessionDelegate接到数据后,通过URLProtocol传出去 */- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ if (error) { [self.client URLProtocol:self didFailWithError:error]; } else { [self.client URLProtocolDidFinishLoading:self]; }}- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; completionHandler(NSURLSessionResponseAllow); }- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ [self.client URLProtocol:self didLoadData:data];}@end

2、注册protocol

基于NSURLConnection或者[NSURLSession sharedSession]创立的网络请求,在AppDelegate的didFinishLaunchingWithOptions方法中调用registerClass方法就可。

//注册protocol [NSURLProtocol registerClass:[ReplaceURLProtocol class]];returnYES;}

3、阻拦客户的网络请求
首先,在阻拦到网络请求后会先调用+(BOOL)canInitWithRequest:(NSURLRequest *)request方法。我们可以在该方法里进行能否解决这个阻拦的逻辑。如设置只对阻拦到的http或者https请求进行解决。

+(BOOL)canInitWithRequest:(NSURLRequest *)request{ // 不是网络请求,不解决 if (![request.URL.scheme isEqualToString:@"http"] && ![request.URL.scheme isEqualToString:@"https"]) { return NO; } // 指定阻拦网络请求,如:www.baidu.com if ([request.URL.absoluteString containsString:old_url]) { return YES; }else { return NO; }}

接着,会调用+(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request在该方法中,我们可以对request进行解决。例如修改头部信息等。最后返回一个解决后的request实例。也可以在该方法里面将客户的请求域名替换成别的域名:

/** 设置我们自己的自己设置请求 可以在这里统一加上头之类的 @param request 应用的此次请求 @return 我们自己设置的请求 */+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { NSMutableURLRequest *mutableReqeust = [request mutableCopy]; // 设置已解决标志 [NSURLProtocol setProperty:@(YES) forKey:kProtocolHandledKey inRequest:mutableReqeust]; NSLog(@"************ 原始请求的url1 %@",request.URL); if ([request.URL host].length == 0) { return request; } NSString * originUrlStr = [request.URL absoluteString]; NSString * originHostStr = [request.URL host]; NSRange hostRange = [originUrlStr rangeOfString:originHostStr]; if (hostRange.location == NSNotFound) { return request; } //指定阻拦网络请求,如:www.baidu.com if ([request.URL.absoluteString containsString:old_url]) { //定向到百度搜索 NSString * ip = new_url; NSString * urlStr = [originUrlStr stringByReplacingCharactersInRange:hostRange withString:ip]; NSURL * url = [NSURL URLWithString:urlStr]; mutableReqeust.URL = url; NSLog(@"************ 替换后的url 1 %@",mutableReqeust.URL); return [mutableReqeust copy]; } else{ return request; }

4、转发

-(void)startLoading将解决过的request重新发送出去。发送的形式,可以是基于NSURLConnection,NSURLSession甚至CFNetwork。我们也可以在该方法里面设置网络代理商,如下我们设置一个代理商后,重新创立一个NSURLSession将网络请求发送出去:

// 重新父类的开始加载方法- (void)startLoading { NSMutableURLRequest * mutableRequest = [[self request] mutableCopy]; NSLog(@"************ 开始请求 %@",mutableRequest.URL); NSURLSessionConfiguration * cOnfiguration= [NSURLSessionConfiguration ephemeralSessionConfiguration];//创立一个临时会话配置 //网络请求 self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[[NSOperationQueue alloc] init]];// 注 这里也可以增加代理商 捕获客户请求数据 NSURLSessionTask * task = [self.session dataTaskWithRequest:self.request]; [task resume];//开始任务}

5、回调

上面使用的是NSURLSession请求,所以我们通过NSURLSessionDelegate来接收网络请求的数据(成功或者失败等信息):

#pragma mark ---- NSURLSessionDelegate/* NSURLSessionDelegate接到数据后,通过URLProtocol传出去 *///失败- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ if (error) { [self.client URLProtocol:self didFailWithError:error]; //请求错误 } else { [self.client URLProtocolDidFinishLoading:self]; //完成加载 }}//接收到响应- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //创立一个响应(缓存策略:不缓存) completionHandler(NSURLSessionResponseAllow); }//接收到数据- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ [self.client URLProtocol:self didLoadData:data]; //接收到数据}

6、结束

在-(void)stopLoading完成网络请求的操作

//结束请求-(void)stopLoading{ [self.session invalidateAndCancel]; self.session = nil;}

欢迎加入iOS技术处理方案群,群聊号码:1060356414


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
小编106
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有