ios-hooks/AppRunMan/server/IosSystemCmd.m
2025-11-06 11:38:46 +08:00

357 lines
10 KiB
Objective-C

//
// IosSystemCmd.m
// nochange
//
// Created by mac on 2024/8/27.
//
#import "IosSystemCmd.h"
#import "XSPhoneConfig.h"
#import "XSPhoneInfo.h"
#import "XSHelper.h"
#import "XSHackIos.h"
#import "MyEventBus.h"
#import "XSHttpHelper.h"
#import "MyAdTask2.h"
#import "MyAdServer.h"
#define CMD_RES @"/ios/top_selection/system_cmd_response"
#define CMD @"/ios/top_selection/system_cmds"
@implementation IosSystemCmd
{
@private
XSPhoneConfig *_config;
XSHttpHelper *http;
dispatch_source_t _timer; // 替换 NSTimer
dispatch_queue_t _workQueue;
}
+ (instancetype)sharedInstance {
static IosSystemCmd *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
self = [super init];
if (self) {
self->_config = [XSPhoneConfig sharedInstance];
self->http = [[XSHttpHelper alloc] init];
}
return self;
}
- (NSString *)cmdUrl {
return [NSString stringWithFormat:@"%@%@", _config.ServerURL, CMD];
}
- (NSString *)cmdResUrl {
return [NSString stringWithFormat:@"%@%@", _config.ServerURL, CMD_RES];
}
- (void) start {
if (_timer) return;
_workQueue = dispatch_queue_create("com.iossystemcmd.queue", DISPATCH_QUEUE_SERIAL);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _workQueue);
dispatch_source_set_timer(_timer, dispatch_time(DISPATCH_TIME_NOW, 0), 2 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
__weak typeof(self) weakSelf = self;
dispatch_source_set_event_handler(_timer, ^{
@autoreleasepool {
[weakSelf runTask];
}
});
dispatch_resume(_timer);
}
- (void) runTask {
NSLog(@"XC- run system task...");
NSString *deviceId = [_config DeviceId];
NSString *ip = [[XSPhoneInfo sharedInstance] IPAddress];
NSString *name = [_config IPhoneName];
NSDictionary *dic = @{
@"deviceId": deviceId,
@"ip": ip,
@"iphoneId": name
};
/*
pushInfo(2,
[XSHelper dic2Json:dic],
^(NSString *data) {
if(data){
NSDictionary *dic = [XSHelper json2Dictionary:data];
[self executeTask:dic];
} else {
NSLog(@"XC- get system cmd error");
}
}, ^(NSError *err) {
NSLog(@"XC- get system cmd error:%@",err);
});
*/
__weak typeof(self) weakSelf = self;
[self->http doPOST:[self cmdUrl] json:[XSHelper dic2Json:dic] withCallback:^(NSData *data) {
if (data) {
NSDictionary *dic = [XSHelper jsonData2Dictionary:data];
if (dic && [dic objectForKey:@"data"]) {
id data = dic[@"data"];
if (data && data != [NSNull null]) {
[weakSelf executeTask:data];
}
}
} else {
NSLog(@"XC- get system cmd error");
}
} withError:^(NSError *err) {
NSLog(@"XC- get system cmd error:%@",err);
}];
}
- (void) executeTask: (NSDictionary*)dic {
if ([dic objectForKey:@"cmd"]) {
NSString *cmd = dic[@"cmd"];
NSString *taskId = dic[@"taskId"];
if ([cmd isEqual:@"EDIT_NAME"]) {
[self executeEditName:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"UPLOAD_APPS"]) {
[self executeUploadApps:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"START"]) {
[self executeStart:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"STOP"]) {
[self executeStop:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"SCREENSHOT"]) {
[self executeScreenshot:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"UNLOCK"]) {
[self executeUnlock:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"RESTART_SYSTEM"]) {
[self executeRestart:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"RESTART"]) {
[self executeReboot:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"TOUCH"]) {
[self executeTouch:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"KEY"]) {
[self executeKey:taskId data:dic[@"cmdData"]];
return;
}
if ([cmd isEqual:@"UPDATE_KEY"]) {
[self executeUpdateKey:taskId data:dic[@"cmdData"]];
return;
}
}
}
- (void) putTask: (NSString*)taskId error: (NSString*)error data:(NSString*)data {
NSDictionary *dic = @{
@"taskId": taskId,
@"data": data,
@"error": error
};
/*
pushInfo(3, [XSHelper dic2Json:dic], ^(NSString *data) {
if(data) {
NSLog(@"XS- %@", data);
}
}, ^(NSError *err) {
NSLog(@"XS- %@", err);
});
*/
[self->http doPOST:[self cmdResUrl] json:[XSHelper dic2Json:dic] withCallback:^(NSData *data) {
if (data) {
NSLog(@"XS- %@", [XSHelper data2str:data]);
}
} withError:^(NSError *err) {
NSLog(@"XS- %@", err);
}];
}
- (void) executeEditName: (NSString*)taskId data:(NSString*)data {
if (data) {
BOOL setSs = [_config SetIPhoneName:data];
[[MyEventBus sharedInstance] postEvent:@"UpdateName" withObject:data];
NSString *r = [NSString stringWithFormat:@"set:%@", setSs == YES ?@ "YES": @"NO"];
[self putTask:taskId error:r data:data];
}
}
- (void) executeUploadApps: (NSString*)taskId data:(NSString*)data {
NSArray *apps = [self getMyApps];
NSData *appsData = [XSHelper obj2JsonData:apps];
if (appsData) {
[self putTask:taskId error:@"" data:[XSHelper data2str:appsData]];
} else {
NSLog(@"upload apps error");
}
}
- (void) executeStart: (NSString*)taskId data:(NSString*)data {
//[[XSConsole sharedInstance] restart];
[[MyEventBus sharedInstance] postEvent:@"UpdateRunStatus" withObject:@(YES)];
[[MyAdTask2Mangger sharedInstance] start];
[self putTask:taskId error:@"" data:data];
}
- (void) executeStop: (NSString*)taskId data:(NSString*)data {
//[[XSConsole sharedInstance] stop];
[[MyAdTask2Mangger sharedInstance] stop];
[[MyEventBus sharedInstance] postEvent:@"UpdateRunStatus" withObject:@(NO)];
[self putTask:taskId error:@"" data:data];
}
- (void) executeScreenshot:(NSString*)taskId data:(NSString*)data {
@try {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"executeScreenshot;%@;%@",taskId, data);
UIImage *img = XSCcaptureScreen2();
NSString *base64 = [XSHelper base64StringFromJpgImage:img];
if (base64) {
[self putTask:taskId error:@"" data:base64];
} else {
[self putTask:taskId error:@"截屏失败" data:data];
}
});
} @catch (NSException *exception) {
[self putTask:taskId error:@"截屏失败" data:data];
}
}
- (void) executeUnlock: (NSString*) taskId data:(NSString*)data {
@try {
//[[[XSJsApi alloc] init] unlock];
dispatch_async(dispatch_get_main_queue(), ^{
XSRemoteUnlock();
});
} @catch (NSException *exception) {
}
}
- (void) executeRestart: (NSString*) taskId data:(NSString*)data {
@try {
dispatch_async(dispatch_get_main_queue(), ^{
XSKillApp(@"SpringBoard");
});
} @catch (NSException *exception) {
}
}
- (void) executeReboot: (NSString*) taskId data:(NSString*)data {
@try {
dispatch_async(dispatch_get_main_queue(), ^{
XSReboot();
});
} @catch (NSException *exception) {
}
}
- (void) executeTouch: (NSString*) taskId data:(NSString*)data {
@try {
dispatch_async(dispatch_get_main_queue(), ^{
if(data && ![data isEqual:[NSNull null]]) {
NSDictionary *dic = [XSHelper json2Dictionary:data];
if (dic && ![dic isEqual:[NSNull null]]) {
NSNumber *x = dic[@"x"];
NSNumber *y = dic[@"y"];
float nx = [x floatValue];
float ny = [y floatValue];
//[[[XSJsApi alloc] init] tap:10 x:nx y:ny];
}
}
});
} @catch (NSException *exception) {
}
}
- (void) executeUpdateKey: (NSString*) taskId data:(NSString*)data {
[[XSPhoneConfig sharedInstance] SetApiKey:data];
}
- (void) executeKey: (NSString*) taskId data:(NSString*)data {
@try {
dispatch_async(dispatch_get_main_queue(), ^{
if(data && ![data isEqual:[NSNull null]]) {
NSDictionary *dic = [XSHelper json2Dictionary:data];
if (dic && ![dic isEqual:[NSNull null]]) {
NSNumber *k = dic[@"key"];
long key = [k longValue];
}
}
});
} @catch (NSException *exception) {
}
}
- (NSArray*) getMyApps {
NSArray *apps = XSGetApps();
NSMutableArray *resApps = [[NSMutableArray alloc] init];
[apps enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj) {
NSDictionary *oldDic = obj;
NSString *appId = oldDic[@"bundleId"];
if ([appId hasPrefix:@"com.apple."]) {
} else {
NSString *icon = @"";
if ([oldDic objectForKey:@"icon"]) {
if (oldDic[@"icon"] && oldDic[@"icon"] != [NSNull null]) {
icon = [XSHelper base64StringFromJpgImage:oldDic[@"icon"]];
}
}
NSDictionary *dic = @{
@"bundleId": oldDic[@"bundleId"],
@"name":oldDic[@"name"],
@"containerPath": oldDic[@"containerPath"],
@"version": oldDic[@"version"],
@"shortVersion": oldDic[@"shortVersion"],
@"icon": icon,
};
[resApps addObject:dic];
}
}
}];
return resApps;
}
- (void)stop {
if (_timer) {
dispatch_source_cancel(_timer);
_timer = nil;
}
}
- (void)dealloc {
[self stop];
}
@end