【iOS逆向与安全】好用的一套 TCP 类

这篇具有很好参考价值的文章主要介绍了【iOS逆向与安全】好用的一套 TCP 类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 初始化

//页面
%hook xxxxxxxViewController

//- (void)viewWillAppear:(BOOL)animated{
//NSLog(@"View Will Appear,再次进入刷新");
- (void)viewDidLoad{
    
    //启动tcp
    [[Xddtcp sharedTcpManager] connectServer] ;

}

 发送数据

//发送数据 

[[Xddtcp sharedTcpManager] sendDataToServer:[@"MyiPhone" dataUsingEncoding:NSUTF8StringEncoding]] ;


源码类

//
//  Xddtcp.m
//  YFX_ScoketForClientDemo
//
//  Created by adminxdd on 2020/8/20.
//  Copyright © 2020 fangxue. All rights reserved.
//

#import "Xddtcp.h"


#define WSELF __weak typeof(self) wself = self;

/** 主线程异步队列 */
#define Dispatch_main_async_safe(block)\
if ([NSThread isMainThread]) {\
block();\
} else {\
dispatch_async(dispatch_get_main_queue(), block);\
}

//@implementation Xddtcp
@interface Xddtcp() <GCDAsyncSocketDelegate>

/** 心跳计时器 */
@property (nonatomic, strong) NSTimer *heartBeatTimer;

/** 没有网络的时候检测网络定时器 */
@property(nonatomic,strong)NSTimer*netWorkTestingTimer;

/** 存储要发送给服务端的数据 */
@property (nonatomic, strong) NSMutableArray *sendDataArray;

/** 数据请求队列(串行队列) */
@property (nonatomic, strong) dispatch_queue_t queue;

/** 重连时间 */
@property (nonatomic, assign) NSTimeInterval reConnectTime;

/** 用于判断是否主动关闭长连接,如果是主动断开连接,连接失败的代理中,就不用执行 重新连接方法 */
@property (nonatomic, assign) BOOL isActivelyClose;

/** 缓存区域 */
@property (nonatomic, strong) NSMutableData *readBuf;

@end

@implementation Xddtcp

#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥
#pragma mark ----单利------

/** 单利 */
+ (instancetype)sharedTcpManager{
    static Xddtcp*_instace =nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        _instace = [[self alloc]init];
        NSLog(@"TCP 单利实例化!");
    });
    return _instace;
}
#pragma mark ----初始化------

/** 初始化 */
- (instancetype)init{
    self= [super init];
    if(self){
        self.reConnectTime = 0;
        self.isActivelyClose = NO;
        self.queue = dispatch_queue_create("BF",NULL);
        self.sendDataArray = [[NSMutableArray alloc] init];
        //        self.mRecvPacket = [JHreceivePacket sharedManager];
        //        self.deviceListArr = [[NSMutableArray alloc] init];
        //        DLogInfo(@"初始化!");
    }
    return self;
}

#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥

#pragma mark --- 心跳计时器处理 -----

/** 心跳计时器初始化 */
- (void)initHeartBeat{
    //心跳没有被关闭
    if(self.heartBeatTimer)
    {
        return;
    }
    [self destoryHeartBeat];
    
    //连接成功  先发一次 心跳数据 在打开计时器
    //[[JHSocketData sharedManager] heartbeat];
    
    //判断是否打开
    if([xddTools keyGet:@"isOpenTCP"]&&[[xddTools keyGet:@"isOpenTCP"] isEqualToString:@"已打开"]){
        
        [self.asyncTcpSocket writeData:[@"MyiPhone" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:30 tag:0];
        
    }
    
    WSELF
    Dispatch_main_async_safe(^{
        wself.heartBeatTimer  = [NSTimer timerWithTimeInterval:30 target:wself selector:@selector(senderheartBeat) userInfo:nil repeats:true];
        
        [[NSRunLoop currentRunLoop]addTimer:wself.heartBeatTimer forMode:NSRunLoopCommonModes];
        
    });
    
}

#pragma mark --- 取消心跳 -----

/** 取消心跳 */
- (void)destoryHeartBeat
{
    WSELF
    Dispatch_main_async_safe(^{
        if(wself.heartBeatTimer){
            [wself.heartBeatTimer invalidate];
            wself.heartBeatTimer =nil;
        }
    });
}

#pragma mark --- 没有网络的时候开始定时 -- 用于网络检测 -----

/** 没有网络,进行网络监测 */
- (void)noNetWorkStartTestingTimer{
    WSELF
    Dispatch_main_async_safe(^{
        wself.netWorkTestingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:wself selector:@selector(noNetWorkStartTesting) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:wself.netWorkTestingTimer forMode:NSDefaultRunLoopMode];
        
    });
}

