system 函数被废除的替代方法
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,做越狱应用和插件开发,经常会调用 system 去执行系统命令,早在 Xcode 7,使用 system 函数提示警告:'system' is deprecated: first deprecated
千家信息网最后更新 2025年01月22日system 函数被废除的替代方法
做越狱应用和插件开发,经常会调用 system 去执行系统命令,早在 Xcode 7,使用 system 函数提示警告:
'system' is deprecated: first deprecated in iOS 8.0 - Use posix_spawn APIs installd
只是警告,还是可以正常编译和使用,但是升级到 Xcode 9,system 函数就从 SDK 中移除了,不能再使用了,提示:
'system' is unavailable: not available on iOS
替代的方法一般有三种,第一种是使用 posix_spawn,代码如下:
pid_t pid;char *argv[] = { "/bin/ls", //path "-al", //parameter1 "/", //parameter2 NULL}; posix_spawn(&pid, argv[0], NULL, NULL, argv, NULL); printf("pid=%d,child pid = %d\n",getpid(),pid); int stat;waitpid(pid,&stat,0);printf("stat is %d\n",stat);
第二种是使用 NSTask,代码如下:
NSTask *task = [[NSTask alloc] init];task.launchPath = @"/bin/ls";task.arguments = [NSArray arrayWithObjects: @"-al", @"/", nil];[task launch];[task waitUntilExit];
NSTask.h 头文件信息如下:
#import@class NSString, NSArray, NSDictionary; @interface NSTask : NSObject // Create an NSTask which can be run at a later time// An NSTask can only be run once. Subsequent attempts to// run an NSTask will raise.// Upon task death a notification will be sent// { Name = NSTaskDidTerminateNotification; object = task; }// - (instancetype)init; // set parameters// these methods can only be done before a launch// if not set, use current// if not set, use current // set standard I/O channels; may be either an NSFileHandle or an NSPipe- (void)setStandardInput:(id)input;- (void)setStandardOutput:(id)output;- (void)setStandardError:(id)error; // get parameters@property (NS_NONATOMIC_IOSONLY, copy) NSString *launchPath;@property (NS_NONATOMIC_IOSONLY, copy) NSArray *arguments;@property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *environment;@property (NS_NONATOMIC_IOSONLY, copy) NSString *currentDirectoryPath; // get standard I/O channels; could be either an NSFileHandle or an NSPipe- (id)standardInput;- (id)standardOutput;- (id)standardError; // actions- (void)launch; - (void)interrupt; // Not always possible. Sends SIGINT.- (void)terminate; // Not always possible. Sends SIGTERM. @property (NS_NONATOMIC_IOSONLY, readonly) BOOL suspend;@property (NS_NONATOMIC_IOSONLY, readonly) BOOL resume; // status@property (NS_NONATOMIC_IOSONLY, readonly) int processIdentifier; @property (NS_NONATOMIC_IOSONLY, getter=isRunning, readonly) BOOL running; @property (NS_NONATOMIC_IOSONLY, readonly) int terminationStatus; @end @interface NSTask (NSTaskConveniences) + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments;// convenience; create and launch - (void)waitUntilExit;// poll the runLoop in defaultMode until task completes @end FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification;
如果非要调用 system 函数不可,那就使用第三种方法,找到 system 函数地址直接调用,方法参见: 动态调用函数,具体代码如下:
typedef int (*my_system) (const char *str);int call_system(const char *str){ //动态库路径 char *dylib_path = "/usr/lib/libSystem.dylib"; //打开动态库 void *handle = dlopen(dylib_path, RTLD_GLOBAL | RTLD_NOW); if (handle == NULL) { //打开动态库出错 fprintf(stderr, "%s\n", dlerror()); } else { //获取 system 地址 my_system system = dlsym(handle, "system"); //地址获取成功则调用 if (system) { int ret = system(str); return ret; } dlclose(handle); //关闭句柄 } return -1;}
这样 call_system 函数就相当于 system 的功能了,替换即可。
原文地址:https://www.exchen.net/ios-hacker-system-%E5%87%BD%E6%95%B0%E8%A2%AB%E5%BA%9F%E9%99%A4%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%B3%95.html
函数
动态
地址
方法
代码
提示
成功
信息
功能
原文
句柄
只是
命令
常会
插件
文件
系统
路径
还是
升级
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
上海使用软件开发创新服务
服务器没有权限能用命令方块吗
mysql批量修改数据库
传统服务器管理能力
战地五无限弹药服务器
鱼雁聊天软件服务器是哪个国家的
对日软件开发英文怎么写
网络安全模式 做系统
服务器的相关大专就业岗位
绿湾科技参加互联网大会
定制软件开发优点
懂一点网络安全知识
龙口安卓软件开发解决方案
马方超 网络安全
圆通子系统数据库安装教程
perl连接数据库方法
t6数据库安装
中关村网络安全产业园
网络安全在我身边总结
云曦 服务器
软件开发个人博客
北京创鑫家网络技术有限公司
北京互联网企业科技助力
model数据库
最基础的网络安全设备
vfdb数据库怎么用
通信网络安全能力风险评估
westlaw数据库要付费吗
芬尼网络安全吗
杰奇数据库崩溃