IOS邪术之 杀不死的后台&监听进程

开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启
首页 新闻资讯 行业资讯 IOS邪术之 杀不死的后台&监听进程

非越狱情况下实现:

开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动;

***后台运行:应用进入后台状态,可以***后台运行,不被系统kill;

监听进程:可获IOS设备运行除系统外的App(包括正在运行和后台运行);

配置项目 plist文件

添加:

 

复制

<key>UIBackgroundModes</key>  <array>  <string>voip</string>  </array>
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

 


功能类:ProccessHelper

 

复制

[objc] view plaincopy  #import <Foundation/Foundation.h>  @interface ProccessHelper : NSObject  + (NSArray *)runningProcesses;  @end  [cpp] view plaincopyprint? #import "ProccessHelper.h" //#include<objc/runtime.h> #include <sys/sysctl.h>  #include <stdbool.h> #include <sys/types.h> #include <unistd.h> #include <sys/sysctl.h>  @implementation ProccessHelper  //You can determine if your app is being run under the debugger with the following code from static bool AmIBeingDebugged(void) // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). { int junk; int mib[4]; struct kinfo_proc info; size_t size;  // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result.  info.kp_proc.p_flag = 0;  // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID.  mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid();  // Call sysctl.  size = sizeof(info); junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); assert(junk == 0);  // We're being debugged if the P_TRACED flag is set.  return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); }  //返回所有正在运行的进程的 id,name,占用cpu,运行时间 //使用函数int sysctl(int *, u_int, void *, size_t *, void *, size_t) + (NSArray *)runningProcesses { //指定名字参数,按照顺序***个元素指定本请求定向到内核的哪个子系统,第二个及其后元素依次细化指定该系统的某个部分。 //CTL_KERN,KERN_PROC,KERN_PROC_ALL 正在运行的所有进程 int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL ,0};   size_t miblen = 4; //值-结果参数:函数被调用时,size指向的值指定该缓冲区的大小;函数返回时,该值给出内核存放在该缓冲区中的数据量 //如果这个缓冲不够大,函数就返回ENOMEM错误 size_t size; //返回0,成功;返回-1,失败 int st = sysctl(mib, miblen, NULL, &size, NULL, 0);  struct kinfo_proc * process = NULL; struct kinfo_proc * newprocess = NULL; do { size += size / 10; newprocess = realloc(process, size); if (!newprocess) { if (process) { free(process); process = NULL; } return nil; }  process = newprocess; st = sysctl(mib, miblen, process, &size, NULL, 0); } while (st == -1 && errno == ENOMEM);  if (st == 0) { if (size % sizeof(struct kinfo_proc) == 0) { int nprocess = size / sizeof(struct kinfo_proc); if (nprocess) { NSMutableArray * array = [[NSMutableArray alloc] init]; for (int i = nprocess - 1; i >= 0; i--) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm]; NSString * proc_CPU = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_estcpu]; double t = [[NSDate date] timeIntervalSince1970] - process[i].kp_proc.p_un.__p_starttime.tv_sec; NSString * proc_useTiem = [[NSString alloc] initWithFormat:@"%f",t]; NSString *startTime = [[NSString alloc] initWithFormat:@"%ld", process[i].kp_proc.p_un.__p_starttime.tv_sec]; NSString * status = [[NSString alloc] initWithFormat:@"%d",process[i].kp_proc.p_flag];  NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; [dic setValue:processID forKey:@"ProcessID"]; [dic setValue:processName forKey:@"ProcessName"]; [dic setValue:proc_CPU forKey:@"ProcessCPU"]; [dic setValue:proc_useTiem forKey:@"ProcessUseTime"]; [dic setValue:proc_useTiem forKey:@"ProcessUseTime"]; [dic setValue:startTime forKey:@"startTime"];  // 18432 is the currently running application // 16384 is background [dic setValue:status forKey:@"status"];  [processID release]; [processName release]; [proc_CPU release]; [proc_useTiem release]; [array addObject:dic]; [startTime release]; [status release]; [dic release];  [pool release]; }  free(process); process = NULL; //NSLog(@"array = %@",array);  return array; } } }  return nil; }  @end
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

  • 41.

  • 42.

  • 43.

  • 44.

  • 45.

  • 46.

  • 47.

  • 48.

  • 49.

  • 50.

  • 51.

  • 52.

  • 53.

  • 54.

  • 55.

  • 56.

  • 57.

  • 58.

  • 59.

  • 60.

  • 61.

  • 62.

  • 63.

  • 64.

  • 65.

  • 66.

  • 67.

  • 68.

  • 69.

  • 70.

  • 71.

  • 72.

  • 73.

  • 74.

  • 75.

  • 76.

  • 77.

  • 78.

  • 79.

  • 80.

  • 81.

  • 82.

  • 83.

  • 84.

  • 85.

  • 86.

  • 87.

  • 88.

  • 89.

  • 90.

  • 91.

  • 92.

  • 93.

  • 94.

  • 95.

  • 96.

  • 97.

  • 98.

  • 99.

  • 100.

  • 101.

  • 102.

  • 103.

  • 104.

  • 105.

  • 106.

  • 107.

  • 108.

  • 109.

  • 110.

  • 111.

  • 112.

  • 113.

  • 114.

  • 115.

  • 116.

  • 117.

  • 118.

  • 119.

  • 120.

  • 121.

  • 122.

  • 123.

  • 124.

  • 125.

  • 126.

  • 127.

  • 128.

  • 129.

  • 130.

  • 131.

  • 132.

  • 133.

  • 134.

  • 135.

  • 136.

  • 137.

  • 138.

  • 139.

  • 140.

  • 141.

  • 142.

  • 143.

  • 144.

  • 145.

  • 146.

  • 147.

  • 148.

 