#pragma mark --- 取消网络监测 ----

/** 取消网络监测 */
- (void)destoryNetWorkStartTesting
{
    WSELF
    Dispatch_main_async_safe(^{
        if(wself.netWorkTestingTimer){
            [wself.netWorkTestingTimer invalidate];
            wself.netWorkTestingTimer =nil;
        }
    });
}

#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥

#pragma mark --- 发送心跳 ---

/** 发送心跳 */
- (void)senderheartBeat{
    //  和服务端约定好发送什么作为心跳标识,尽可能的减小心跳包大小
    [self.asyncTcpSocket writeData:[@"ok" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:30 tag:0];
    
    //    WSELF;
    //    Dispatch_main_async_safe(^{
    //
    //    });
}

#pragma mark --- 定时检查网络 ---

/** 定时检查网络 */
- (void)noNetWorkStartTesting{
    //有网络
    if(AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus != AFNetworkReachabilityStatusNotReachable)
    {
        //关闭网络检测定时器
        [self destoryNetWorkStartTesting];
        //开始重连
        [self reConnectServer];
    }
    
}
#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥

#pragma mark ----建立连接------

/**  建立连接 */

-(void)connectServer{
    
    self.isActivelyClose = NO;
    
    NSError*error =nil;
    
    _asyncTcpSocket= [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    
    NSString* ip       = [xddTools keyGet:@"TCP_IP"];
    NSString* port_str = [xddTools keyGet:@"TCP_Port"];
    
    if([ip isEqualToString:@""]){
        ip = @"192.168.1.2";
        [xddTools keySet:@"TCP_IP" v:ip];
    }
    
    if([port_str isEqualToString:@""]){
        port_str = @"12485";
        [xddTools keySet:@"TCP_Port" v:port_str];
    }
    
    UInt16 port = [port_str integerValue];
    
    //你的ip地址和端口号
    [_asyncTcpSocket connectToHost:ip onPort:port withTimeout:60 error:&error];
    
    if(error) {
        NSLog(@"TCP连接错误:%@", error);
    }
    [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];
    
}

#pragma mark --- 重连服务器 ---

/** 重连服务器 */
- (void)reConnectServer{
    if (self.asyncTcpSocket.isConnected) {
        return;
    }
    if (self.reConnectTime > 10240) {
        self.reConnectTime = 0;
        return;
    }
    WSELF;
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.reConnectTime *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        if(wself.asyncTcpSocket.isConnected)
        {
            return;
        }
        [wself connectServer];
        NSLog(@"正在重连%f",wself.reConnectTime);
        if(wself.reConnectTime==0){ //重连时间2的指数级增长
            wself.reConnectTime=2;
        } else {
            wself.reConnectTime*=2;
        }
    });
    
    NSLog(@"重连服务器!");
    
}

#pragma mark ----关闭连接------
/** 关闭连接 */
- (void)disConnectServer {
    
    NSLog(@"dealloc");
    // 关闭套接字
    self.isActivelyClose = YES;
    [self.asyncTcpSocket disconnect];
    //关闭心跳定时器
    [self destoryHeartBeat];
    //关闭网络检测定时器
    [self destoryNetWorkStartTesting];
    self.asyncTcpSocket = nil;
}

#pragma mark ---代理 连接成功 ---
//连接成功
-(void)socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port
{
    NSLog(@"TCP连接成功!");
    //    [self.asyncTcpSocket readDataWithTimeout:-1 tag:index];
    //      [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];
    
    // 存储接收数据的缓存区,处理数据的粘包和断包
    self.readBuf = [[NSMutableData alloc]init];
    
    [self initHeartBeat]; //开启心跳
    
    //如果有尚未发送的数据,继续向服务端发送数据
    
    if([self.sendDataArray count] >0){
        [self sendeDataToServer];
    }
}

#pragma mark ---代理 连接失败 ---
//连接失败 进行重连操作
-(void)socketDidDisconnect:(GCDAsyncSocket*)sock withError:(NSError*)err{
    //用户主动断开连接,就不去进行重连
    if(self.isActivelyClose)
    {
        return;
    }
    [self destoryHeartBeat]; //断开连接时销毁心跳
    //判断网络环境
    if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) //没有网络
    {
        [self noNetWorkStartTestingTimer];//开启网络检测定时器
    }
    else//有网络
    {
        [self reConnectServer];//连接失败就重连
    }
    NSLog(@"TCP连接失败!");
}