实现代码:

 

复制

[objc] view plaincopy  systemprocessArray = [[NSMutableArray arrayWithObjects: @"kernel_task", @"launchd", @"UserEventAgent", @"wifid", @"syslogd", @"powerd", @"lockdownd", @"mediaserverd", @"mediaremoted", @"mDNSResponder", @"locationd", @"imagent", @"iapd", @"fseventsd", @"fairplayd.N81", @"configd", @"apsd", @"aggregated", @"SpringBoard", @"CommCenterClassi", @"BTServer", @"notifyd", @"MobilePhone", @"ptpd", @"afcd", @"notification_pro", @"notification_pro", @"syslog_relay", @"notification_pro", @"springboardservi", @"atc", @"sandboxd", @"networkd", @"lsd", @"securityd", @"lockbot", @"installd", @"debugserver", @"amfid", @"AppleIDAuthAgent", @"BootLaunch", @"MobileMail", @"BlueTool", nil nil] retain];   [objc] view plaincopy  - (void)applicationDidEnterBackground:(UIApplication *)application { while (1) { sleep(5); [self postMsg]; }  [cpp] view plaincopyprint? [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ NSLog(@"KeepAlive"); }]; }  - (void)applicationWillResignActive:(UIApplication *)application { } - (void)applicationWillEnterForeground:(UIApplication *)application { } - (void)applicationDidBecomeActive:(UIApplication *)application { } - (void)applicationWillTerminate:(UIApplication *)application { }  #pragma mark - #pragma mark - User Method  - (void) postMsg { //上传到服务器 NSURL *url = [self getURL]; NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; NSError *error = nil; NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];  if (error) { NSLog(@"error:%@", [error localizedDescription]); }  NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); }  - (NSURL *) getURL { UIDevice *device = [UIDevice currentDevice];  NSString* uuid = @"TESTUUID"; NSString* manufacturer = @"apple"; NSString* model = [device model]; NSString* mobile = [device systemVersion];  NSString *msg = [NSString stringWithFormat:@"Msg:%@ Time:%@", [self processMsg], [self getTime]]; CFShow(msg);  / 省略部分代码 /  NSString *urlStr = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr];  return url; }  - (BOOL) checkSystemProccess:(NSString *) proName { if ([systemprocessArray containsObject:proName]) { return YES; } return NO; }  - (BOOL) checkFirst:(NSString *) string { NSString *str = [string substringToIndex:1]; NSRange r = [@"ABCDEFGHIJKLMNOPQRSTUVWXWZ" rangeOfString:str];  if (r.length > 0) { return YES; } return NO; }  - (NSString *) processMsg { NSArray *proMsg = [ProccessHelper runningProcesses];  if (proMsg == nil) { return nil; }  NSMutableArray *proState = [NSMutableArray array]; for (NSDictionary *dic in proMsg) {  NSString *proName = [dic objectForKey:@"ProcessName"]; if (![self checkSystemProccess:proName] && [self checkFirst:proName]) { NSString *proID = [dic objectForKey:@"ProcessID"]; NSString *proStartTime = [dic objectForKey:@"startTime"];  if ([[dic objectForKey:@"status"] isEqualToString:@"18432"]) { NSString *msg = [NSString stringWithFormat:@"ProcessName:%@ - ProcessID:%@ - StartTime:%@ Running:YES", proName, proID, proStartTime]; [proState addObject:msg]; } else { NSString *msg = [NSString stringWithFormat:@"ProcessName:%@ - ProcessID:%@ - StartTime:%@ Running:NO", proName, proID, proStartTime]; [proState addObject:msg]; } } }  NSString *msg = [proState componentsJoinedByString:@"______"]; return msg; }  // 获取时间 - (NSString *) getTime { NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterMediumStyle; formatter.locale = [NSLocale currentLocale];  NSDate *date = [NSDate date];  [formatter setTimeStyle:NSDateFormatterMediumStyle]; NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease]; NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; comps = [calendar components:unitFlags fromDate:date]; int year = [comps year]; int month = [comps month]; int day = [comps day]; int hour = [comps hour]; int min = [comps minute]; int sec = [comps second];  NSString *time = [NSString stringWithFormat:@"%d-%d-%d %d:%d:%d", year, month, day, hour, min, sec];  return time; }  @end
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

  • 41.

  • 42.

  • 43.

  • 44.

  • 45.

  • 46.

  • 47.

  • 48.

  • 49.

  • 50.

  • 51.

  • 52.

  • 53.

  • 54.

  • 55.

  • 56.

  • 57.

  • 58.

  • 59.

  • 60.

  • 61.

  • 62.

  • 63.

  • 64.

  • 65.

  • 66.

  • 67.

  • 68.

  • 69.

  • 70.

  • 71.

  • 72.

  • 73.

  • 74.

  • 75.

  • 76.

  • 77.

  • 78.

  • 79.

  • 80.

  • 81.

  • 82.

  • 83.

  • 84.

  • 85.

  • 86.

  • 87.

  • 88.

  • 89.

  • 90.

  • 91.

  • 92.

  • 93.

  • 94.

  • 95.

  • 96.

  • 97.

  • 98.

  • 99.

  • 100.

  • 101.

  • 102.

  • 103.

  • 104.

  • 105.

  • 106.

  • 107.

  • 108.

  • 109.

  • 110.

  • 111.

  • 112.

  • 113.

  • 114.

  • 115.

  • 116.

  • 117.

  • 118.

  • 119.

  • 120.

  • 121.

  • 122.

  • 123.

  • 124.

  • 125.

  • 126.

  • 127.

  • 128.

  • 129.

  • 130.

  • 131.

  • 132.

  • 133.

  • 134.

  • 135.

  • 136.

  • 137.

  • 138.

  • 139.

  • 140.

  • 141.

  • 142.

  • 143.

  • 144.

  • 145.

  • 146.

  • 147.

  • 148.

  • 149.

  • 150.

  • 151.

  • 152.

  • 153.

  • 154.

  • 155.

  • 156.

  • 157.

  • 158.

  • 159.

  • 160.

  • 161.

  • 162.

  • 163.

  • 164.

  • 165.

  • 166.

  • 167.

  • 168.

  • 169.

  • 170.

  • 171.

  • 172.

  • 173.

  • 174.

  • 175.

  • 176.

  • 177.

  • 178.

  • 179.

  • 180.

  • 181.

  • 182.

  • 183.

  • 184.

  • 185.

  • 186.

  • 187.

  • 188.

  • 189.

  • 190.

  • 191.

  • 192.

  • 193.

  • 194.

  • 195.

  • 196.

  • 197.

  • 198.

  • 199.

 

17    2015-11-04 10:15:45    iOS 后台进程 监听