#pragma mark --- 消息发送成功 ---
-(void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag{
    NSLog(@"TCP发送成功");
}

#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥

#pragma mark --- 发送数据 ---
-(void)sendDataToServer:(id)data{
    
    [self.sendDataArray addObject:data];
    [self sendeDataToServer];
    //      [self.asyncTcpSocket  writeData:data withTimeout:60 tag:0];
}

#pragma mark --- 发送数据给服务器 详细处理 ---

/** 发送数据的详细处理 */
-(void)sendeDataToServer{
    
    WSELF
    //把数据放到一个请求队列中
    dispatch_async(self.queue, ^{
        //网络判断  没有网络的情况
        if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {
            //开启网络检测定时器
            [wself noNetWorkStartTestingTimer];
        }else{ //有网络情况
            //判断对象是否存在
            if(wself.asyncTcpSocket != nil) {
                //判断TCP是否处于连接状态
                if(wself.asyncTcpSocket.isConnected) {
                    //判断数据  是否存在
                    if(wself.sendDataArray.count>0) {
                        id sendData = wself.sendDataArray[0];
                        NSLog(@"TCP发送出去的数据: %@",sendData);
                        [self.asyncTcpSocket writeData:sendData withTimeout:30  tag:0];
                        [wself.sendDataArray removeObjectAtIndex:0];
                        if([wself.sendDataArray count] >0){
                            [wself sendeDataToServer];
                        }
                    }
                }else{
                    //TCP 处于断开状态
                    //主动去重连服务器  连接成功后 继续发送数据
                    [wself reConnectServer];
                }
            }else{
                [wself reConnectServer];
            }
        }
    });
}

#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥

#pragma mark --- 接收的数据 ---
-(void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag
{
    //      sleep(1);
    //此方法处理数据的黏包或者断包
    NSLog(@"原始数据%@",data);
    
    NSString*msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"xdd接收的数据 = %@",msg);
    
    //断包处理
    [self didReadData:data];
    
    [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];
    
    
    NSDictionary*retDic = [xddTools dictionaryWithJsonString:msg];
    if(retDic == nil || ! [retDic isKindOfClass:[NSDictionary class]]) {
        return ;
    }
    
    NSString*type_ = retDic[@"type"];
    NSString*data_ = retDic[@"data"];
    NSString*msgid_ = retDic[@"msgid"]?retDic[@"msgid"]:@"test";
    
    NSLog(@"xdd接收的数据type_=%@,type_=%@",type_,data_);
   //开始主线程
//    dispatch_async(dispatch_get_main_queue(), ^{

        //开始子线程
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
        if(type_ && data_ && [type_ isEqualToString:@"1"]){
            //获取森林信息
            NSDictionary*dic = [xddTools getMYinfo:data_];
            
            BOOL success =  [dic[@"success"] boolValue]; //是否成功
            NSString*resultDesc = dic[@"resultDesc"];//信息提示
            NSString*resultCode = dic[@"resultCode"];//返回代码
            
            NSString*currentEnergy = dic[@"treeEnergy"][@"currentEnergy"];//当前能量
            
            NSDictionary*userEnergy = dic[@"userEnergy"];
            NSString*loginId = userEnergy[@"loginId"];//3333@qq.com
            NSString*userId = userEnergy[@"userId"];//2088*****
            NSString*headPortrait = userEnergy[@"headPortrait"];//头像
            NSString*displayName = userEnergy[@"displayName"];//昵称 茶
            NSString*energySummation = userEnergy[@"energySummation"];//合计能量
            NSString*treeAmount = userEnergy[@"treeAmount"];//证书个数
            
            NSDictionary *dicRetInfo = [NSDictionary dictionaryWithObjectsAndKeys:
            msgid_,@"msgid"
            ,type_,@"type"
            ,resultCode,@"code"
            ,currentEnergy,@"current"
            ,energySummation,@"summation"
            ,userId,@"userId"
            ,loginId,@"loginId"
            ,headPortrait,@"png"
            ,treeAmount,@"tree"
            ,displayName,@"name"
            ,nil];
            
            NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dicRetInfo] dataUsingEncoding:NSUTF8StringEncoding];
            //NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dicRetInfo options:NSJSONWritingPrettyPrinted error:nil];
            [self sendDataToServer:jsonData];
            
        }else if(type_ && data_ && ( [type_ isEqualToString:@"2"] || [type_ isEqualToString:@"4"])){
            NSDictionary*dic;
            
            if([type_ isEqualToString:@"2"]){
                // 查询用户手机 昵称信息
                dic = [xddTools getiPhoneInfo:data_];
                
            }else if([type_ isEqualToString:@"4"]){
                // 查询用户ID昵称信息
                dic = [xddTools getuseriDInfo:data_];
            }
            
            NSString*account = dic[@"userAccount"];
            NSString*userID = dic[@"userID"];
            NSString*nickl = dic[@"userNicklName"];
            NSString*name = dic[@"userName"];
            NSString*status = dic[@"resultStatus"];
            NSString*Suffix = dic[@"userNameSuffix"];
            NSString*RealName = dic[@"userRealName"];
            NSString*gender = dic[@"gender"];
            //userNameSuffix 实名名字
            //userRealName 注册名字
            //gender 性别
            
            NSDictionary *dicRetInfo = [NSDictionary dictionaryWithObjectsAndKeys:
            msgid_,@"msgid"
            ,type_,@"type"
            ,status,@"status"
            ,account,@"account"
            ,userID,@"userID"
            ,nickl,@"nickl"
            ,name,@"name"
            ,Suffix,@"Suffix"
            ,RealName,@"RealName"
            ,gender,@"gender"
            ,nil];
                       
            
            //625 对方账户存在异常,不能进行当前操作 100 ok
            NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dicRetInfo] dataUsingEncoding:NSUTF8StringEncoding];
            //NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dicRetInfo options:NSJSONWritingPrettyPrinted error:nil];
            [self sendDataToServer:jsonData];
            
        }else if(type_ && data_ && [type_ isEqualToString:@"3"]){
            //获取合种二维码信息
            NSDictionary*dic = [xddTools gethezhongqrCode:data_];
            
            
//            BOOL success =  [dic[@"success"] boolValue]; //是否成功
//            NSString*resultDesc = dic[@"resultDesc"];//信息提示
//            NSString*resultCode = dic[@"resultCode"];//返回代码
            
            // 可变字典 转可变字典
            NSMutableDictionary *dict002 = [NSMutableDictionary dictionaryWithDictionary:dic];
            [dict002 setObject:msgid_ forKey:@"msgid"];
            [dict002 setObject:type_ forKey:@"type"];
            
            [dict002 removeObjectForKey:@"extInfo"];
            
//            NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dict002] dataUsingEncoding:NSUTF8StringEncoding];
            NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict002 options:NSJSONWritingPrettyPrinted error:nil];
            [self sendDataToServer:jsonData];
            
        
        }
        else if(type_ && data_ && [type_ isEqualToString:@"5"]){
            //获取签名
             NSDictionary*dic = [xddTools getAlipaysign:retDic];
            
            
            NSMutableDictionary *dict002 = [NSMutableDictionary dictionaryWithDictionary:dic];
            [dict002 setObject:msgid_ forKey:@"msgid"];
            [dict002 setObject:type_ forKey:@"type"];

            NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dict002] dataUsingEncoding:NSUTF8StringEncoding];
            [self sendDataToServer:jsonData];
            
        }
        else if(type_ && data_ && [type_ isEqualToString:@"6"]){
            //获取签名
             NSDictionary*dic = [xddTools getAlipaysignV1:retDic];
            
            
            NSMutableDictionary *dict002 = [NSMutableDictionary dictionaryWithDictionary:dic];
            [dict002 setObject:msgid_ forKey:@"msgid"];
            [dict002 setObject:type_ forKey:@"type"];

            NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dict002] dataUsingEncoding:NSUTF8StringEncoding];
            [self sendDataToServer:jsonData];
            
        }
        else if(type_ && data_ && [type_ isEqualToString:@"xxx"]){
            
        }
        
            
            
    });
    
}
#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥
#pragma mark --- 黏包 断包处理 ---
-(void) didReadData:(NSData*)data {
    
    //断包处理 要根据 你的 数据的 长度标识位的数据 来判断 读到什么地方 才是你完整的数据。根据协议去走
    
    _readBuf = [NSMutableData dataWithData:data];
    
    // 取出4-8位保存的数据长度,计算数据包长度
    
    while(_readBuf.length>=5) {// 头数据为5个字节
        // 得到数据的ID 和 整个数据的长度
        NSData *dataLength = [_readBuf subdataWithRange:NSMakeRange(3, 2)];
        Byte*ByteLength = (Byte*)[dataLength bytes];
        int headLen = (ByteLength[0] &0x00ff) + ((ByteLength[1] &0x00ff) <<8);
        NSInteger lengthInteger =0;
        
        lengthInteger = (NSInteger)headLen;
        NSInteger complateDataLength = lengthInteger +6;//算出一个包完整的长度(内容长度+头长度)
        NSLog(@"已读取数据:缓冲区长度:%ld, 接收长度:%lu  数据长度:%ld ", (long)_readBuf.length, (unsigned long)[data length], (long)complateDataLength);
        
        //        NSInteger dataLength = length + 2;
        if(_readBuf.length>= complateDataLength) {//如果缓存中的数据 够  一个整包的长度
            NSData*msgData = [_readBuf subdataWithRange:NSMakeRange(0, complateDataLength)];
            
            // 处理消息数据
            NSLog(@"得到完整包数据:%@",msgData);
            // 从缓存中截掉处理完的数据,继续循环
            _readBuf= [NSMutableData dataWithData:[_readBuf subdataWithRange:NSMakeRange(complateDataLength,_readBuf.length- complateDataLength)]];
            
            //            [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];
        }else{// 断包情况,继续读取
                
                //            [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];
                
                //            [sock readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];//继续读取数据
                
            [self.asyncTcpSocket readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];
            return;
        }
        [self.asyncTcpSocket readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];//继续读取数据
    }
    
}

@end
//
//  Xddtcp.h
//  YFX_ScoketForClientDemo
//
//  Created by adminxdd on 2020/8/20.
//  Copyright © 2020 fangxue. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "AFNetworkReachabilityManager.h"
NS_ASSUME_NONNULL_BEGIN



NS_ASSUME_NONNULL_END


#import <Foundation/Foundation.h>

#import "GCDAsyncSocket.h"

#import "xddTools.h"

//@interface SingleTcpCase :NSObject
@interface Xddtcp : NSObject

@property(strong,nonatomic)GCDAsyncSocket *asyncTcpSocket;

/**  单利初始化 */

+(instancetype)sharedTcpManager;

/**  建立连接 */

-(void)connectServer;

/**  关闭连接 */

-(void)disConnectServer;

/**  发送数据给服务器 */

-(void)sendDataToServer:(id)data;



@end

配置端口文章来源地址https://www.toymoban.com/news/detail-734512.html

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"请输入配置信息" message:@"++++++" preferredStyle:UIAlertControllerStyleAlert];
            
            //增加取消按钮;
            [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
            //增加确定按钮;
            [alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
                //获取第1个输入框;
                UITextField *userNameTextField = alertController.textFields.firstObject;
                
                //获取第2个输入框;
                UITextField *passwordTextField = alertController.textFields.lastObject;
                //NSLog(@"用户名 = %@,密码 = %@",userNameTextField.text,passwordTextField.text);
                
                if(userNameTextField.text && ![userNameTextField.text isEqualToString:@""]){
                    [xddTools keySet:@"TCP_IP" v:userNameTextField.text];
                }
                if(passwordTextField.text && ![passwordTextField.text isEqualToString:@""]){
                    [xddTools keySet:@"TCP_Port" v:passwordTextField.text];
                }
            }]];
            
            //定义第一个输入框;
            [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
                textField.placeholder = @"请输入配置IP";
                textField.text = [xddTools keyGet:@"TCP_IP"];
            }];
            //定义第二个输入框;
            [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
                textField.placeholder = @"请输入配置端口";
                textField.text = [xddTools keyGet:@"TCP_Port"];
            }];
            
            [weakSelf presentViewController:alertController animated:true completion:nil];
+(NSString*)keyGet:(NSString*)k
{
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    return [userDefault objectForKey:k]?[userDefault objectForKey:k]:@"";
//    - objectForKey:
//    - URLForKey:
//    - arrayForKey:
//    - dictionaryForKey:
//    - stringForKey:
//    - stringArrayForKey:
//    - dataForKey:
//    - boolForKey:
//    - integerForKey:
//    - floatForKey:
//    - doubleForKey:
//    - dictionaryRepresentation
}
+(void)keySet:(NSString*)k v:(NSString*)v
{
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    [userDefault setObject:v forKey:k];
    [userDefault synchronize];
//        - setObject:forKey:
//       - setFloat:forKey:
//       - setDouble:forKey:
//       - setInteger:forKey:
//       - setBool:forKey:
//       - setURL:forKey:
}

到了这里,关于【iOS逆向与安全】好用的一套 TCP 类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【iOS逆向与安全】sms短信转发插件开发

    经过之前的分享,相信大家已经掌握了用户级的插件开发。勤奋好学的你是否对系统级的插件也有着浓厚的性趣,本篇文章将和大家一起学习如何分析并编写一款系统级的插件。 一步步分析并编写一个短信自动转发的deb插件 mac系统 已越狱iOS设备:脱壳及frida调试 IDA Pro:静态

    2024年02月10日
    浏览(43)
  • 【iOS逆向与安全】使用ollvm混淆你的源码

    当你在研究别人源码的时候,是不是期望着别人代码没有进行任何的防护和混淆。这时的你,是不是应该考虑一下自己代码的安全.本篇文章将告诉你,如何使用ollvm来混淆iOS端的代码【此文为入门贴,大佬请绕道】。 编译ollvm工具,并在Xcode中来混淆你的ipa或动态库,增加别

    2023年04月19日
    浏览(85)
  • 【iOS逆向与安全】编写一个使应用保持前台运行的系统插件

    iOS越狱为用户打开了无限的可能性,其中之一是便是开发系统级插件,为了确保应用程序一直保持在前台,即使在意外情况下也是如此。 本文将向您展示如何轻松编写这样的插件,让我们开始探索iOS系统插件的世界吧! 学会创建功能强大的iOS系统插件。 mac系统 frida:动态调

    2024年02月03日
    浏览(42)
  • 【iOS逆向与安全】越狱检测与过检测附ida伪代码

    首先在网上查找一些检测代码 放入项目运行,用 ida 打开后 F5 得到下面的 用 frida hook hook stat hook md5 frida-trace -UF -i \\\"CC_MD5\\\" -f xxxxxxx.xxx.xxxx fishhook 下面是网上找的源码

    2024年02月03日
    浏览(39)
  • 超适合练手的一套JavaWeb项目 (超市后台管理系统)

    1.搭建一个maven web项目 2.配置Tomcat 3.测试项目是否能够跑起来 4.导入项目中遇到的jar包 5.创建项目结构 1.数据库配置文件 db.properties文件代码 2.编写数据库的公共类 java代码 3.编写字符编码过滤器 xml代码 java dao层接口代码 java dao接口的实现类代码 java service接口代码

    2024年02月05日
    浏览(50)
  • vue-element-admin:基于element-ui 的一套后台管理系统集成方案

    1.1简介 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub地址:https://github.com/PanJiaChen/vue-element-admin 项目在线预览:https://panjiachen.gitee.io/vue-element-admin 1.2安装 如果上面的install报错 则先执行下面的命令,再install 2.1简介 vueAdmin-template是基于vue-element-admin的一套

    2023年04月16日
    浏览(49)
  • 基于百度语音识别、文心一言大模型、百度语音合成的一套完整的语音交互(利用Python实现)

           本人小白,因为毕设项目需要用的语音交互,便查网上的资料利用百度api实现,比较简单的过程,供大家借鉴批判。 项目框架大致分为3步:(1)百度语音识别可以将我们输入的语音转化为文本输入到文心一言大模型;(2)文心一言大模型根据输入以输出响应文本;

    2024年04月17日
    浏览(57)
  • IOS逆向初探

    这些文章用于记录学习路上的点点滴滴,也希望能给到刚入门的小伙伴们一点帮助。爱而所向,不负所心。 iphone 6 MacOS Monterey 12.3.1 Objective-C是iOS操作系统运用的软件开发语言。Objective-C的流行完全是因为iphone的成功。Objective-C是OS 系统的开发语言,是面向对象的编程语言,它

    2024年02月06日
    浏览(31)
  • IOS逆向前期环境准备笔记

    ios系统由于效验问题,只能升级不能降级,需要特别注意, 刷系统可以在爱思上搞定; 越狱推荐使用u盘镜像及本地启动盘制作: 注意,要进去bios,关闭安全启动,不然直接失败: Checkra1n镜像:https://share.weiyun.com/kr63NENg 其他工具:https://blog.6ziz.com/jailbreakdownload 参考教程:

    2024年02月11日
    浏览(46)
  • IOS逆向-更改常见算法脚本

    堆栈打印: 我们盲猜测算法后,可以直接使用: frida-trace -UF -i CC_MD5 -i CC_SHA1 可以无限迭代, -i xxx ; 我们知道object-C 前两个参数,一个是类本身,一个是方法名,所以我们打印可以直接打印下标为2的值; 直接更改这个路径下的js文件,完善脚本; C:Usersxxx_ handlers _libcommo

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包