├── OCClassNameObscure.py ├── OC_Function_Obscure.py ├── OC_GetSystemFunction.py ├── ObscureString.py ├── README.md └── file ├── OC_Class.txt ├── OC_Function.txt └── OC_property.txt /OCClassNameObscure.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import os 3 | import re 4 | import random 5 | import chardet 6 | import hashlib 7 | import sys 8 | from datetime import datetime 9 | 10 | temp_list = sys.argv 11 | 12 | print("参数列表:") 13 | print(temp_list) 14 | 15 | run_output_path = '' 16 | run_input_path = '' 17 | if len(temp_list) == 3: 18 | run_input_path = temp_list[1] 19 | run_output_path = temp_list[2] 20 | 21 | start_time = datetime.now() 22 | 23 | if not run_output_path: 24 | temp_list_output = sys.argv[0].split('/') 25 | user_name = '' 26 | for i in range(0, len(temp_list_output)): 27 | value = temp_list_output[i] 28 | if value == 'Users': 29 | user_name = temp_list_output[i + 1] 30 | run_output_path = '/Users/%s/Desktop/ObscureOutput' % user_name 31 | 32 | if not os.path.exists(run_output_path): 33 | os.mkdir(run_output_path) 34 | 35 | obscure_class_dic_path = os.path.join(run_output_path, 'OCClassObscure.txt') 36 | dir_path = sys.path[0] 37 | class_path = os.path.join(dir_path, "file/OC_Class.txt") 38 | file_category_names = [] 39 | system_class_list = [] 40 | with open(class_path, encoding="utf-8", mode="r", errors="ignore") as file_object: 41 | system_class_list = file_object.readlines() 42 | temp_special_import_list = [] 43 | min_length = 8 44 | category_super_class_list = [] 45 | top_dir = '' 46 | '''忽略文件,例如.a的头文件''' 47 | ignore_file_path_list = [] 48 | '''不忽略的特殊文件''' 49 | no_ignore_files = ['GCTCordovaConfig/Assets/config.xml'] 50 | '''需要忽略的类名 51 | LKSDK引用:GCDAsyncSocket、MSWeakTimer、YTKRequest、YTKNetworkAgent、YTKRequest、MJRefreshNormalHeader、SDWebImageManager、JSONKeyMapper、 52 | MJRefreshBackNormalFooter、MQQNetworkInfo 53 | MQQNetworkInfo被引用:(GCTAccount、GCTVODPlayer+GCTStatistics、GCTAVPlayer+Statistic、GCTConnectionViewModel) 54 | 例:LKSDK是原生开发的,但是引入项目中已经是.framework形式,framework在查询类名和替换类名时都会被过滤掉,其中引用的类在外部被搜索到并替换, 55 | 就会导致LKSDK内部引用此类时找不到,所以这种结构本身就不大合理,.framework内部应该是一个完整的封闭系统 56 | 57 | 编码解码的类不能混淆,为了兼容已经保存到本地的数据,有这些:'AFHTTPSessionManager', 'AFURLSessionManager', 'AFSecurityPolicy', 58 | 'AFURLRequestSerialization', 'AFURLResponseSerialization', 'RACArraySequence', 59 | 'RACEmptySequence', 'RACSequence', 'RACTuple', 'RACUnarySequence', 'MPEngineInfo', 60 | 'GCTShuziAccountModel', 'GCTTravelPermissionModel', 'GCTVideoFoodDisplayCountModel', 61 | 'GCTVideoFoodPlayTimeModel' 62 | 63 | ''' 64 | ignore_class_name_list = ['AppDelegate', 'AFHTTPBodyPart', 'MQQHotspotWiFi', 'MQQWiFi', 'GCTEvent', 'Private', 65 | 'JSONModel', 'TarsObject', 'GCTLoginEvent', 'GCTLogoutEvent', 'GCDAsyncSocket', 'MSWeakTimer', 66 | 'YTKRequest', 'YTKNetworkAgent', 'YTKRequest', 'MJRefreshNormalHeader', 'SDWebImageManager', 67 | 'JSONKeyMapper', 'MJRefreshBackNormalFooter', 'Reachability', 'MQQNetworkInfo', 68 | 'LBSAddressInfo', 'LBSLocationManager', 'SDWebImageDownloader', 'MBProgressHUD', 69 | 'AFHTTPSessionManager', 'AFURLSessionManager', 'AFSecurityPolicy', 70 | 'AFURLRequestSerialization', 'AFURLResponseSerialization', 'RACArraySequence', 71 | 'RACEmptySequence', 'RACSequence', 'RACTuple', 'RACUnarySequence', 'MPEngineInfo', 72 | 'GCTShuziAccountModel', 'GCTTravelPermissionModel', 'GCTVideoFoodDisplayCountModel', 73 | 'GCTVideoFoodPlayTimeModel'] 74 | 75 | '''需要忽略的文件名''' 76 | ignore_file_list = ['RUIKit', 'R'] 77 | '''需要过滤的类名前缀 Theme里边用了某些自己的静态库,静态库中引用了某些GCTTheme开头的类''' 78 | ignore_class_pre_list = ['GCTTheme'] 79 | '''去除\n''' 80 | # ignore_dir_list = ['Pods'] 81 | ''' 82 | CNCore的类在其他类的Framework中大量饮用 83 | ChasingGameSDK.framework引用了大量的第三方库,因ChasingGameSDK已经是编译完的状态,导致其他源码引入的第三方库都不能做混淆 84 | ''' 85 | ignore_dir_list = ['.framework', '/Protobuf', '/AFNetworking', '/FMDB', '/Nimbus', '/CNCore', '/mopub-ios-sdk', 86 | '/GCTTinyApp', '/ZFPlayer', '/KTVHTTPCache', '/MBProgressHUD', '/Headers/Private', 87 | '/Headers/Public', '/React-Core', '/React'] 88 | 89 | ''' 90 | 需要混淆的Pods库 91 | ''' 92 | pod_need_list = ['GCTAccount', 'GCTAdvert', 'GCTAPM', 'GCTAudio', 'GCTCinema', 'GCTCitiesAndStations', 'GCTConfig', 93 | 'GCTCordovaConfig', 'GCTCordovaPlugins', 'GCTCoupon', 'GCTDataPersisten', 'GCTEventBus', 'GCTEvents', 94 | 'GCTFaceCheck', 'GCTFeed', 'GCTHome', 'GCTHTTPServer', 'GCTIDAuth', 'GCTIOSUtils', 'GCTLocation', 95 | 'GCTLogger', 'GCTLottie', 'GCTMapKitV2', 'GCTMediaPlayer', 'GCTMine', 'GCTNotificationCenter', 'GCTPay' 96 | 'GCTPromotionCenter', 'GCTPushKit', 'GCTQQ', 'GCTQRCode', 'GCTQuickLogin', 'GCTReact', 'GCTReservation', 97 | 'GCTResourceKit', 'GCTRiskDetective', 'GCTRouter', 'GCTSharedTravel', 'GCTShareKit', 'GCTShuziAccount', 98 | 'GCTShuziProxy', 'GCTStatistic', 'GCTTheme', 'GCTTinyApp', 'GCTToday', 'GCTTravel', 'GCTUIKit', 99 | 'GCTUser', 'GCTVideo', 'GCTWebView', 'GCTWiFiConnect', 'GCTWiFiSDK', 'GCTYouZanDebugKit', 100 | 'GCTYouZanKit', 'GCTZipArchive', 'GDTMobSDK', 'GKPageScrollView', 'NextGCT', 'react_module_bridge'] 101 | 102 | for value in system_class_list: 103 | index = system_class_list.index(value) 104 | if value.endswith('\n'): 105 | value = value.replace('\n', '') 106 | system_class_list[index] = value 107 | 108 | oc_file_types = [".h", ".cpp", ".inl", ".hpp", ".m", ".mm", ".c", ".cc", ".frag", ".vert"] 109 | '''类名列表''' 110 | oc_class_name_list = [] 111 | '''混淆后的映射表''' 112 | oc_class_name_dic = {} 113 | prefix_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 114 | "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 115 | oc_file_type = [".h", ".m", ".mm"] 116 | oc_obscure_file_type = [".pch", ".h", ".m", ".hpp", ".cpp", ".mm", ".cc", ".c", ".inl", ".frag", ".vert", '.storyboard'] 117 | 118 | 119 | def is_ignore_pod(file_path): 120 | pod_dir = '/Pods/' 121 | if pod_dir in file_path: 122 | for v in pod_need_list: 123 | c_pod_dir = pod_dir + v 124 | if c_pod_dir in file_path: 125 | return False 126 | return True 127 | else: 128 | return False 129 | 130 | 131 | def get_random_number_5_10(): 132 | return random.randint(5, 10) 133 | 134 | 135 | def get_random_string(length=8): 136 | seed = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 137 | sa = [] 138 | for i in range(length): 139 | sa.append(random.choice(seed)) 140 | salt = ''.join(sa) 141 | return salt 142 | 143 | 144 | def get_class_name_with_match_string(local_match_string): 145 | global modification_list 146 | match_string = local_match_string.strip() 147 | match_list = [] 148 | match_list = match_string.split(":") 149 | match_string = match_list[0] 150 | match_string = match_string.strip() 151 | match_list = match_string.split(" ") 152 | match_string = match_list[-1] 153 | match_string = match_string.replace(";", "") 154 | match_string = match_string.replace("<", "") 155 | return match_string 156 | 157 | 158 | def is_no_ignore_file(file_path): 159 | for path in no_ignore_files: 160 | if path in file_path: 161 | return True 162 | return False 163 | 164 | 165 | def is_ignore_path(file_path): 166 | for ignore_file_path in ignore_file_path_list: 167 | if ignore_file_path in file_path: 168 | return True 169 | return False 170 | 171 | 172 | def is_ignore_class_name_pre(name): 173 | string = str(name) 174 | for value in ignore_class_pre_list: 175 | if string.startswith(value): 176 | return True 177 | return False 178 | 179 | 180 | def is_ignore_file(s_file): 181 | for value in ignore_file_path_list: 182 | if value in s_file: 183 | return True 184 | return False 185 | 186 | 187 | def is_in_ignore_dir_list(match_string): 188 | for v in ignore_dir_list: 189 | if v in match_string: 190 | return True 191 | return False 192 | 193 | 194 | def is_category_file(file_name): 195 | for name in file_category_names: 196 | file_name = file_name 197 | if file_name in name.split('+'): 198 | return True 199 | if file_name == name: 200 | return True 201 | return False 202 | 203 | 204 | def get_string_md5(match_string): 205 | md5obj = hashlib.md5() 206 | md5obj.update(match_string.encode("utf8")) 207 | _hash = md5obj.hexdigest() 208 | return str(_hash).upper() 209 | 210 | 211 | # parm-mark 执行程序 212 | def obfuscated_code(): 213 | global oc_class_name_list 214 | global oc_class_name_dic 215 | global oc_file_type 216 | global oc_obscure_file_type 217 | global system_class_list 218 | global obscure_class_dic_path 219 | global ignore_file_path_list 220 | global top_dir 221 | top_dir = '' 222 | if run_input_path: 223 | top_dir = run_input_path 224 | else: 225 | top_dir = input("输入项目路径或直接拖入文件夹(例:E:\svn_reposition\ZheJiang):\n") 226 | if top_dir == '': 227 | print("未输入,程序结束") 228 | return 229 | else: 230 | top_dir = top_dir.strip() 231 | if top_dir == '': 232 | print("未输入,程序结束") 233 | return 234 | if not os.path.exists(top_dir): 235 | print("文件夹不存在") 236 | return 237 | if not os.path.isdir(top_dir): 238 | print("文件不存在") 239 | return 240 | print("正在生成替换列表......") 241 | ''' 匹配声明类名 ''' 242 | class_pattern = re.compile( 243 | r'(.)*@interface[\s]+[_a-zA-Z]+[\s]*[:][\s]*[_a-zA-Z]+[\s]*') 244 | for dir_path, sub_paths, files in os.walk(top_dir, False): 245 | if is_in_ignore_dir_list(dir_path): 246 | # print("过滤特殊文件夹,例如Pods、framework") 247 | continue 248 | for s_file in files: 249 | file_name, file_type = os.path.splitext(s_file) 250 | # if '+' in file_name: 251 | # file_category_names.append(file_name) 252 | if file_type == '.a': 253 | ignore_file_path_list.append(dir_path) 254 | for dir_path2, sub_paths2, files2 in os.walk(dir_path, False): 255 | for s_file2 in files2: 256 | file_name2, file_type2 = os.path.splitext(s_file2) 257 | ignore_file_list.append(file_name2) 258 | temp = [] 259 | for dir_path, sub_paths, files in os.walk(top_dir, False): 260 | if is_in_ignore_dir_list(dir_path): 261 | # print("过滤特殊文件夹,例如Pods、framework") 262 | continue 263 | ''' 264 | 只混淆指定的库 265 | ''' 266 | if is_ignore_pod(dir_path): 267 | continue 268 | for s_file in files: 269 | file_name, file_type = os.path.splitext(s_file) 270 | file_path = os.path.join(dir_path, s_file) 271 | if file_type not in oc_file_type: 272 | continue 273 | if file_name in ignore_file_list: 274 | continue 275 | if is_ignore_path(file_path): 276 | # print("遍历类名:跳过静态库对应的头文件") 277 | continue 278 | if is_ignore_file(s_file): 279 | # print("跳过忽略文件:" + file_path) 280 | continue 281 | print("正在扫描文件:" + file_path) 282 | # if is_category_file(file_name): 283 | # print("跳过类别:"+file_name) 284 | # continue 285 | f = open(file_path, 'rb') 286 | data = f.read() 287 | encode_type = chardet.detect(data)["encoding"] 288 | f.close() 289 | if s_file == 'AppDelegate+WiFi.m': 290 | encode_type = 'utf-8' 291 | # 获取结构体、类名列表 292 | with open(file_path, mode='r', encoding=encode_type, errors='ignore') as file_object: 293 | file_content = file_object.readlines() 294 | for line_val in file_content: 295 | if '@interface' not in line_val: 296 | ''' 此行没有@interface直接跳过 ''' 297 | continue 298 | line_val = line_val.replace('\n', '') 299 | m = class_pattern.match(line_val) 300 | if m: 301 | g_list = m.group() 302 | if isinstance(g_list, str): 303 | match_string = str(g_list) 304 | match_string = get_class_name_with_match_string(match_string) 305 | if match_string in oc_class_name_list: 306 | continue 307 | if match_string in system_class_list: 308 | continue 309 | # 加入类名列表 310 | if (match_string not in ignore_class_name_list) and (len(match_string) >= min_length): 311 | print("扫描到Object-C类名:%d\n:" % len(oc_class_name_list)) 312 | if not is_ignore_class_name_pre(match_string): 313 | oc_class_name_list.append(match_string) 314 | 315 | print("===========替换列表生成完成===========") 316 | ''' 过滤#import这种的类名AA ''' 317 | for i in range(len(oc_class_name_list) - 1, -1, -1): 318 | special_value = oc_class_name_list[i] 319 | if special_value in temp_special_import_list: 320 | del oc_class_name_list[i] 321 | oc_class_name_list = sorted(oc_class_name_list, key=lambda i: len(i), reverse=True) 322 | test_index = 0 323 | for class_value in oc_class_name_list: 324 | test_index = test_index + 1 325 | random_string = "CCT" + get_random_string(get_random_number_5_10()) + get_random_string(get_random_number_5_10()) 326 | oc_class_name_dic[class_value] = random_string 327 | temp_w_list = ['{\n'] 328 | for key1, value1 in oc_class_name_dic.items(): 329 | string1 = " \"%s\":\"%s\",\n" % (key1, value1) 330 | temp_w_list.append(string1) 331 | del_temp = temp_w_list[-1] 332 | del_temp = del_temp.replace(',', '') 333 | temp_w_list[-1] = del_temp 334 | temp_w_list.append('}') 335 | with open(obscure_class_dic_path, encoding="utf-8", mode="w+", errors="ignore") as file_object: 336 | file_object.write(''.join(temp_w_list)) 337 | # print('遍历:' + top_dir) 338 | for dir_path, sub_paths, files in os.walk(top_dir, False): 339 | # 查找时过滤,替换时不过滤 340 | # if is_in_ignore_dir_list(dir_path): 341 | # print("过滤特殊文件夹,例如Pods、framework") 342 | # continue 343 | # if '/Pods' in dir_path: 344 | # continue 345 | # if is_ignore_pod(dir_path): 346 | # continue 347 | for s_file in files: 348 | if s_file == 'GCTUIKit.h': 349 | print('1') 350 | file_path = os.path.join(dir_path, s_file) 351 | is_ignore = is_ignore_path(file_path) 352 | if is_ignore: 353 | print("遍历类名:跳过静态库对应的头文件"+file_path) 354 | continue 355 | if ".framework" in str(file_path): 356 | print('路径有.framework'+file_path) 357 | continue 358 | file_name, file_type = os.path.splitext(s_file) 359 | 360 | if file_name in ignore_file_list: 361 | print('文件名在忽略列表'+file_name) 362 | continue 363 | if file_type not in oc_obscure_file_type: 364 | if not is_no_ignore_file(file_path): 365 | # print('不是混淆文件类型' + s_file) 366 | continue 367 | 368 | print("正在处理...:" + file_path) 369 | f = open(file_path, 'rb') 370 | data = f.read() 371 | encode_type = chardet.detect(data)["encoding"] 372 | f.close() 373 | if s_file == 'AppDelegate+WiFi.m': 374 | encode_type = 'utf-8' 375 | obscure_oc_class_name(file_path, encode_type) 376 | for dir_path, sub_paths, files in os.walk(top_dir, False): 377 | # if '/Pods' in dir_path: 378 | # continue 379 | for s_file in files: 380 | file_path = os.path.join(dir_path, s_file) 381 | file_name, file_type = os.path.splitext(s_file) 382 | if file_name in oc_class_name_list: 383 | obscure_file_name = oc_class_name_dic[file_name] 384 | new_path = os.path.join(dir_path, obscure_file_name + file_type) 385 | # os.rename(file_path, new_path) 386 | # pbxproj_path = '' 387 | # for dir_path, sub_paths, files in os.walk(top_dir, False): 388 | # if '/Pods' in dir_path: 389 | # continue 390 | # stop = False 391 | # for s_file in files: 392 | # if s_file == 'project.pbxproj': 393 | # stop = True 394 | # pbxproj_path = os.path.join(dir_path, s_file) 395 | # break 396 | # if stop: 397 | # break 398 | # pbxproj_content = '' 399 | # f = open(file_path, 'rb') 400 | # data = f.read() 401 | # encode_type = chardet.detect(data)["encoding"] 402 | # f.close() 403 | # with open(pbxproj_path, mode='r', encoding=encode_type) as file_object: 404 | # pbxproj_content = file_object.read() 405 | # for key1, value1 in oc_class_name_dic.items(): 406 | # pbxproj_content = pbxproj_content.replace(' %s.' % key1, ' %s.' % value1) 407 | # with open(pbxproj_path, mode='w', encoding=encode_type) as file_object: 408 | # file_object.write(pbxproj_content) 409 | 410 | 411 | def obscure_oc_class_name(file_path, encode_type): 412 | global oc_class_name_dic 413 | global oc_class_name_list 414 | # print(file_path) 415 | w_file_content = '' 416 | with open(file_path, mode='r', encoding=encode_type, errors='ignore') as file_object: 417 | w_file_content = file_object.read() 418 | start_md5 = get_string_md5(w_file_content) 419 | file_name, file_type = os.path.splitext(file_path) 420 | random_class_string = '' 421 | old_v = '' 422 | 423 | def change(match_value): 424 | # global old_v 425 | # global random_class_string 426 | # global w_file_content 427 | # print('change: %s %s' % (old_v, random_class_string)) 428 | line = str(match_value.group()) 429 | tuple_temp = match_value.span() 430 | j = 1 431 | char_pre = w_file_content[tuple_temp[0] - j] 432 | char_suf = w_file_content[tuple_temp[1]] 433 | char_list = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/' 434 | if char_pre in char_list or char_suf in char_list: 435 | return line 436 | temp_c_line = [] 437 | while char_pre != '\n': 438 | char_pre = w_file_content[tuple_temp[0] - j] 439 | temp_c_line.insert(0, char_pre) 440 | j = j + 1 441 | if tuple_temp[0] - j < 0: 442 | char_pre = '\n' 443 | temp_str = ''.join(temp_c_line) 444 | if "#import" in temp_str or "#include" in temp_str or "URLForResource" in temp_str: 445 | return line 446 | return line.replace(old_v, random_class_string) 447 | 448 | for i, val in enumerate(oc_class_name_list): 449 | if val in w_file_content: 450 | random_class_string = oc_class_name_dic[val] 451 | old_v = val 452 | # count_s = 7 453 | # com_string = r"(.|\s){%d}%s(.|\s){%d}" % (count_s, val, count_s) 454 | com_string = r"%s" % old_v 455 | t_list = re.sub(com_string, change, w_file_content) 456 | w_file_content = ''.join(t_list) 457 | 458 | end_md5 = get_string_md5(w_file_content) 459 | if not start_md5 == end_md5: 460 | with open(file_path, mode='w', encoding=encode_type, errors='ignore') as file_object: 461 | file_object.write(w_file_content) 462 | # print("处理完成: " + file_path) 463 | 464 | 465 | def replace(left, right, string, val, random_class_string): 466 | object_string = "%s%s%s" % (left, val, right) 467 | change_string = "%s%s%s" % (left, random_class_string, right) 468 | string = string.replace(object_string, change_string) 469 | return string 470 | 471 | 472 | obfuscated_code() 473 | print("混淆Object-C类名完成") 474 | end_time1 = datetime.now() 475 | print("脚本oc_class_path运行时间:%s" % str((end_time1 - start_time).seconds)) 476 | -------------------------------------------------------------------------------- /OC_Function_Obscure.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import os 3 | import re 4 | import random 5 | import chardet 6 | import hashlib 7 | import sys 8 | from datetime import datetime 9 | 10 | ''' 11 | oc方法混淆脚本使用说明: 总则:脚本是帮你做事,不是求你做事,所以要主动适配脚本 12 | 1、init/set/wr_/is开头的方法不混淆 13 | 2、过滤的路径可在脚本中改ignore_file_path_list对象。【'.framework', '/Protobuf', '/AFNetworking', '/FMDB', '/Headers/Private', 14 | '/Headers/Public']】 15 | 3、没有混淆C方法,只混淆了Object-C的方法 16 | 4、方法名字长度需要大于等于16,过小的方法名不值得做混淆 17 | 18 | ''' 19 | 20 | temp_list = sys.argv 21 | 22 | print("参数列表:") 23 | print(temp_list) 24 | 25 | run_output_path = '' 26 | run_input_path = '' 27 | if len(temp_list) == 3: 28 | run_input_path = temp_list[1] 29 | run_output_path = temp_list[2] 30 | 31 | start_time = datetime.now() 32 | 33 | if not run_output_path: 34 | temp_list_output = sys.argv[0].split('/') 35 | user_name = '' 36 | for i in range(0, len(temp_list_output)): 37 | value = temp_list_output[i] 38 | if value == 'Users': 39 | user_name = temp_list_output[i + 1] 40 | run_output_path = '/Users/%s/Desktop/ObscureOutput' % user_name 41 | 42 | if not os.path.exists(run_output_path): 43 | os.mkdir(run_output_path) 44 | system_func_list = [] 45 | system_class_list = [] 46 | system_property_list = [] 47 | obscure_class_dic_path = os.path.join(run_output_path, 'OCFunctionObscure.txt') 48 | obscure_class_dic_path2 = os.path.join(run_output_path, 'OCFunctionObscure2.txt') 49 | dir_path = sys.path[0] 50 | func_path = os.path.join(dir_path, "file/OC_Function.txt") 51 | property_path = os.path.join(dir_path, "file/OC_property.txt") 52 | class_path = os.path.join(dir_path, "file/OC_Class.txt") 53 | 54 | with open(property_path, encoding="utf-8", mode="r", errors="ignore") as file_object: 55 | system_property_list = file_object.readlines() 56 | for v in system_property_list: 57 | index = system_property_list.index(v) 58 | if v.endswith('\n'): 59 | v = v.replace('\n', '') 60 | system_property_list[index] = v 61 | with open(func_path, encoding="utf-8", mode="r", errors="ignore") as file_object: 62 | system_func_list = file_object.readlines() 63 | for v in system_func_list: 64 | index = system_func_list.index(v) 65 | if v.endswith('\n'): 66 | v = v.replace('\n', '') 67 | system_func_list[index] = v 68 | with open(class_path, encoding="utf-8", mode="r", errors="ignore") as file_object: 69 | system_class_list = file_object.readlines() 70 | for v in system_class_list: 71 | index = system_class_list.index(v) 72 | if v.endswith('\n'): 73 | v = v.replace('\n', '') 74 | system_class_list[index] = v 75 | 76 | ignore_file_list = ['RUIKit', 'R'] 77 | ignore_file_path_list = ['.framework', '/Protobuf', '/AFNetworking', '/FMDB', '/Headers/Private', '/Headers/Public', 78 | '/React-Core', '/React'] 79 | cpp_type_list = [".cpp", ".h", ".hpp"] 80 | cpp_type_with_header = [".h", ".cpp", ".inl", ".hpp", ".m", ".mm", ".c", ".cc", ".frag", ".vert"] 81 | change_file_type_list = [".pch", ".h", ".m", ".hpp", ".cpp", ".mm", ".cc", ".c", ".inl", ".frag", ".vert"] 82 | # key:file_name value:replace_name 83 | file_replace_name_dic = {} 84 | file_replace_name_dic_keys = [] 85 | file_to_much_call_dic = {} 86 | file_to_much_call_keys = [] 87 | prefix_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", 88 | "V", "W", "X", "Y", "Z"] 89 | oc_file_type = [".h", ".m", ".mm"] 90 | oc_obscure_file_type = [".pch", ".h", ".m", ".hpp", ".cpp", ".mm", ".cc", ".c", ".inl", ".frag", ".vert"] 91 | ''' 92 | 需要混淆的Pods库 93 | ''' 94 | pod_need_list = ['GCTAccount', 'GCTAdvert', 'GCTAPM', 'GCTAudio', 'GCTCinema', 'GCTCitiesAndStations', 'GCTConfig', 95 | 'GCTCordovaConfig', 'GCTCordovaPlugins', 'GCTCoupon', 'GCTDataPersisten', 'GCTEventBus', 'GCTEvents', 96 | 'GCTFaceCheck', 'GCTFeed', 'GCTHome', 'GCTHTTPServer', 'GCTIDAuth', 'GCTIOSUtils', 'GCTLocation', 97 | 'GCTLogger', 'GCTLottie', 'GCTMapKitV2', 'GCTMediaPlayer', 'GCTMine', 'GCTNotificationCenter', 'GCTPay' 98 | 'GCTPromotionCenter', 'GCTPushKit', 'GCTQQ', 'GCTQRCode', 'GCTQuickLogin', 'GCTReact', 'GCTReservation', 99 | 'GCTResourceKit', 'GCTRiskDetective', 'GCTRouter', 'GCTSharedTravel', 'GCTShareKit', 'GCTShuziAccount', 100 | 'GCTShuziProxy', 'GCTStatistic', 'GCTTheme', 'GCTTinyApp', 'GCTToday', 'GCTTravel', 'GCTUIKit', 101 | 'GCTUser', 'GCTVideo', 'GCTWebView', 'GCTWiFiConnect', 'GCTWiFiSDK', 'GCTYouZanDebugKit', 102 | 'GCTYouZanKit', 'GCTZipArchive', 'GDTMobSDK', 'GKPageScrollView', 'NextGCT', 'react_module_bridge'] 103 | 104 | ''' 105 | 过滤方法场景 106 | 1、静态库的头文件中有这个方法,其他地方的代码也定义了这个方法,自动过滤静态库后,仍然匹配到其他地方的这个方法,静态库头文件方法调用处 107 | 替换时被替换 108 | 2、 109 | ''' 110 | oc_func_list = [] 111 | ignore_func_list = ['pauseTrackPlay', 'resumeTrackPlay', 'constants', 'afterDelay', 'continue', 'addUIBlock', 112 | 'startObserving', 'stopObserving', 'hasValue', 'constantsToExport', 'sendEventWithName', 113 | 'apiName##ServerAPI', 'recordViewControllerOnReady', 'recordWithViewController', 114 | 'recordViewController', 'extraModulesForBridge', 'formattingCityName', 'cityFromCityName', 115 | 'loginFromViewController', 'currentAccessWirelessNetwork', 'convertWithTravelModel', 116 | 'createNavigationController', 'replaceAnimationView', 'travelModelWithTravelID'] 117 | oc_property_list = [] 118 | oc_func_dic = {} 119 | ''' 120 | block的get方法待处理 121 | ''' 122 | 123 | ignore_sys_func_start_list = ['wr_', 'set', 'XMTrackPlay', 'is', 'init', 'didSelect', 'sizeFor', 'perform', 124 | 'format', 'display', 'draw', 'mj_', 'GCTSwizzling_'] 125 | # ignore_sys_func_start_list = ['numberOfRowsInsection', 'showAnimated', 'pickerColumnView', 'isEnabled', 126 | # 'removeSignalForKeyPath', 127 | # 'addSignalForkeyPath', 'cellIdentifier', 'makeSubViews', 'cellClassName', 128 | # 'stopRefreshAnimation', 129 | # 'accountID', 'continue', 'homeDatas', 'toAddTravel', 130 | # 'currentViewController', 'wifiSloganImageView', 'shareAction', 'initQuickLoginSDKs', 131 | # 'handleOpenURL', 132 | # 'processData', 'afterDelay', 'tabbarselectedcolor', 'wr_', 'set' 133 | # ] 134 | 135 | # ignore_sys_func_start_list = [] 136 | 137 | temp_func_math_dic = {} 138 | 139 | 140 | def is_ignore_pod(file_path): 141 | pod_dir = '/Pods/' 142 | if pod_dir in file_path: 143 | for v in pod_need_list: 144 | c_pod_dir = pod_dir + v 145 | if c_pod_dir in file_path: 146 | return False 147 | return True 148 | else: 149 | return False 150 | 151 | 152 | def get_random_number_5_10(): 153 | return random.randint(5, 10) 154 | 155 | 156 | def get_random_string(length=8): 157 | seed = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 158 | sa = [] 159 | for i in range(length): 160 | sa.append(random.choice(seed)) 161 | salt = ''.join(sa) 162 | return salt 163 | 164 | 165 | def get_class_name_with_match_string(local_match_string): 166 | match_string = local_match_string.strip() 167 | match_list = [] 168 | if ":" in match_string: 169 | match_list = match_string.split(":") 170 | match_string = match_list[0] 171 | match_string = match_string.strip() 172 | match_list = match_string.split(" ") 173 | match_string = match_list[-1] 174 | match_string = match_string.replace(";", "") 175 | match_string = match_string.replace("<", "") 176 | return match_string 177 | 178 | 179 | def is_ignore_path(file_path): 180 | for ignore_file_path in ignore_file_path_list: 181 | if ignore_file_path in file_path: 182 | return True 183 | return False 184 | 185 | 186 | def get_oc_func_string(match_string): 187 | match_string = str(match_string) 188 | match_string = match_string.strip() 189 | match_list = match_string.split(")", 1) 190 | match_func_string = match_list[1] 191 | if ":" in match_string: 192 | match_temp_list = match_func_string.split(":") 193 | match_func_string = match_temp_list[0] 194 | match_func_string = match_func_string.strip() 195 | if " " in match_func_string: 196 | match_func_string = match_func_string.split(" ")[0] 197 | match_func_string = match_func_string.strip() 198 | match_func_string = match_func_string.replace(";", "") 199 | match_func_string = match_func_string.replace("{", "") 200 | match_func_string = match_func_string.strip() 201 | return match_func_string 202 | 203 | 204 | def is_ignore_func_start_function(match_string): 205 | match_string = str(match_string) 206 | for ignore_start in ignore_sys_func_start_list: 207 | if match_string.startswith(ignore_start): 208 | return True 209 | 210 | return False 211 | 212 | 213 | def get_string_md5(match_string): 214 | md5obj = hashlib.md5() 215 | md5obj.update(match_string.encode("utf8")) 216 | _hash = md5obj.hexdigest() 217 | return str(_hash).upper() 218 | 219 | 220 | def get_oc_property_string(match_string): 221 | match_string = str(match_string) 222 | match_string = match_string.strip() 223 | if '^' in match_string: 224 | # print('block') 225 | match_string = match_string.split('^')[-1] 226 | match_string = match_string.split(')')[0] 227 | else: 228 | if "*" in match_string: 229 | match_list = match_string.split("*") 230 | match_string = match_list[-1] 231 | else: 232 | match_list = match_string.split(" ") 233 | match_string = match_list[-1] 234 | match_string = match_string.strip() 235 | if " " in match_string: 236 | match_string = match_string.split(" ")[0] 237 | match_string = match_string.replace(";", "") 238 | match_string = match_string.replace("{", "") 239 | match_string = match_string.strip() 240 | return match_string 241 | 242 | 243 | # parm-mark 执行程序 244 | def obfuscated_code(): 245 | global oc_func_dic 246 | ignore_set_list = [] 247 | top_dir = '' 248 | if run_input_path: 249 | top_dir = run_input_path 250 | else: 251 | top_dir = input("输入项目路径或直接拖入文件夹(例:E:\svn_reposition\ZheJiang):\n") 252 | # top_dir = '/Users/chongliu/Desktop/5' 253 | if top_dir == '': 254 | print("未输入,程序结束") 255 | return 256 | else: 257 | top_dir = top_dir.strip() 258 | if top_dir == '': 259 | print("未输入,程序结束") 260 | return 261 | if not os.path.exists(top_dir): 262 | print("文件夹不存在") 263 | return 264 | if not os.path.isdir(top_dir): 265 | print("文件不存在") 266 | return 267 | print("正在扫描......") 268 | oc_func_pattern = re.compile(r'(\-|\+)[\s]*([(][\s]*(.*)[\s]*[*]?[\s]*[)])[\s]*[A-Za-z_]+([\s]|.)*?({|;)') 269 | oc_property_pattern = re.compile(r'[\s]*@property[\s]*([(].*[)]).*;') 270 | for dir_path, sub_paths, files in os.walk(top_dir, False): 271 | if is_ignore_path(dir_path): 272 | # print("过滤特殊文件夹,例如Pods、framework") 273 | continue 274 | for s_file in files: 275 | file_name, file_type = os.path.splitext(s_file) 276 | # if '+' in file_name: 277 | # file_category_names.append(file_name) 278 | if file_type == '.a': 279 | ignore_file_path_list.append(dir_path) 280 | for dir_path2, sub_paths2, files2 in os.walk(dir_path, False): 281 | for s_file2 in files2: 282 | file_name2, file_type2 = os.path.splitext(s_file2) 283 | ignore_file_list.append(file_name2) 284 | # for value in ignore_file_list: 285 | # print('ignore_file_list:' + value) 286 | for dir_path, sub_paths, files in os.walk(top_dir, False): 287 | ''' 288 | 只混淆指定的库 289 | ''' 290 | if is_ignore_pod(dir_path): 291 | continue 292 | for s_file in files: 293 | file_name, file_type = os.path.splitext(s_file) 294 | file_path = os.path.join(dir_path, s_file) 295 | 296 | if file_type not in oc_file_type: 297 | continue 298 | is_ignore = is_ignore_path(file_path) 299 | if is_ignore: 300 | # print("遍历类名:跳过静态库对应的头文件") 301 | continue 302 | print("正在扫描文件:" + file_path) 303 | f = open(file_path, 'rb') 304 | data = f.read() 305 | encode_type = chardet.detect(data)["encoding"] 306 | f.close() 307 | if s_file == 'AppDelegate+WiFi.m': 308 | encode_type = 'utf-8' 309 | # 获取结构体、类名列表 310 | with open(file_path, mode='r', encoding=encode_type, errors='ignore') as file_object: 311 | file_content = file_object.readlines() 312 | for line_val in file_content: 313 | func_match = oc_func_pattern.match(line_val) 314 | property_match = oc_property_pattern.match(line_val) 315 | if property_match: 316 | property_match_list = property_match.group() 317 | property_match_string = str(property_match_list) 318 | property_string = get_oc_property_string(property_match_string) 319 | if property_string not in oc_property_list and property_string and len(property_string) >= 1: 320 | oc_property_list.append(property_string) 321 | if func_match: 322 | func_list = func_match.group() 323 | func_match_string = str(func_list) 324 | func_string = get_oc_func_string(func_match_string) 325 | j1 = '(' not in func_string 326 | j2 = ')' not in func_string 327 | j3 = '^' not in func_string 328 | j4 = func_string not in system_func_list 329 | j5 = func_string not in system_class_list 330 | j6 = func_string not in system_property_list 331 | j7 = func_string not in oc_func_list 332 | j8 = len(str(func_string)) >= 16 333 | j9 = is_ignore_func_start_function(func_string) 334 | j10 = func_string not in ignore_func_list 335 | j12 = func_string.startswith("set") 336 | if j12: 337 | if len(func_string) < 4: 338 | continue 339 | char_up = func_string[3] 340 | char_up = str(char_up).lower() 341 | end_char = func_string[4:] 342 | ignore_model = char_up + ''.join(end_char) 343 | if ignore_model not in ignore_set_list: 344 | ignore_set_list.append(ignore_model) 345 | 346 | if j1 and j2 and j3 and j4 and j5 and j6 and j7 and j8 and not j9 and j10: 347 | print("扫描到方法名:" + func_string) 348 | oc_func_list.append(func_string) 349 | temp_func_math_dic[func_string] = func_match_string + '分割' + file_path 350 | 351 | print("===========替换列表生成完成===========") 352 | del_func_list2 = [] 353 | ''' 354 | 过滤set、get方法和指定过滤的方法 355 | ''' 356 | temp_v_p_list = [] 357 | temp_v_p_list.extend(ignore_set_list) 358 | for v_p in oc_property_list: 359 | temp_v_p_list.append(v_p) 360 | first_char = v_p[0] 361 | end_char_list = v_p[1:] 362 | first_char = str(first_char).upper() 363 | temp_v_p_list.append("set%s%s" % (first_char, ''.join(end_char_list))) 364 | 365 | for i in range(len(oc_func_list) - 1, -1, -1): 366 | s_val = oc_func_list[i] 367 | s_val = str(s_val) 368 | if s_val in temp_v_p_list: 369 | del_func_list2.append(s_val) 370 | # print(del_func_list2) 371 | for del_func_value in del_func_list2: 372 | index_set = oc_func_list.index(del_func_value) 373 | del oc_func_list[index_set] 374 | test_index2 = 0 375 | for oc_func_value in oc_func_list: 376 | test_index2 = test_index2 + 1 377 | random_string2 = get_random_string(get_random_number_5_10()) + get_random_string( 378 | get_random_number_5_10()) + get_random_string(get_random_number_5_10()) 379 | if oc_func_value.startswith('initWith'): 380 | random_string2 = 'initWith' + random_string2 381 | elif oc_func_value.startswith('init'): 382 | random_string2 = 'init' + random_string2 383 | oc_func_dic[oc_func_value] = random_string2 384 | 385 | temp_keys = sorted(oc_func_dic.keys()) 386 | temp_dic = {} 387 | for value_key in temp_keys: 388 | temp_dic[value_key] = oc_func_dic[value_key] 389 | oc_func_dic = temp_dic 390 | temp_w_list = ["{\n"] 391 | for key1, value1 in oc_func_dic.items(): 392 | string1 = "\t\"%s\": \"%s\",\n" % (key1, value1) 393 | temp_w_list.append(string1) 394 | temp_w_list[-1] = str(temp_w_list[-1]).replace(",", "") 395 | temp_w_list.append("}") 396 | with open(obscure_class_dic_path, encoding="utf-8", mode="w", errors="ignore") as file_object: 397 | file_object.write(''.join(temp_w_list)) 398 | temp_w_list2 = ["{\n"] 399 | for key2, value2 in temp_func_math_dic.items(): 400 | string2 = "\t\"%s\": \"%s\",\n" % (key2, value2) 401 | temp_w_list2.append(string2) 402 | temp_w_list2[-1] = str(temp_w_list2[-1]).replace(",", "") 403 | temp_w_list2.append("}") 404 | with open(obscure_class_dic_path2, encoding="utf-8", mode="w", errors="ignore") as file_object: 405 | file_object.write(''.join(temp_w_list2)) 406 | for dir_path, sub_paths, files in os.walk(top_dir, False): 407 | for s_file in files: 408 | if s_file == "sqlite3.c": 409 | continue 410 | file_path = os.path.join(dir_path, s_file) 411 | is_ignore = is_ignore_path(file_path) 412 | if is_ignore: 413 | # print("遍历类名:跳过静态库对应的头文件") 414 | continue 415 | if ".framework" in str(file_path): 416 | continue 417 | file_name, file_type = os.path.splitext(s_file) 418 | if file_name in ignore_file_list: 419 | continue 420 | if file_type not in oc_obscure_file_type: 421 | continue 422 | print("正在处理...:" + file_path) 423 | f = open(file_path, 'rb') 424 | data = f.read() 425 | encode_type = chardet.detect(data)["encoding"] 426 | f.close() 427 | if s_file == 'AppDelegate+WiFi.m': 428 | encode_type = 'utf-8' 429 | obscure_oc_func_name(file_path, encode_type) 430 | 431 | 432 | def obscure_oc_func_name(file_path, encode_type): 433 | w_file_content = '' 434 | with open(file_path, mode='r', encoding=encode_type, errors='ignore') as file_object: 435 | w_file_content = file_object.read() 436 | start_md5 = get_string_md5(w_file_content) 437 | random_class_string = '' 438 | old_v = '' 439 | is_change = False 440 | is_change = False 441 | 442 | def change(match_value): 443 | global is_change 444 | is_change = False 445 | line = str(match_value.group()) 446 | tuple_temp = match_value.span() 447 | j = 1 448 | char_pre = w_file_content[tuple_temp[0] - j] 449 | char_suf = w_file_content[tuple_temp[1]] 450 | char_list = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/_' 451 | if char_pre in char_list or char_suf in char_list: 452 | return line 453 | temp_c_line = [] 454 | while char_pre != '\n': 455 | char_pre = w_file_content[tuple_temp[0] - j] 456 | temp_c_line.insert(0, char_pre) 457 | j = j + 1 458 | if tuple_temp[0] - j < 0: 459 | char_pre = '\n' 460 | temp_str = ''.join(temp_c_line) 461 | if "#import" in temp_str: 462 | return line 463 | # print('change: %s %s' % (old_v, random_class_string)) 464 | return line.replace(old_v, random_class_string) 465 | 466 | for i, val in enumerate(oc_func_list): 467 | if val in w_file_content: 468 | random_class_string = oc_func_dic[val] 469 | old_v = val 470 | com_string = r"%s" % old_v 471 | t_list = re.sub(com_string, change, w_file_content) 472 | w_file_content = ''.join(t_list) 473 | end_md5 = get_string_md5(w_file_content) 474 | if not start_md5 == end_md5: 475 | with open(file_path, mode='w', encoding=encode_type, errors='ignore') as file_object: 476 | file_object.write(w_file_content) 477 | # print("处理完成: " + file_path) 478 | 479 | 480 | obfuscated_code() 481 | print("混淆Object-C方法名完成") 482 | end_time1 = datetime.now() 483 | print("脚本oc_class_path运行时间:%s" % str((end_time1 - start_time).seconds)) 484 | -------------------------------------------------------------------------------- /OC_GetSystemFunction.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import os 3 | import re 4 | import random 5 | import operator as op 6 | import chardet 7 | import shutil 8 | import sys 9 | 10 | test_top_dir = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks" 11 | temp_list = sys.argv[0].split('/') 12 | user_name = '' 13 | 14 | for i in range(0, len(temp_list)): 15 | value = temp_list[i] 16 | if value == 'Users': 17 | user_name = temp_list[i+1] 18 | property_path = "/Users/%s/Desktop/OC_property.txt" % user_name 19 | func_path = "/Users/%s/Desktop/OC_Function.txt" % user_name 20 | class_path = "/Users/%s/Desktop/OC_Class.txt" % user_name 21 | ignore_type_list = [".a"] 22 | ignore_file_list = [] 23 | ignore_class_name_list = ["QuadCommand", "UserWrapper", "PaymentInterface", "UserInterface", "AVAudioSession", "CCDirectorCaller", "ProgressTimer", "FileUtils", "ScriptEngineManager", "LuaEngine", "GLViewImpl", "Application", "EventCustom", "EventListenerCustom", "Scheduler", "EventDispatcher", "Director"] 24 | 25 | ignore_file_path_list = ["SDKConfig", "CCScheduler", "CCRef", "CCFileUtils", "CCDirector", "cocos/network", "TalkingDataBF", "PlatformInvoke", "cocos2d/external/curl", 26 | "plugins/bfTalkingdata", 27 | "mySdk/XianliaoSDK_iOS", 28 | "cocos2d/external/tiff", 29 | "cocos2d/external/lua/luajit", 30 | "bianfeng/External/live2d/include", 31 | "cocos2d/external/png", 32 | "cocos2d/external/webp", 33 | "cocos2d/external/websockets", 34 | "cocos2d/external/freetype2", 35 | "cocos2d/external/chipmunk", 36 | "cocos2d/external/spidermonkey", 37 | "cocos2d/external/jpeg", 38 | "bianfeng/ProtocolManager", 39 | "PluginTK", 40 | "ios/InterfaceTk.h", 41 | "cocos2d/cocos/platform/ios", 42 | "cocos2d/cocos/renderer"] 43 | # file_type_list = [".h", ".m", ".hpp", ".cpp", ".mm"] 44 | # .frag|.vert 45 | cpp_type_list = [".cpp", ".h", ".hpp"] 46 | cpp_type_with_header = [".h", ".cpp", ".inl", ".hpp", ".m", ".mm", ".c", ".cc", ".frag", ".vert"] 47 | change_file_type_list = [".pch", ".h", ".m", ".hpp", ".cpp", ".mm", ".cc", ".c", ".inl", ".frag", ".vert"] 48 | # key:file_name value:replace_name 49 | file_replace_name_dic = {} 50 | file_replace_name_dic_keys = [] 51 | file_to_much_call_dic = {} 52 | file_to_much_call_keys = [] 53 | # 类名列表 54 | cpp_class_name_list = [] 55 | cpp_class_name_dic = {} 56 | oc_header_dic_list = [] 57 | oc_func_dic = {} 58 | oc_class_dic = {} 59 | oc_property_dic = {} 60 | 61 | modification_list = ["CC_GUI_DLL", "CC_STUDIO_DLL", "CC_DLL", "CC_LUA_DLL", "CC_EX_DLL", "CC_DEPRECATED_ATTRIBUTE"] 62 | 63 | prefix_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", 64 | "V", "W", "X", "Y", "Z"] 65 | stuck_list = [] 66 | 67 | oc_system_header_type = [".h"] 68 | oc_obscure_file_type = [".pch", ".h", ".m", ".hpp", ".cpp", ".mm", ".cc", ".c", ".inl", ".frag", ".vert"] 69 | 70 | oc_func_list = [] 71 | oc_func_dic = {} 72 | oc_property_list = [] 73 | 74 | 75 | ignore_sys_func_start_list = ["preferred", "Request", "Delegate", "Text", "ForKey", "replaceObject", "interst", "finish", "dismiss", "remove", "appendString", "removeLastObject", "closeKeyboard", "performSelector", 76 | "removeObserver", "isBackgroundMusicPlaying", "rewind", "resume", "pause", "stop", "play", 77 | "preload", "disableScreenSaver", "supported", "should", "insertObject", "call", 78 | "isSupportFunction", "dictionary", "array", "webView", "layout", "resume", "touches", 79 | "showAchievements", "audioSession", "caretRectForPosition", 80 | "positionFromPosition", "resignFirstResponder", "becomeFirstResponder", "cdAudio", 81 | "audioPlayer", "imagePicker", "openAL", "track", "mark", "text", "auto", "alert", 82 | "load", "table", "prefer", "can", "dealloc", "application", "Did", "did", "view", "init"] 83 | 84 | 85 | def get_random_number_5_10(): 86 | return random.randint(5, 10) 87 | 88 | 89 | def get_random_string(length=8): 90 | seed = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 91 | sa = [] 92 | for i in range(length): 93 | sa.append(random.choice(seed)) 94 | salt = ''.join(sa) 95 | return salt 96 | 97 | 98 | def get_class_name_with_match_string(local_match_string): 99 | global modification_list 100 | match_string = local_match_string.strip() 101 | for m_value in modification_list: 102 | if m_value in match_string: 103 | match_string.replace(m_value,"") 104 | match_list = [] 105 | if ":" in match_string: 106 | match_list = match_string.split(":") 107 | match_string = match_list[0] 108 | match_string = match_string.strip() 109 | match_list = match_string.split(" ") 110 | match_string = match_list[-1] 111 | match_string = match_string.replace(";", "") 112 | match_string = match_string.replace("<", "") 113 | return match_string 114 | 115 | 116 | def is_ignore_path(file_path): 117 | for ignore_file_path in ignore_file_path_list: 118 | if ignore_file_path in file_path: 119 | return True 120 | return False 121 | 122 | 123 | def get_oc_func_string(match_string): 124 | match_string = str(match_string) 125 | 126 | match_string = match_string.strip() 127 | match_list = match_string.split(")", 1) 128 | match_func_string = match_list[-1] 129 | match_func_string = match_func_string.strip() 130 | if " " in match_func_string: 131 | match_func_string = match_func_string.split(" ")[0] 132 | if ":" in match_string: 133 | match_temp_list = match_func_string.split(":") 134 | match_func_string = match_temp_list[0] 135 | match_func_string = match_func_string.strip() 136 | match_func_string = match_func_string.replace(";", "") 137 | match_func_string = match_func_string.replace("{", "") 138 | match_func_string = match_func_string.strip() 139 | return match_func_string 140 | 141 | 142 | def is_ignore_file(s_file): 143 | for value in ignore_class_name_list: 144 | if value in s_file: 145 | return True 146 | return False 147 | 148 | 149 | def space_string(count): 150 | s_string = "" 151 | for index in range(count): 152 | s_string = s_string + " " 153 | return s_string 154 | 155 | 156 | def replace_space(input_string): 157 | match_string = str(input_string) 158 | match_string = match_string.replace("\t", " ") 159 | for index in range(30, 0, -1): 160 | s_string = space_string(index) 161 | if s_string in match_string: 162 | match_string = match_string.replace(s_string, " ") 163 | return match_string 164 | 165 | 166 | def is_ignore_sys_function(match_string): 167 | match_string = str(match_string) 168 | for ignore_start in ignore_sys_func_start_list: 169 | if ignore_start in match_string: 170 | return True 171 | 172 | return False 173 | 174 | 175 | def get_oc_property_string(match_string): 176 | 177 | match_string = str(match_string) 178 | match_string = match_string.strip() 179 | if "*" in match_string: 180 | match_list = match_string.split("*") 181 | match_string = match_list[-1] 182 | if " " in match_string: 183 | match_string = match_string.strip() 184 | match_string = match_string.split(" ")[0] 185 | else: 186 | match_string = match_string.split(")", 1)[-1] 187 | match_string = match_string.strip() 188 | if " " in match_string or "\t" in match_string: 189 | match_string = replace_space(match_string) 190 | match_list = match_string.split(" ") 191 | match_string = match_list[1] 192 | elif ">" in match_string: 193 | match_string = match_string.split(">")[-1] 194 | else: 195 | match_list = match_string.split(" ") 196 | match_string = match_list[1] 197 | 198 | match_string = match_string.strip() 199 | match_string = match_string.replace(";", "") 200 | match_string = match_string.replace("{", "") 201 | match_string = match_string.strip() 202 | return match_string 203 | 204 | 205 | # parm-mark 执行程序 206 | def obfuscated_code(): 207 | global stuck_list 208 | global cpp_type_list 209 | global file_replace_name_dic 210 | global file_replace_name_dic_keys 211 | global ignore_type_list 212 | global file_to_much_call_keys 213 | global file_to_much_call_dic 214 | global cpp_class_name_list 215 | global cpp_class_name_dic 216 | global oc_system_header_type 217 | global oc_obscure_file_type 218 | global oc_func_list 219 | global oc_property_list 220 | global oc_header_dic_list 221 | global oc_func_dic 222 | global oc_class_dic 223 | global oc_property_dic 224 | # top_dir = input("输入项目路径或直接拖入文件夹(例:E:\svn_reposition\ZheJiang):\n") 225 | top_dir = test_top_dir 226 | 227 | if top_dir == '': 228 | print("未输入,程序结束") 229 | return 230 | if top_dir == '': 231 | print("未输入,程序结束") 232 | return 233 | if not os.path.exists(top_dir): 234 | print("文件夹不存在") 235 | return 236 | if not os.path.isdir(top_dir): 237 | print("文件不存在") 238 | return 239 | print("正在生成替换列表......") 240 | class_pattern = re.compile( 241 | r'(.)*@interface+[\s]*[_a-zA-Z]+([\s]+|;|<|:)') 242 | oc_func_pattern = re.compile(r'[\s]*(-)[\s]*([(][\s]*(.*)[\s]*[*]?[\s]*[)])[\s]*[A-Za-z_]+(;|[\s]|{|:)') 243 | oc_property_pattern = re.compile(r'[\s]*@property[\s]*([(].*[)]).*;') 244 | for dir_path, sub_paths, files in os.walk(top_dir, False): 245 | for s_file in files: 246 | file_name, file_type = os.path.splitext(s_file) 247 | file_path = os.path.join(dir_path, s_file) 248 | print("正在执行:" + file_path) 249 | if file_type not in oc_system_header_type: 250 | print("获取OC系统方法跳过文件:" + file_path) 251 | continue 252 | f = open(file_path, 'rb') 253 | data = f.read() 254 | encode_type = chardet.detect(data)["encoding"] 255 | f.close() 256 | # 获取结构体、类名列表 257 | with open(file_path, mode='r', encoding=encode_type, errors='ignore') as file_object: 258 | file_content = file_object.readlines() 259 | for line_val in file_content: 260 | 261 | m3 = oc_property_pattern.match(line_val) 262 | if m3: 263 | m3_list = m3.group() 264 | m3_match_string = str(m3_list) 265 | property_string = get_oc_property_string(m3_match_string) 266 | if not property_string == "": 267 | 268 | if dir_path not in oc_property_dic.keys(): 269 | property_list = [{property_string: file_path}] 270 | oc_property_dic[dir_path] = property_list 271 | else: 272 | property_list = oc_property_dic[dir_path] 273 | if {property_string: file_path} in property_list: 274 | property_list.append({property_string: file_path}) 275 | oc_property_dic[dir_path] = property_list 276 | if property_string not in oc_property_list: 277 | oc_property_list.append(property_string) 278 | else: 279 | print("OC_跳过return空字符串") 280 | 281 | m2 = oc_func_pattern.match(line_val) 282 | if m2: 283 | m2_list = m2.group() 284 | m2_match_string = str(m2_list) 285 | func_string = get_oc_func_string(m2_match_string) 286 | if func_string not in oc_func_list: 287 | oc_func_list.append(func_string) 288 | 289 | if dir_path not in oc_func_dic.keys(): 290 | s_func_list = [{func_string:file_path}] 291 | oc_func_dic[dir_path] = s_func_list 292 | else: 293 | s_func_list = oc_func_dic[dir_path] 294 | if func_string not in s_func_list: 295 | s_func_list.append({func_string:file_path}) 296 | oc_func_dic[dir_path] = s_func_list 297 | 298 | m = class_pattern.match(line_val) 299 | if m: 300 | print(m) 301 | g_list = m.group() 302 | if isinstance(g_list, str): 303 | match_string = str(g_list) 304 | print(match_string) 305 | # class PluginUtilsIOS 306 | print("匹配字符串:%s" % match_string) 307 | print(file_path) 308 | print(line_val) 309 | match_string = get_class_name_with_match_string(match_string) 310 | 311 | print("Object-C类名%d\n:" % len(cpp_class_name_list)) 312 | print("Object-C-SKS:" + match_string) 313 | print("==========================\n") 314 | if dir_path not in oc_class_dic.keys(): 315 | s_class_list = [{match_string: file_path}] 316 | oc_class_dic[dir_path] = s_class_list 317 | else: 318 | s_class_list = oc_class_dic[dir_path] 319 | if {match_string: file_path} not in s_class_list: 320 | s_class_list.append({match_string: file_path}) 321 | oc_class_dic[dir_path] = s_class_list 322 | if match_string in cpp_class_name_list: 323 | continue 324 | # 加入类名列表 325 | cpp_class_name_list.append(match_string) 326 | 327 | # file_replace_name_dic_keys = file_replace_name_dic.keys() 328 | print("===========替换列表生成完成===========") 329 | print("===========替换列表生成完成===========") 330 | print("===========替换列表生成完成===========") 331 | print("===========替换列表生成完成===========") 332 | print("===========替换列表生成完成===========") 333 | p_write_string = '' 334 | f_write_string = '' 335 | c_write_string = '' 336 | index = 0 337 | index2 = 0 338 | index3 = 0 339 | for value in oc_property_list: 340 | p_write_string = p_write_string + "\n" + value 341 | print("property%d: " % index + value) 342 | index = index + 1 343 | for value in oc_func_list: 344 | f_write_string = f_write_string + "\n" + value 345 | print("oc_func%d: " % index2 + value) 346 | index2 = index2 + 1 347 | for value in cpp_class_name_list: 348 | c_write_string = c_write_string + "\n" + value 349 | print("oc_class%d: " % index3 + value) 350 | index3 = index3 + 1 351 | 352 | for key, values in oc_property_dic.items(): 353 | for value in values: 354 | for s_key, s_value in value.items(): 355 | print("oc_property:" + s_value + " " + s_key) 356 | for key, values in oc_func_dic.items(): 357 | for value in values: 358 | for s_key, s_value in value.items(): 359 | print("oc_func:" + s_value + " " + s_key) 360 | for key, values in oc_class_dic.items(): 361 | for value in values: 362 | for s_key, s_value in value.items(): 363 | print("oc_class:" + s_value + " " + s_key) 364 | 365 | with open(property_path, encoding="utf-8", mode="w+", errors="ignore") as file_object: 366 | file_object.write(p_write_string) 367 | with open(func_path, encoding="utf-8", mode="w+", errors="ignore") as file_object: 368 | file_object.write(f_write_string) 369 | with open(class_path, encoding="utf-8", mode="w+", errors="ignore") as file_object: 370 | file_object.write(c_write_string) 371 | 372 | 373 | obfuscated_code() 374 | print("遍历OC系统Framework完成") 375 | -------------------------------------------------------------------------------- /ObscureString.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import os 3 | import re 4 | import random 5 | import chardet 6 | import sys 7 | from datetime import datetime 8 | 9 | temp_list = sys.argv 10 | 11 | print("参数列表:") 12 | print(temp_list) 13 | 14 | run_output_path = '' 15 | run_input_path = '' 16 | if len(temp_list) == 3: 17 | run_input_path = temp_list[1] 18 | run_output_path = temp_list[2] 19 | 20 | start_time = datetime.now() 21 | 22 | if not run_output_path: 23 | temp_list_output = sys.argv[0].split('/') 24 | user_name = '' 25 | for i in range(0, len(temp_list_output)): 26 | value = temp_list_output[i] 27 | if value == 'Users': 28 | user_name = temp_list_output[i + 1] 29 | run_output_path = '/Users/%s/Desktop/ObscureOutput' % user_name 30 | 31 | if not os.path.exists(run_output_path): 32 | os.mkdir(run_output_path) 33 | 34 | ''' 35 | 使用说明: 36 | 1、混淆字符串的文件类型范围为:['.m', '.cpp'] 37 | 2、只会搜索OC方法和C函数内的字符串,OC字符串@"xxx", C字符串"xxx" 38 | 3、宏定义的字符串请写原字符串至方法内,否则不会混淆 39 | 4、定义在方法或函数外的字符串,如需混淆,也需要手动移动字符串到方法内,在执行混淆脚本 40 | 5、多次执行不会重复混淆 41 | 6、静态变量字符串不支持混淆,当前行开头是static|constexpr|const时跳过混淆 42 | 7、NSString方法外部字符串不会混淆,判断逻辑为NSString是当前行开头且不在方法内 43 | 44 | ''' 45 | 46 | def get_random_number_0_10(): 47 | return random.randint(0, 10) 48 | 49 | 50 | def get_random_string(length=8): 51 | seed = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 52 | sa = [] 53 | for j in range(length): 54 | sa.append(random.choice(seed)) 55 | salt = ''.join(sa) 56 | return salt 57 | 58 | 59 | def get_random_object_name(): 60 | return get_random_string(20 + get_random_number_0_10()) 61 | 62 | 63 | keys = [0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xEA, 0xEB, 0xEC, 0xED, 0xED] 64 | file_type_list = ['.m', '.cpp'] 65 | out_put_path = os.path.join(run_output_path, 'ObscureString.txt') 66 | out_put_error_path = os.path.join(run_output_path, 'ObscureStringError.txt') 67 | out_put_no_change_str_path = os.path.join(run_output_path, 'ObscureStringNoChangeStr.txt') 68 | out_put_static_str_path = os.path.join(run_output_path, 'ObscureStringStatic.txt') 69 | ignore_file_name_list = ['RCTSRWebSocket.m', 'MPStreamAdPlacer.m', 'mtaf_appender.cpp', 'json.cpp', 70 | 'EXLocationRequester.m', 'RCTEventDispatcher.m', 'R.h', 'R.m'] 71 | test_path = '/Users/chongliu/Desktop/ObscureStringTest.txt' 72 | 73 | 74 | def get_random_number_0_10(): 75 | return random.randint(0, 10) 76 | 77 | 78 | def get_random_string(length=8): 79 | seed = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 80 | sa = [] 81 | for j in range(length): 82 | sa.append(random.choice(seed)) 83 | salt = ''.join(sa) 84 | return salt 85 | 86 | 87 | def get_random_object_name(): 88 | return get_random_string(20 + get_random_number_0_10()) 89 | 90 | 91 | def first_line(real_str, func_name): 92 | return "\n///%s\nstatic inline __attribute__((always_inline)) NSString *%s() {\n" % (real_str, func_name) 93 | 94 | 95 | def first_line_c_str(real_str, func_name): 96 | return "\n///%s\nstatic inline __attribute__((always_inline)) char *%s() {\n" % (real_str, func_name) 97 | 98 | 99 | def second_line(key_name, c_key): 100 | return "\tstatic char %s = (char) %s;\n" % (key_name, c_key) 101 | 102 | 103 | def third_line(encrypted_str_name, c_length, encrypt_content): 104 | return "\tstatic char %s[%d] = %s;\n" % (encrypted_str_name, c_length, encrypt_content) 105 | 106 | 107 | def fourth_line(decrypted_str_name, c_length): 108 | return "\tint i; char %s[%d];\n" % (decrypted_str_name, c_length + 1) 109 | 110 | 111 | def fourth_line_c_str(decrypted_str_name, c_length): 112 | return "\tint i; static char %s[%d];\n" % (decrypted_str_name, c_length + 1) 113 | 114 | 115 | def fifth_line(c_length, decrypted_str_name, encrypted_str_name, key_name): 116 | return "\tfor(i=0; i<%d; i++) {\n\t\t%s[i] = %s[i] ^ (char) ((%s + i) %% 256);\n\t}\n\t%s [%d] = \'\\0\';\n" % ( 117 | c_length, decrypted_str_name, encrypted_str_name, key_name, decrypted_str_name, c_length) 118 | 119 | 120 | def fifth_line_c_string(c_length, decrypted_str_name, encrypted_str_name, key_name, first_content): 121 | # c_number = (first_content + 1) % 128 122 | return "\tfor(i=0; i<%d; i++) {\n\ 123 | %s[i] = %s[i] ^ (char) ((%s + i) %% 256);\n\t}\n\t%s [%d] = \'\\0\';\n" % ( 124 | c_length, decrypted_str_name, encrypted_str_name, key_name, decrypted_str_name, c_length) 125 | # return "\tfor(i=0; i<%d; i++) {\n\t\t%s[i] = %s[i] ^ (char) ((%s + i) %% 256);\n\t}\n" % ( 126 | # c_length, decrypted_str_name, encrypted_str_name, key_name) 127 | 128 | 129 | def sixth_line(decrypted_str_name): 130 | return "\treturn [NSString stringWithCString:%s encoding:NSUTF8StringEncoding];\n}\n" % decrypted_str_name 131 | 132 | 133 | def sixth_line_c_str(decrypted_str_name): 134 | return "\treturn (char *) %s;\n}\n" % decrypted_str_name 135 | 136 | 137 | def obscure_func_str(real_str, func_name, key_name, key, encrypted_str_name, length, encrypted_content, 138 | decrypted_str_name): 139 | return first_line(real_str, func_name) + second_line(key_name, hex(key)) + third_line(encrypted_str_name, length, 140 | ''.join( 141 | encrypted_content)) + fourth_line( 142 | decrypted_str_name, length) + fifth_line(length, decrypted_str_name, encrypted_str_name, 143 | key_name) + sixth_line(decrypted_str_name) 144 | 145 | 146 | def obscure_func_c_str(real_str, func_name, key_name, key, encrypted_str_name, length, encrypted_content, 147 | decrypted_str_name, 148 | content): 149 | return first_line_c_str(real_str, func_name) + second_line(key_name, hex(key)) + third_line(encrypted_str_name, 150 | length, 151 | ''.join( 152 | encrypted_content)) \ 153 | + fourth_line_c_str( 154 | decrypted_str_name, length) + fifth_line_c_string(length, decrypted_str_name, encrypted_str_name, 155 | key_name, content[0]) + sixth_line_c_str( 156 | decrypted_str_name) 157 | 158 | 159 | def obscure_with_str(object_str, is_c_str=0): 160 | encrypted = ['{'] 161 | d_length = len(object_str) 162 | d_key = keys[get_random_number_0_10()] 163 | d_content = [] 164 | for i in range(0, d_length): 165 | c = ord(object_str[i]) 166 | r = ((d_key + i) % 256) ^ c 167 | d_content.append(r) 168 | if i == d_length - 1: 169 | encrypted.append("(char) %s" % hex(r)) 170 | encrypted.append("}") 171 | else: 172 | encrypted.append("(char) %s," % hex(r)) 173 | d_func_name = get_random_object_name() 174 | d_key_name = get_random_object_name() 175 | d_encrypted_str_name = get_random_object_name() 176 | d_decrypted_str_name = get_random_object_name() 177 | w_string = '' 178 | if is_c_str == 0: 179 | w_string = obscure_func_str(real_str=object_str, 180 | func_name=d_func_name, 181 | key_name=d_key_name, 182 | key=d_key, 183 | encrypted_str_name=d_encrypted_str_name, 184 | length=d_length, 185 | encrypted_content=encrypted, 186 | decrypted_str_name=d_decrypted_str_name) 187 | else: 188 | w_string = obscure_func_c_str(real_str=object_str, 189 | func_name=d_func_name, 190 | key_name=d_key_name, 191 | key=d_key, 192 | encrypted_str_name=d_encrypted_str_name, 193 | length=d_length, 194 | encrypted_content=encrypted, 195 | decrypted_str_name=d_decrypted_str_name, 196 | content=d_content) 197 | 198 | return w_string, '%s()' % d_func_name 199 | 200 | 201 | # print(obscure_with_str("PUSBZ-L6IA3-6O63J-YGV44-PHOWS-2XFA4", False)[0]) 202 | # print(obscure_with_str("430B62115DB5E9726F193792D78E0BD1", str_type=1)) 203 | # print(obscure_with_str("0123456789qwertyuiopasdfghjklzxcvbnm", str_type=1)) 204 | 205 | 206 | def obscure_start(): 207 | top_dir = '' 208 | if run_input_path: 209 | top_dir = run_input_path 210 | else: 211 | top_dir = input("输入项目路径或直接拖入文件夹(例:E:\svn_reposition\ZheJiang):\n") 212 | # top_dir = '/Users/chongliu/Desktop/5' 213 | top_dir = top_dir.strip() 214 | if top_dir == '': 215 | print("未输入,程序结束") 216 | return 217 | if top_dir == '': 218 | print("未输入,程序结束") 219 | return 220 | if not os.path.exists(top_dir): 221 | print("文件夹不存在") 222 | return 223 | if not os.path.isdir(top_dir): 224 | print("文件不存在") 225 | return 226 | 227 | obscure_out_put_list = [] 228 | obscure_out_put_error_list = [] 229 | out_put_no_change_str_list = ['C方法替换时匹配到OC字符串:\n'] 230 | out_put_static_str_list = ['静态字符串:\n'] 231 | current_content = '' 232 | func_list = [] 233 | need_write_list = [] 234 | need_change_dic = {} 235 | changed_oc_str = [] 236 | changed_c_str = [] 237 | current_file_path = '' 238 | test_func_list = [] 239 | test_func_ex_list = [] 240 | 241 | def search_func(match_value): 242 | 243 | line = str(match_value.group()) 244 | func_item = [line] 245 | tuple_temp = match_value.span() 246 | # char_pre = current_content[tuple_temp[0] - 1] 247 | char_index = tuple_temp[1] 248 | count = 1 249 | c_length = len(current_content) 250 | while count > 0: 251 | if char_index >= c_length - 1: 252 | # print('错误方法:%d, %s' % (char_index, line)) 253 | obscure_out_put_error_list.append('错误方法:%d, %s' % (char_index, line)) 254 | break 255 | char_suf = current_content[char_index] 256 | if char_suf == '{': 257 | count = count + 1 258 | elif char_suf == '}': 259 | count = count - 1 260 | char_index = char_index + 1 261 | func_item.append(char_suf) 262 | # print('方法:') 263 | # print(''.join(func_item)) 264 | func_list.append(''.join(func_item)) 265 | return line 266 | 267 | def change_create(match_value): 268 | tuple_temp = match_value.span() 269 | line = str(match_value.group()) 270 | j = 1 271 | temp_c_line = [] 272 | char_pre = '' 273 | c_current_func_str = ''.join(func_list) 274 | while char_pre != '\n': 275 | char_pre = c_current_func_str[tuple_temp[0] - j] 276 | temp_c_line.insert(0, char_pre) 277 | j = j + 1 278 | if tuple_temp[0] - j < 0: 279 | char_pre = '\n' 280 | 281 | temp_c_str = ''.join(temp_c_line) 282 | if re.match(r'[\s]*(static|constexpr|const)[\s]+.*', temp_c_str): 283 | # print("OC静态字符串无法加固:%s" % temp_c_str) 284 | out_put_static_str_list.append(temp_c_str) 285 | return line 286 | if re.match(r'[\s]*(NSString)[\s]+.*', temp_c_str) and temp_c_str not in ''.join(func_list): 287 | # print("NSString方法外部字符串无法加固:%s" % temp_c_str) 288 | out_put_static_str_list.append(temp_c_str) 289 | return line 290 | line = line.strip("@") 291 | line = line.strip("\"") 292 | if line in changed_oc_str: 293 | return line 294 | changed_oc_str.append(line) 295 | obscure_tuple = obscure_with_str(line, False) 296 | test_func_list.append(obscure_tuple[0]) 297 | test_func_ex_list.append("\tprintf(\"\\nKey : %s\");\n" % line) 298 | test_func_ex_list.append("\tprintf(\"\\nValue: %%s\", %s.UTF8String);\n" % (obscure_tuple[1])) 299 | obscure_out_put_list.append("\t\"%s\": \"%s\",\n" % (line, obscure_tuple[1])) 300 | print("需要混淆的OC字符串:%s, 混淆方法:%s" % (line, obscure_tuple[1])) 301 | if len(need_write_list) == 0: 302 | need_write_list.insert(0, '#import \n') 303 | need_write_list.append(obscure_tuple[0]) 304 | need_change_dic[line] = obscure_tuple[1] 305 | return line 306 | 307 | def change_create_c(match_value): 308 | line = str(match_value.group()) 309 | tuple_temp = match_value.span() 310 | char_pre = '' 311 | c_current_func_str = ''.join(func_list) 312 | if tuple_temp[0] - 1 < len(c_current_func_str): 313 | char_pre = c_current_func_str[tuple_temp[0] - 1] 314 | if char_pre == "@": 315 | # print("C方法匹配到OC字符串:%s" % line) 316 | return line 317 | j = 2 318 | temp_c_line = [char_pre] 319 | while char_pre != '\n': 320 | char_pre = c_current_func_str[tuple_temp[0] - j] 321 | temp_c_line.append(char_pre) 322 | j = j + 1 323 | if tuple_temp[0] - j < 0: 324 | char_pre = '\n' 325 | temp_c_str = ''.join(temp_c_line) 326 | if re.match(r'[\s]*(static|constexpr|const)[\s]+.*', temp_c_str): 327 | # print("OC静态字符串无法加固:%s" % temp_c_str) 328 | out_put_static_str_list.append(temp_c_str) 329 | return line 330 | if re.match(r'[\s]*(NSString)[\s]+.*', temp_c_str) and temp_c_str not in ''.join(func_list): 331 | # print("NSString方法外部字符串无法加固:%s" % temp_c_str) 332 | out_put_static_str_list.append(temp_c_str) 333 | return line 334 | line = line.strip("\"") 335 | if line in changed_c_str: 336 | return line 337 | changed_c_str.append(line) 338 | obscure_tuple = obscure_with_str(line, True) 339 | test_func_list.append(obscure_tuple[0]) 340 | test_func_ex_list.append("\tprintf(\"\\nKey : %s\");\n" % line) 341 | test_func_ex_list.append("\tprintf(\"\\nValue: %%s\", %s);\n" % (obscure_tuple[1])) 342 | obscure_out_put_list.append("\t\"%s\": \"%s\",\n" % (line, obscure_tuple[1])) 343 | print("需要混淆的C字符串:%s, 混淆方法:%s" % (line, obscure_tuple[1])) 344 | need_write_list.append(obscure_tuple[0]) 345 | need_change_dic[line] = obscure_tuple[1] 346 | return line 347 | 348 | def change_str_c(match_value): 349 | line = str(match_value.group()) 350 | tuple_temp = match_value.span() 351 | char_pre = current_content[tuple_temp[0] - 1] 352 | temp_c_line = [] 353 | j = 2 354 | if char_pre == "@" or char_pre == "\\" or char_pre == "\"": 355 | # print("C方法替换时匹配到错误字符串:%s" % line) 356 | out_put_no_change_str_list.append("%s:%s" % (line, current_file_path)) 357 | return line 358 | while char_pre != '\n': 359 | char_pre = current_content[tuple_temp[0] - j] 360 | temp_c_line.insert(0, char_pre) 361 | j = j + 1 362 | if tuple_temp[0] - j < 0: 363 | char_pre = '\n' 364 | 365 | temp_c_str = ''.join(temp_c_line) 366 | if re.match(r'[\s]*(static|constexpr|const)[\s]+.*', temp_c_str) or re.match(r'[\s]*(#|//).*', 367 | temp_c_str): 368 | # print("C替换时检测到静态字符串无法加固:%s" % temp_c_str) 369 | out_put_static_str_list.append(temp_c_str) 370 | return line 371 | if re.match(r'[\s]*(NSString)[\s]+.*', temp_c_str) and temp_c_str not in ''.join(func_list): 372 | # print("NSString方法外部字符串无法加固:%s" % temp_c_str) 373 | out_put_static_str_list.append(temp_c_str) 374 | return line 375 | c_line = line.strip("\"") 376 | if c_line in need_change_dic.keys(): 377 | return need_change_dic[c_line] 378 | return line 379 | 380 | def change_str(match_value): 381 | line = str(match_value.group()) 382 | tuple_temp = match_value.span() 383 | char_pre = current_content[tuple_temp[0] - 1] 384 | temp_c_line = [] 385 | j = 2 386 | if char_pre == "@" or char_pre == "\\" or char_pre == "\"": 387 | # print("OC替换时匹配到错误字符串:%s" % line) 388 | out_put_no_change_str_list.append("%s:%s" % (line, current_file_path)) 389 | return line 390 | while char_pre != '\n': 391 | char_pre = current_content[tuple_temp[0] - j] 392 | temp_c_line.insert(0, char_pre) 393 | j = j + 1 394 | if tuple_temp[0] - j < 0: 395 | char_pre = '\n' 396 | 397 | temp_c_str = ''.join(temp_c_line) 398 | if re.match(r'[\s]*(static|constexpr|const)[\s]+.*', temp_c_str) or re.match(r'[\s]*(#|//).*', 399 | temp_c_str): 400 | # print("OC替换时检测到静态字符串无法加固:%s" % temp_c_str) 401 | out_put_static_str_list.append(temp_c_str) 402 | return line 403 | if re.match(r'[\s]*(NSString)[\s]+.*', temp_c_str) and temp_c_str not in ''.join(func_list): 404 | # print("NSString方法外部字符串无法加固:%s" % temp_c_str) 405 | out_put_static_str_list.append(temp_c_str) 406 | return line 407 | c_line = line.strip("@") 408 | c_line = c_line.strip("\"") 409 | if c_line in need_change_dic.keys(): 410 | return need_change_dic[c_line] 411 | return line 412 | 413 | def change_str_with(str_patton, c_content, c_func_list, c_need_write_list, t_change_create, c_change_str): 414 | # print(".") 415 | oc_func_pattern = re.compile( 416 | r"[\s]?(\-|\+)[\s]*([(][\s]*(.*)[\s]*[*]?[\s]*[)])[\s]*[A-Za-z_]+([\s]|.)*?{") 417 | c_func_pattern = re.compile( 418 | r"[\s]*(static)*[\s]*(void|int|bool|char|float|double|wchar_t)[\s]+[A-Za-z_]+[\w]+[\s]*\(.*\)([\s]|[\w])*?{") 419 | c_oc_func_pattern = re.compile(r"[\s]*(BOOL|NS|UI|CG)[\w*]*[\s]+[A-Za-z_]+[\w]+[\s]*\(.*\)([\s]|[\w])*?{") 420 | re.sub(oc_func_pattern, search_func, c_content) 421 | re.sub(c_func_pattern, search_func, c_content) 422 | re.sub(c_oc_func_pattern, search_func, c_content) 423 | re.sub(str_patton, t_change_create, ''.join(c_func_list)) 424 | w_content_list_temp = re.sub(str_patton, c_change_str, c_content) 425 | current_w_list_temp = [] 426 | current_w_list_temp.extend(c_need_write_list) 427 | current_w_list_temp.extend(w_content_list_temp) 428 | current_w_str_temp = ''.join(current_w_list_temp) 429 | return current_w_str_temp 430 | print("开始扫描...") 431 | for dir_path, sub_paths, files in os.walk(top_dir, False): 432 | for s_file in files: 433 | if s_file in ignore_file_name_list: 434 | continue 435 | file_path = os.path.join(dir_path, s_file) 436 | current_file_path = file_path 437 | file_name, file_type = os.path.splitext(s_file) 438 | if file_type not in file_type_list: 439 | continue 440 | print("正在处理...:%s" % file_path) 441 | # print("file_path: %s" % file_path) 442 | func_list = [] 443 | need_write_list = [] 444 | need_change_dic = {} 445 | current_content = '' 446 | f = open(file_path, 'rb') 447 | data = f.read() 448 | encode_type = chardet.detect(data)["encoding"] 449 | f.close() 450 | if s_file == 'AppDelegate+WiFi.m': 451 | encode_type = 'utf-8' 452 | with open(file_path, mode='r', encoding=encode_type, errors='ignore') as file_object: 453 | current_content = file_object.read() 454 | 455 | patton_str = r"@\"[a-zA-Z0-9_.-]+\"" 456 | current_content = change_str_with(patton_str, current_content, func_list, need_write_list, change_create, 457 | change_str) 458 | ''' 459 | 两步加固独立,上一步加固oc字符串,生成的current_content就是替换完成后的结果 460 | 先加密oc字符串,已经处理完@开头的oc字符串,剩余匹配到的是都c字符串 461 | ''' 462 | func_list = [] 463 | need_write_list = [] 464 | need_change_dic = {} 465 | c_patton_str = r"\"[a-zA-Z0-9_.-]+\"" 466 | current_content = change_str_with(c_patton_str, current_content, func_list, need_write_list, 467 | change_create_c, change_str_c) 468 | # func_list = [] 469 | # need_write_list = [] 470 | # c_func_pattern = r"[\s]*(void|int|bool|char|float|double|wchar_t)[\s]+[A-Za-z_]+[\w]*\(.*\)[\s]*{" 471 | # re.sub(oc_func_pattern, search_func, current_content) 472 | # re.sub(c_func_pattern, search_func, current_content) 473 | # re.sub(c_patton_str, change_create_c, ''.join(func_list)) 474 | # w_content_list = re.sub(c_patton_str, change_str, current_content) 475 | # current_w_list = [] 476 | # current_w_list.extend(need_write_list) 477 | # current_w_list.extend(w_content_list) 478 | # current_w_str = ''.join(current_w_list) 479 | with open(file_path, mode='w', encoding=encode_type, errors='ignore') as file_object: 480 | file_object.write(current_content) 481 | # print('1') 482 | # re.search(patton_str, current_content) 483 | # res = re.findall(patton_str, current_content) 484 | # print(res) 485 | 486 | w_test_list = [] 487 | w_test_list.extend(test_func_ex_list) 488 | w_test_list.extend(test_func_list) 489 | # w_test = ''.join(w_test_list) 490 | print_str = ''.join(test_func_ex_list) 491 | func_str = ''.join(test_func_list) 492 | w_appdelegate_text = "#import \"AppDelegate.h\"\n%s\n@implementation AppDelegate\n- (BOOL)application:" \ 493 | "(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions " \ 494 | "{\n%s\nreturn YES;\n}\n@end" % (func_str, print_str) 495 | if len(obscure_out_put_list) == 0: 496 | return 497 | obscure_out_put_list = sorted(obscure_out_put_list, key=lambda x: len(str(x).split(':')[0])) 498 | obscure_out_put_list[-1] = obscure_out_put_list[-1].replace(",", "") 499 | obscure_out_put_list.insert(0, '{\n') 500 | obscure_out_put_list.append('}\n') 501 | with open(out_put_path, mode='w', encoding='utf-8', errors='ignore') as file_object: 502 | file_object.write(''.join(obscure_out_put_list)) 503 | with open(out_put_error_path, mode='w', encoding='utf-8', errors='ignore') as file_object: 504 | file_object.write(''.join(obscure_out_put_error_list)) 505 | with open(out_put_no_change_str_path, mode='w', encoding='utf-8', errors='ignore') as file_object: 506 | file_object.write(''.join(out_put_no_change_str_list)) 507 | with open(out_put_static_str_path, mode='w', encoding='utf-8', errors='ignore') as file_object: 508 | file_object.write(''.join(out_put_static_str_list)) 509 | with open(test_path, mode='w', encoding='utf-8', errors='ignore') as file_object: 510 | file_object.write(w_appdelegate_text) 511 | 512 | 513 | obscure_start() 514 | print("字符串混淆执行结束") 515 | end_time1 = datetime.now() 516 | print("脚本oc_class_path运行时间:%s" % str((end_time1 - start_time).seconds)) 517 | 518 | # with open(file_path, mode='w', encoding='utf-8', errors='ignore') as file_object: 519 | # file_object.write(w_string) 520 | 521 | # print("%s" % hex(141)) 522 | 523 | # for 524 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # obscure_oc 2 | iOS代码混淆,提供Object-C混淆python脚本 3 | # 使用方法 4 | 安装python3 5 | 打开命令行,在命令行中输入:python3 脚本路径 6 | 按回车,脚本运行后拖入工程文件目录,等待脚本运行完成,重新打开项目检查是否正常编译和运行。 7 | 详细文档:https://www.jianshu.com/p/d1a8914245d2 8 | OC_GetSystemFunction.py: 遍历系统framework脚本 9 | 10 | 1.0版本: 11 | 三个主要功能:Object-C类名混淆、Object-C方法名混淆、字符串混淆 12 | 脚本内的代码还有一些我的测试时留下的痕迹,近期也没时间做标准,有需要用看下源码,按需配置再运行即可。 13 | 脚本不局限于一种语言处理,脚本做的工作是正则匹配到目标字符串->生成映射->替换字符串,如需处理其他语言,只需修改脚本内的正则表达式即可。 14 | -------------------------------------------------------------------------------- /file/OC_Class.txt: -------------------------------------------------------------------------------- 1 | 2 | name 3 | NSObject 4 | MyClass 5 | CLKTextProvider 6 | __UIDiffableDataSource 7 | __UIDiffableDataSourceSnapshot 8 | NFCTagReaderSession 9 | NSIndexSet 10 | NSData 11 | MXMetaData 12 | MXAppResponsivenessMetric 13 | MXUnitSignalBars 14 | MXUnitAveragePixelLuminance 15 | MXDisplayMetric 16 | MXLocationActivityMetric 17 | MXGPUMetric 18 | MXNetworkTransferMetric 19 | MXDiskIOMetric 20 | MXSignpostIntervalData 21 | MXSignpostMetric 22 | MXMetricPayload 23 | MXCellularConditionMetric 24 | MXCPUMetric 25 | MXMetricManager 26 | MXAverage 27 | MXAppRunTimeMetric 28 | MXMemoryMetric 29 | MXHistogramBucket 30 | MXHistogram 31 | MXAppLaunchMetric 32 | MXMetric 33 | GKChallenge 34 | GKScoreChallenge 35 | GKAchievementChallenge 36 | GKScore 37 | GKAchievement 38 | GKBasePlayer 39 | GKAchievementViewController 40 | GKGameCenterViewController 41 | GKGameSession 42 | GKPlayer 43 | GKCloudPlayer 44 | GKMatch 45 | GKTurnBasedParticipant 46 | GKTurnBasedMatch 47 | GKTurnBasedExchange 48 | GKTurnBasedExchangeReply 49 | GKTurnBasedEventHandler 50 | GKLeaderboard 51 | GKLeaderboardSet 52 | GKNotificationBanner 53 | GKChallengeEventHandler 54 | GKFriendRequestComposeViewController 55 | GKPeerPickerController 56 | GKSavedGame 57 | GKLocalPlayer 58 | GKVoiceChatService 59 | GKTurnBasedMatchmakerViewController 60 | GKVoiceChat 61 | GKSession 62 | GKAchievementDescription 63 | GKMatchmakerViewController 64 | GKGameSessionSharingViewController 65 | GKLeaderboardViewController 66 | GKMatchRequest 67 | GKInvite 68 | GKMatchmaker 69 | ABUnknownPersonViewController 70 | ABPeoplePickerNavigationController 71 | ABNewPersonViewController 72 | ABPersonViewController 73 | SFSpeechRecognitionTask 74 | SFSpeechRecognizer 75 | SFSpeechRecognitionRequest 76 | SFSpeechURLRecognitionRequest 77 | SFSpeechAudioBufferRecognitionRequest 78 | SFTranscriptionSegment 79 | SFAcousticFeature 80 | SFVoiceAnalytics 81 | SFTranscription 82 | SFSpeechRecognitionResult 83 | SFContentBlockerManager 84 | SFContentBlockerState 85 | SSReadingList 86 | SFSafariViewController 87 | SFAuthenticationSession 88 | SFSafariViewControllerConfiguration 89 | MTLSharedTextureHandle 90 | MTLTextureDescriptor 91 | MTLArgumentDescriptor 92 | MTLType 93 | MTLStructMember 94 | MTLStructType 95 | MTLArrayType 96 | MTLPointerType 97 | MTLTextureReferenceType 98 | MTLArgument 99 | MTLRenderPipelineColorAttachmentDescriptor 100 | MTLRenderPipelineReflection 101 | MTLRenderPipelineDescriptor 102 | MTLRenderPipelineColorAttachmentDescriptorArray 103 | MTLTileRenderPipelineColorAttachmentDescriptor 104 | MTLTileRenderPipelineColorAttachmentDescriptorArray 105 | MTLTileRenderPipelineDescriptor 106 | MTLFunctionConstantValues 107 | MTLVertexBufferLayoutDescriptor 108 | MTLVertexBufferLayoutDescriptorArray 109 | MTLVertexAttributeDescriptor 110 | MTLVertexAttributeDescriptorArray 111 | MTLVertexDescriptor 112 | MTLComputePipelineReflection 113 | MTLComputePipelineDescriptor 114 | MTLSharedEventListener 115 | MTLSharedEventHandle 116 | MTLRenderPassAttachmentDescriptor 117 | MTLRenderPassColorAttachmentDescriptor 118 | MTLRenderPassDepthAttachmentDescriptor 119 | MTLRenderPassStencilAttachmentDescriptor 120 | MTLRenderPassColorAttachmentDescriptorArray 121 | MTLRenderPassDescriptor 122 | MTLIndirectCommandBufferDescriptor 123 | MTLBufferLayoutDescriptor 124 | MTLBufferLayoutDescriptorArray 125 | MTLAttributeDescriptor 126 | MTLAttributeDescriptorArray 127 | MTLStageInputOutputDescriptor 128 | MTLStencilDescriptor 129 | MTLDepthStencilDescriptor 130 | MTLRasterizationRateSampleArray 131 | MTLRasterizationRateLayerDescriptor 132 | MTLRasterizationRateLayerArray 133 | MTLRasterizationRateMapDescriptor 134 | MTLPipelineBufferDescriptor 135 | MTLPipelineBufferDescriptorArray 136 | MTLSamplerDescriptor 137 | MTLVertexAttribute 138 | MTLAttribute 139 | MTLFunctionConstant 140 | MTLCompileOptions 141 | MTLHeapDescriptor 142 | MTLCaptureDescriptor 143 | MTLCaptureManager 144 | CATransformLayer 145 | CAScrollLayer 146 | CALayer 147 | NSNull 148 | CAMediaTimingFunction 149 | CAReplicatorLayer 150 | CATextLayer 151 | CATiledLayer 152 | CAEmitterLayer 153 | CADisplayLink 154 | CAEAGLLayer 155 | NSValue 156 | CAEmitterCell 157 | CAShapeLayer 158 | CAValueFunction 159 | CAMetalLayer 160 | CATransaction 161 | CAGradientLayer 162 | CAAnimation 163 | CAPropertyAnimation 164 | CABasicAnimation 165 | CAKeyframeAnimation 166 | CASpringAnimation 167 | CATransition 168 | CAAnimationGroup 169 | SKStorefront 170 | SKPaymentQueue 171 | SKReceiptRefreshRequest 172 | SKCloudServiceController 173 | SKProductSubscriptionPeriod 174 | SKProduct 175 | SKStoreProductViewController 176 | SKProductStorePromotionController 177 | SKArcadeService 178 | SKStoreReviewController 179 | SKPayment 180 | SKMutablePayment 181 | SKProductDiscount 182 | SKPaymentDiscount 183 | SKRequest 184 | SKCloudServiceSetupViewController 185 | SKDownload 186 | SKProductsRequest 187 | SKProductsResponse 188 | SKAdNetwork 189 | SKPaymentTransaction 190 | MLMultiArray 191 | MLMetricKey 192 | MLImageSize 193 | MLMultiArrayConstraint 194 | MLUpdateProgressHandlers 195 | MLMultiArrayShapeConstraint 196 | MLImageSizeConstraint 197 | MLParameterDescription 198 | MLUpdateTask 199 | MLFeatureDescription 200 | MLParameterKey 201 | MLDictionaryConstraint 202 | MLNumericConstraint 203 | MLDictionaryFeatureProvider 204 | MLFeatureValue 205 | MLSequence 206 | MLUpdateContext 207 | MLModelConfiguration 208 | MLModel 209 | MLTask 210 | MLModelDescription 211 | MLSequenceConstraint 212 | MLKey 213 | MLArrayBatchProvider 214 | MLImageConstraint 215 | MLPredictionOptions 216 | WCSessionFile 217 | WCSessionFileTransfer 218 | WCSessionUserInfoTransfer 219 | WCSession 220 | NSExtensionContext 221 | ARMatteGenerator 222 | ARCollaborationData 223 | ARSkeleton 224 | ARLightEstimate 225 | ARDirectionalLightEstimate 226 | ARFaceAnchor 227 | ARSKView 228 | ARQuickLookPreviewItem 229 | ARHitTestResult 230 | ARTrackedRaycast 231 | ARRaycastQuery 232 | ARParticipantAnchor 233 | ARBodyAnchor 234 | ARReferenceImage 235 | ARVideoFormat 236 | ARCamera 237 | ARPlaneGeometry 238 | ARSCNPlaneGeometry 239 | ARFrame 240 | ARSession 241 | ARObjectAnchor 242 | AREnvironmentProbeAnchor 243 | ARWorldMap 244 | ARCoachingOverlayView 245 | ARPlaneAnchor 246 | ARSCNView 247 | ARPointCloud 248 | ARConfiguration 249 | ARWorldTrackingConfiguration 250 | AROrientationTrackingConfiguration 251 | ARFaceTrackingConfiguration 252 | ARImageTrackingConfiguration 253 | ARObjectScanningConfiguration 254 | ARBodyTrackingConfiguration 255 | ARPositionalTrackingConfiguration 256 | ARAnchor 257 | ARRaycastResult 258 | ARFaceGeometry 259 | ARSCNFaceGeometry 260 | ARSkeletonDefinition 261 | ARReferenceObject 262 | ARImageAnchor 263 | MPSTemporalAA 264 | MPSPolygonBuffer 265 | MPSAccelerationStructureGroup 266 | MPSAccelerationStructure 267 | MPSPolygonAccelerationStructure 268 | MPSInstanceAccelerationStructure 269 | MPSQuadrilateralAccelerationStructure 270 | MPSSVGF 271 | MPSSVGFDefaultTextureAllocator 272 | MPSSVGFDenoiser 273 | MPSTriangleAccelerationStructure 274 | MPSRayIntersector 275 | MPSCNNKernel 276 | MPSCNNBinaryKernel 277 | MPSCNNGradientKernel 278 | MPSCNNMultiaryKernel 279 | MPSMatrixSum 280 | MPSNNGraph 281 | MyHandle 282 | MPSNNImageNode 283 | MPSNNStateNode 284 | MPSNNGradientStateNode 285 | MPSCNNConvolutionGradientStateNode 286 | MPSCNNConvolutionTransposeGradientStateNode 287 | MPSNNBinaryGradientStateNode 288 | MPSNNMultiaryGradientStateNode 289 | MPSNNArithmeticGradientStateNode 290 | MPSNNFilterNode 291 | MPSNNGradientFilterNode 292 | MPSCNNConvolutionNode 293 | MPSCNNFullyConnectedNode 294 | MPSCNNBinaryConvolutionNode 295 | MPSCNNBinaryFullyConnectedNode 296 | MPSCNNConvolutionTransposeNode 297 | MPSCNNConvolutionGradientNode 298 | MPSCNNFullyConnectedGradientNode 299 | MPSCNNConvolutionTransposeGradientNode 300 | MPSCNNNeuronNode 301 | MPSCNNNeuronAbsoluteNode 302 | MPSCNNNeuronELUNode 303 | MPSCNNNeuronReLUNNode 304 | MPSCNNNeuronLinearNode 305 | MPSCNNNeuronReLUNode 306 | MPSCNNNeuronSigmoidNode 307 | MPSCNNNeuronHardSigmoidNode 308 | MPSCNNNeuronSoftPlusNode 309 | MPSCNNNeuronSoftSignNode 310 | MPSCNNNeuronTanHNode 311 | MPSCNNNeuronPReLUNode 312 | MPSCNNNeuronPowerNode 313 | MPSCNNNeuronExponentialNode 314 | MPSCNNNeuronLogarithmNode 315 | MPSCNNNeuronGeLUNode 316 | MPSCNNNeuronGradientNode 317 | MPSNNUnaryReductionNode 318 | MPSNNReductionRowMinNode 319 | MPSNNReductionColumnMinNode 320 | MPSNNReductionFeatureChannelsMinNode 321 | MPSNNReductionFeatureChannelsArgumentMinNode 322 | MPSNNReductionRowMaxNode 323 | MPSNNReductionColumnMaxNode 324 | MPSNNReductionFeatureChannelsMaxNode 325 | MPSNNReductionFeatureChannelsArgumentMaxNode 326 | MPSNNReductionRowMeanNode 327 | MPSNNReductionColumnMeanNode 328 | MPSNNReductionFeatureChannelsMeanNode 329 | MPSNNReductionSpatialMeanNode 330 | MPSNNReductionRowSumNode 331 | MPSNNReductionColumnSumNode 332 | MPSNNReductionFeatureChannelsSumNode 333 | MPSCNNPoolingNode 334 | MPSCNNPoolingAverageNode 335 | MPSCNNPoolingMaxNode 336 | MPSCNNDilatedPoolingMaxNode 337 | MPSCNNPoolingGradientNode 338 | MPSCNNPoolingMaxGradientNode 339 | MPSCNNPoolingAverageGradientNode 340 | MPSCNNDilatedPoolingMaxGradientNode 341 | MPSCNNNormalizationNode 342 | MPSCNNSpatialNormalizationNode 343 | MPSCNNSpatialNormalizationGradientNode 344 | MPSCNNLocalContrastNormalizationNode 345 | MPSCNNLocalContrastNormalizationGradientNode 346 | MPSCNNCrossChannelNormalizationNode 347 | MPSCNNCrossChannelNormalizationGradientNode 348 | MPSCNNInstanceNormalizationNode 349 | MPSCNNInstanceNormalizationGradientNode 350 | MPSCNNGroupNormalizationNode 351 | MPSCNNGroupNormalizationGradientNode 352 | MPSCNNBatchNormalizationNode 353 | MPSCNNBatchNormalizationGradientNode 354 | MPSNNScaleNode 355 | MPSNNBilinearScaleNode 356 | MPSNNLanczosScaleNode 357 | MPSNNBinaryArithmeticNode 358 | MPSNNAdditionNode 359 | MPSNNSubtractionNode 360 | MPSNNMultiplicationNode 361 | MPSNNDivisionNode 362 | MPSNNComparisonNode 363 | MPSNNArithmeticGradientNode 364 | MPSNNAdditionGradientNode 365 | MPSNNSubtractionGradientNode 366 | MPSNNMultiplicationGradientNode 367 | MPSCNNDropoutNode 368 | MPSCNNDropoutGradientNode 369 | MPSNNLabelsNode 370 | MPSCNNLossNode 371 | MPSCNNYOLOLossNode 372 | MPSNNConcatenationNode 373 | MPSNNConcatenationGradientNode 374 | MPSNNReshapeNode 375 | MPSNNReshapeGradientNode 376 | MPSNNReductionSpatialMeanGradientNode 377 | MPSNNPadNode 378 | MPSNNPadGradientNode 379 | MPSCNNSoftMaxNode 380 | MPSCNNSoftMaxGradientNode 381 | MPSCNNLogSoftMaxNode 382 | MPSCNNLogSoftMaxGradientNode 383 | MPSCNNUpsamplingNearestNode 384 | MPSCNNUpsamplingBilinearNode 385 | MPSCNNUpsamplingNearestGradientNode 386 | MPSCNNUpsamplingBilinearGradientNode 387 | MPSNNGramMatrixCalculationNode 388 | MPSNNGramMatrixCalculationGradientNode 389 | MPSNNForwardLossNode 390 | MPSNNLossGradientNode 391 | MPSNNInitialGradientNode 392 | MPSCNNNormalizationGammaAndBetaState 393 | MPSCNNArithmeticGradientState 394 | MPSCNNArithmetic 395 | MPSCNNAdd 396 | MPSCNNSubtract 397 | MPSCNNMultiply 398 | MPSCNNDivide 399 | MPSNNCompare 400 | MPSCNNArithmeticGradient 401 | MPSCNNAddGradient 402 | MPSCNNSubtractGradient 403 | MPSCNNMultiplyGradient 404 | MPSNNGradientState 405 | MPSNNBinaryGradientState 406 | MPSNNMultiaryGradientState 407 | MPSCNNUpsampling 408 | MPSCNNUpsamplingNearest 409 | MPSCNNUpsamplingBilinear 410 | MPSCNNUpsamplingGradient 411 | MPSCNNUpsamplingNearestGradient 412 | MPSCNNUpsamplingBilinearGradient 413 | MPSCNNConvolutionDescriptor 414 | MPSCNNSubPixelConvolutionDescriptor 415 | MPSCNNDepthWiseConvolutionDescriptor 416 | MPSCNNConvolutionGradientState 417 | MPSCNNConvolutionTransposeGradientState 418 | MPSCNNConvolutionWeightsAndBiasesState 419 | MPSCNNConvolution 420 | MPSCNNConvolutionGradient 421 | MPSCNNFullyConnected 422 | MPSCNNFullyConnectedGradient 423 | MPSCNNConvolutionTranspose 424 | MPSCNNConvolutionTransposeGradient 425 | MPSCNNBinaryConvolution 426 | MPSCNNBinaryFullyConnected 427 | MPSNNGramMatrixCalculation 428 | MPSNNGramMatrixCalculationGradient 429 | MPSNNSlice 430 | MPSNNDefaultPadding 431 | MPSCNNSoftMax 432 | MPSCNNSoftMaxGradient 433 | MPSCNNLogSoftMax 434 | MPSCNNLogSoftMaxGradient 435 | MPSNNResizeBilinear 436 | MPSNNCropAndResizeBilinear 437 | MPSCNNBatchNormalizationState 438 | MPSCNNNormalizationMeanAndVarianceState 439 | MPSCNNBatchNormalization 440 | MPSCNNBatchNormalizationStatistics 441 | MPSCNNBatchNormalizationGradient 442 | MPSCNNBatchNormalizationStatisticsGradient 443 | MPSCNNLossDataDescriptor 444 | MPSCNNLossLabels 445 | MPSCNNLossDescriptor 446 | MPSCNNLoss 447 | MPSCNNYOLOLossDescriptor 448 | MPSCNNYOLOLoss 449 | MPSNNForwardLoss 450 | MPSNNLossGradient 451 | MPSNNInitialGradient 452 | MPSNNReshape 453 | MPSNNReshapeGradient 454 | MPSNNPad 455 | MPSNNPadGradient 456 | MPSRNNDescriptor 457 | MPSRNNSingleGateDescriptor 458 | MPSGRUDescriptor 459 | MPSLSTMDescriptor 460 | MPSRNNRecurrentImageState 461 | MPSRNNImageInferenceLayer 462 | MPSRNNRecurrentMatrixState 463 | MPSRNNMatrixInferenceLayer 464 | MPSRNNMatrixTrainingState 465 | MPSRNNMatrixTrainingLayer 466 | MPSNNReduceUnary 467 | MPSNNReduceRowMin 468 | MPSNNReduceColumnMin 469 | MPSNNReduceFeatureChannelsMin 470 | MPSNNReduceFeatureChannelsArgumentMin 471 | MPSNNReduceRowMax 472 | MPSNNReduceColumnMax 473 | MPSNNReduceFeatureChannelsMax 474 | MPSNNReduceFeatureChannelsArgumentMax 475 | MPSNNReduceRowMean 476 | MPSNNReduceColumnMean 477 | MPSNNReduceFeatureChannelsMean 478 | MPSNNReduceRowSum 479 | MPSNNReduceColumnSum 480 | MPSNNReduceFeatureChannelsSum 481 | MPSNNReduceBinary 482 | MPSNNReduceFeatureChannelsAndWeightsMean 483 | MPSNNReduceFeatureChannelsAndWeightsSum 484 | MPSNNLocalCorrelation 485 | MPSMatrixNeuron 486 | MPSMatrixNeuronGradient 487 | MPSNNNeuronDescriptor 488 | MPSCNNNeuron 489 | MPSCNNNeuronGradient 490 | MPSCNNNeuronLinear 491 | MPSCNNNeuronReLU 492 | MPSCNNNeuronPReLU 493 | MPSCNNNeuronSigmoid 494 | MPSCNNNeuronHardSigmoid 495 | MPSCNNNeuronTanH 496 | MPSCNNNeuronAbsolute 497 | MPSCNNNeuronSoftPlus 498 | MPSCNNNeuronSoftSign 499 | MPSCNNNeuronELU 500 | MPSCNNNeuronReLUN 501 | MPSCNNNeuronPower 502 | MPSCNNNeuronExponential 503 | MPSCNNNeuronLogarithm 504 | MPSNNOptimizerDescriptor 505 | MPSNNOptimizer 506 | MPSNNOptimizerStochasticGradientDescent 507 | MPSNNOptimizerRMSProp 508 | MPSNNOptimizerAdam 509 | MPSCNNPooling 510 | MPSCNNPoolingMax 511 | MPSCNNPoolingAverage 512 | MPSCNNDilatedPoolingMax 513 | MPSCNNPoolingGradient 514 | MPSCNNPoolingAverageGradient 515 | MPSCNNPoolingMaxGradient 516 | MPSCNNDilatedPoolingMaxGradient 517 | MPSCNNInstanceNormalizationGradientState 518 | MPSCNNInstanceNormalization 519 | MPSCNNInstanceNormalizationGradient 520 | MPSNNGridSample 521 | MPSCNNSpatialNormalization 522 | MPSCNNSpatialNormalizationGradient 523 | MPSCNNLocalContrastNormalization 524 | MPSCNNLocalContrastNormalizationGradient 525 | MPSCNNCrossChannelNormalization 526 | MPSCNNCrossChannelNormalizationGradient 527 | MPSMatrixFullyConnected 528 | MPSMatrixFullyConnectedGradient 529 | MPSCNNDropoutGradientState 530 | MPSCNNDropout 531 | MPSCNNDropoutGradient 532 | MPSCNNGroupNormalizationGradientState 533 | MPSCNNGroupNormalization 534 | MPSCNNGroupNormalizationGradient 535 | MPSMatrixBatchNormalization 536 | MPSMatrixBatchNormalizationGradient 537 | MPSNDArrayMatrixMultiplication 538 | MPSNDArrayStridedSlice 539 | MPSNDArrayStridedSliceGradient 540 | MPSNDArrayMultiaryBase 541 | MPSNDArrayMultiaryKernel 542 | MPSNDArrayMultiaryGradientKernel 543 | MPSNDArrayUnaryKernel 544 | MPSNDArrayUnaryGradientKernel 545 | MPSNDArrayBinaryKernel 546 | MPSNDArrayBinaryPrimaryGradientKernel 547 | MPSNDArrayBinarySecondaryGradientKernel 548 | MPSNDArrayGatherGradientState 549 | MPSNDArrayGather 550 | MPSNDArrayGatherGradient 551 | MPSNDArrayGradientState 552 | MPSPredicate 553 | MPSCommandBuffer 554 | MPSKernel 555 | MPSKeyedUnarchiver 556 | MPSNDArrayDescriptor 557 | MPSNDArray 558 | MPSTemporaryNDArray 559 | MPSStateResourceList 560 | MPSState 561 | MPSImageDescriptor 562 | MPSImage 563 | MPSTemporaryImage 564 | MPSMatrixDescriptor 565 | MPSVectorDescriptor 566 | MPSMatrix 567 | MPSVector 568 | MPSTemporaryMatrix 569 | MPSTemporaryVector 570 | MPSImageStatisticsMinAndMax 571 | MPSImageStatisticsMeanAndVariance 572 | MPSImageStatisticsMean 573 | MPSImageCopyToMatrix 574 | MPSMatrixCopyToImage 575 | MPSImageThresholdBinary 576 | MPSImageThresholdBinaryInverse 577 | MPSImageThresholdTruncate 578 | MPSImageThresholdToZero 579 | MPSImageThresholdToZeroInverse 580 | MPSImageScale 581 | MPSImageLanczosScale 582 | MPSImageBilinearScale 583 | MPSUnaryImageKernel 584 | MPSBinaryImageKernel 585 | MPSImageArithmetic 586 | MPSImageAdd 587 | MPSImageSubtract 588 | MPSImageMultiply 589 | MPSImageDivide 590 | MPSImageIntegral 591 | MPSImageIntegralOfSquares 592 | MPSImageReduceUnary 593 | MPSImageReduceRowMin 594 | MPSImageReduceColumnMin 595 | MPSImageReduceRowMax 596 | MPSImageReduceColumnMax 597 | MPSImageReduceRowMean 598 | MPSImageReduceColumnMean 599 | MPSImageReduceRowSum 600 | MPSImageReduceColumnSum 601 | MPSImageMedian 602 | MPSImageAreaMax 603 | MPSImageAreaMin 604 | MPSImageDilate 605 | MPSImageErode 606 | MPSImageTranspose 607 | MPSImageEuclideanDistanceTransform 608 | MPSImageConversion 609 | MPSImageConvolution 610 | MPSImageLaplacian 611 | MPSImageBox 612 | MPSImageTent 613 | MPSImageGaussianBlur 614 | MPSImageSobel 615 | MPSImagePyramid 616 | MPSImageGaussianPyramid 617 | MPSImageLaplacianPyramid 618 | MPSImageLaplacianPyramidSubtract 619 | MPSImageLaplacianPyramidAdd 620 | MPSImageGuidedFilter 621 | MPSImageFindKeypoints 622 | MPSImageHistogram 623 | MPSImageNormalizedHistogram 624 | MPSImageHistogramEqualization 625 | MPSImageHistogramSpecification 626 | MPSMatrixFindTopK 627 | MPSMatrixUnaryKernel 628 | MPSMatrixBinaryKernel 629 | MPSMatrixRandomDistributionDescriptor 630 | MPSMatrixRandom 631 | MPSMatrixRandomPhilox 632 | MPSMatrixSolveTriangular 633 | MPSMatrixSolveLU 634 | MPSMatrixSolveCholesky 635 | MPSMatrixDecompositionLU 636 | MPSMatrixDecompositionCholesky 637 | MPSMatrixMultiplication 638 | MPSMatrixVectorMultiplication 639 | MPSMatrixCopyDescriptor 640 | MPSMatrixCopy 641 | MPSMatrixSoftMax 642 | MPSMatrixLogSoftMax 643 | MPSMatrixSoftMaxGradient 644 | MPSMatrixLogSoftMaxGradient 645 | EAWiFiUnconfiguredAccessory 646 | EASession 647 | EAAccessoryManager 648 | EAWiFiUnconfiguredAccessoryBrowser 649 | EAAccessory 650 | MPNowPlayingInfoLanguageOption 651 | MPNowPlayingInfoLanguageOptionGroup 652 | NSUserActivity 653 | MPContentItem 654 | MPPlayableContentManager 655 | MPMusicPlayerQueueDescriptor 656 | MPMusicPlayerMediaItemQueueDescriptor 657 | MPMusicPlayerStoreQueueDescriptor 658 | MPMusicPlayerPlayParameters 659 | MPMusicPlayerPlayParametersQueueDescriptor 660 | MPRemoteCommand 661 | MPSkipIntervalCommand 662 | MPFeedbackCommand 663 | MPRatingCommand 664 | MPChangePlaybackRateCommand 665 | MPChangePlaybackPositionCommand 666 | MPChangeShuffleModeCommand 667 | MPChangeRepeatModeCommand 668 | MPMoviePlayerController 669 | MPTimedMetadata 670 | MPMovieAccessLog 671 | MPMovieErrorLog 672 | MPMovieAccessLogEvent 673 | MPMovieErrorLogEvent 674 | MPMusicPlayerControllerQueue 675 | MPMusicPlayerControllerMutableQueue 676 | MPMusicPlayerApplicationController 677 | MPMusicPlayerController 678 | MPMediaEntity 679 | MPMediaPlaylist 680 | MPMediaPlaylistCreationMetadata 681 | MPMediaQuerySection 682 | MPRemoteCommandCenter 683 | MPPlayableContentManagerContext 684 | MPMediaLibrary 685 | AVMediaSelectionOption 686 | AVMediaSelectionGroup 687 | MPRemoteCommandEvent 688 | MPSkipIntervalCommandEvent 689 | MPSeekCommandEvent 690 | MPRatingCommandEvent 691 | MPChangePlaybackRateCommandEvent 692 | MPFeedbackCommandEvent 693 | MPChangeLanguageOptionCommandEvent 694 | MPChangePlaybackPositionCommandEvent 695 | MPChangeShuffleModeCommandEvent 696 | MPChangeRepeatModeCommandEvent 697 | MPMediaPickerController 698 | MPVolumeView 699 | MPMediaItemCollection 700 | MPNowPlayingInfoCenter 701 | MPMediaItem 702 | MPMediaItemArtwork 703 | MPMediaQuery 704 | MPMediaPredicate 705 | MPMediaPropertyPredicate 706 | MPMoviePlayerViewController 707 | UIViewController 708 | LPLinkView 709 | LPMetadataProvider 710 | LPLinkMetadata 711 | ILClassificationUIExtensionContext 712 | ILClassificationUIExtensionViewController 713 | UIDynamicItemGroup 714 | UIDynamicBehavior 715 | UIGravityBehavior 716 | UIWindow 717 | UIVibrancyEffect 718 | NSMutableAttributedString 719 | NSAttributedString 720 | UIBarButtonItem 721 | NSTextContainer 722 | UIDragItem 723 | UIWebView 724 | UIImageAsset 725 | NSLayoutManager 726 | UISceneConfiguration 727 | UISceneSession 728 | UIProgressView 729 | NSLayoutAnchor 730 | NSLayoutXAxisAnchor 731 | NSLayoutYAxisAnchor 732 | NSLayoutDimension 733 | UIPencilInteraction 734 | UIFocusGuide 735 | NSTextTab 736 | NSParagraphStyle 737 | NSMutableParagraphStyle 738 | UIColor 739 | UIPresentationController 740 | NSTextStorage 741 | UIKeyCommand 742 | NSIndexPath 743 | UIPasteConfiguration 744 | UIMenu 745 | UIAction 746 | UIUserNotificationSettings 747 | UIUserNotificationCategory 748 | UIMutableUserNotificationCategory 749 | UIUserNotificationAction 750 | UIMutableUserNotificationAction 751 | UIPinchGestureRecognizer 752 | NSDiffableDataSourceSnapshot 753 | UICollectionViewDiffableDataSource 754 | UITableViewDiffableDataSource 755 | UIBlurEffect 756 | UIPrintInteractionController 757 | UISearchTextField 758 | UISearchToken 759 | UISearchBar 760 | UITextDragPreviewRenderer 761 | UITouch 762 | UITextInteraction 763 | UIPageViewController 764 | UIScreenshotService 765 | UIWindowScene 766 | NSItemProvider 767 | UIDynamicItemBehavior 768 | UIMotionEffect 769 | UIInterpolatingMotionEffect 770 | UIMotionEffectGroup 771 | UIScreenMode 772 | UIStepper 773 | UIActivityIndicatorView 774 | UISceneActivationConditions 775 | UICollectionViewLayoutAttributes 776 | UICollectionViewUpdateItem 777 | UICollectionViewLayoutInvalidationContext 778 | UICollectionViewLayout 779 | UIPopoverPresentationController 780 | UICloudSharingController 781 | UIResponder 782 | UIGraphicsImageRendererFormat 783 | UIGraphicsImageRendererContext 784 | UIGraphicsImageRenderer 785 | UINotificationFeedbackGenerator 786 | UIMenuElement 787 | UIImageConfiguration 788 | UIDragPreview 789 | UIDictationPhrase 790 | UITextInputAssistantItem 791 | UITextPlaceholder 792 | UITextPosition 793 | UITextRange 794 | UITextSelectionRect 795 | UITextInputStringTokenizer 796 | UITextInputMode 797 | UIHoverGestureRecognizer 798 | UIFocusAnimationCoordinator 799 | UIDevice 800 | UIBarButtonItemStateAppearance 801 | UIBarButtonItemAppearance 802 | UIDragPreviewParameters 803 | UICollectionViewController 804 | UICollectionViewFlowLayoutInvalidationContext 805 | UICollectionViewFlowLayout 806 | UIVisualEffectView 807 | UIPrinterPickerController 808 | UIReferenceLibraryViewController 809 | UIApplicationShortcutIcon 810 | UIApplicationShortcutItem 811 | UIMutableApplicationShortcutItem 812 | UIPress 813 | UITargetedDragPreview 814 | UIPressesEvent 815 | NSSharingServicePickerTouchBarItem 816 | UIEvent 817 | UIToolbar 818 | UISwipeActionsConfiguration 819 | UICommandAlternate 820 | UICommand 821 | UIInputView 822 | UNNotificationResponse 823 | UIFont 824 | UIPickerView 825 | UIImagePickerController 826 | UIPrintFormatter 827 | UISimpleTextPrintFormatter 828 | UIMarkupTextPrintFormatter 829 | UIViewPrintFormatter 830 | UIPrintPageRenderer 831 | UIViewPropertyAnimator 832 | UIDocumentBrowserAction 833 | UIAccessibilityCustomAction 834 | UILayoutGuide 835 | UISwipeGestureRecognizer 836 | UIPrintInfo 837 | UITextDropProposal 838 | UITextField 839 | UIView 840 | UIStoryboard 841 | UITapGestureRecognizer 842 | UIBarAppearance 843 | UIAcceleration 844 | UIAccelerometer 845 | UITraitCollection 846 | UILabel 847 | UIDocumentInteractionController 848 | UIAlertAction 849 | UIAlertController 850 | UIGraphicsRendererFormat 851 | UIGraphicsRendererContext 852 | UIGraphicsRenderer 853 | UIScrollView 854 | UIContextMenuInteraction 855 | UIDropInteraction 856 | UIDropProposal 857 | UIPushBehavior 858 | UIPreviewAction 859 | UIPreviewActionGroup 860 | UIPercentDrivenInteractiveTransition 861 | UITabBarItem 862 | UIPrintPaper 863 | NSLayoutConstraint 864 | UICollisionBehavior 865 | UIToolbarAppearance 866 | UIAccessibilityElement 867 | UIAttachmentBehavior 868 | UIDocumentPickerExtensionViewController 869 | UIMenuSystem 870 | UIImageSymbolConfiguration 871 | UILocalNotification 872 | UIControl 873 | UIManagedDocument 874 | UIFocusUpdateContext 875 | UIFontPickerViewController 876 | UICollectionViewTransitionLayout 877 | UIAccessibilityLocationDescriptor 878 | UILongPressGestureRecognizer 879 | NSShadow 880 | UIScene 881 | UIDatePicker 882 | UITextInputPasswordRules 883 | UIGraphicsPDFRendererFormat 884 | UIGraphicsPDFRendererContext 885 | UIGraphicsPDFRenderer 886 | UILargeContentViewerInteraction 887 | UIGestureRecognizer 888 | UIFeedbackGenerator 889 | UINavigationItem 890 | UIDocumentBrowserViewController 891 | UIDocumentBrowserTransitionController 892 | UIPrinter 893 | UIDragPreviewTarget 894 | UIDragInteraction 895 | UIImage 896 | NSTextAttachment 897 | UIPanGestureRecognizer 898 | UIStoryboardSegue 899 | UIStoryboardUnwindSegueSource 900 | UIActivityItemProvider 901 | UISnapBehavior 902 | UITableViewHeaderFooterView 903 | UISelectionFeedbackGenerator 904 | UICollectionReusableView 905 | UICollectionViewCell 906 | UIInputViewController 907 | UIMenuController 908 | UIMenuItem 909 | UISpringLoadedInteraction 910 | UIPreviewParameters 911 | UIDocumentMenuViewController 912 | UIPageControl 913 | UIImageView 914 | NSDataAsset 915 | UITextChecker 916 | UIRegion 917 | UINavigationBar 918 | UIRotationGestureRecognizer 919 | UIDocument 920 | UIRefreshControl 921 | UIScreen 922 | UITextFormattingCoordinator 923 | UIDocumentPickerViewController 924 | UICubicTimingParameters 925 | UISpringTimingParameters 926 | UIContextMenuConfiguration 927 | UIScreenEdgePanGestureRecognizer 928 | UICollectionViewFocusUpdateContext 929 | UICollectionView 930 | UICollectionViewDropProposal 931 | UICollectionViewPlaceholder 932 | UICollectionViewDropPlaceholder 933 | UIDynamicAnimator 934 | UINavigationController 935 | UITableViewCell 936 | UIFocusSystem 937 | UIApplication 938 | UIPreviewTarget 939 | UITargetedPreview 940 | UISwitch 941 | UIAccessibilityCustomRotorSearchPredicate 942 | UIAccessibilityCustomRotor 943 | UIAccessibilityCustomRotorItemResult 944 | UIWindowSceneDestructionRequestOptions 945 | UISceneSizeRestrictions 946 | UISearchDisplayController 947 | UITableViewRowAction 948 | UITableViewFocusUpdateContext 949 | UITableView 950 | UITableViewDropProposal 951 | UITableViewPlaceholder 952 | UITableViewDropPlaceholder 953 | UIPasteboard 954 | UIPopoverBackgroundView 955 | UISplitViewController 956 | UIButton 957 | UIStoryboardPopoverSegue 958 | UITableViewController 959 | UIFocusDebugger 960 | UISearchContainerViewController 961 | UIPreviewInteraction 962 | UIBezierPath 963 | UITitlebar 964 | NSToolbarItem 965 | NSMenuToolbarItem 966 | NSSharingServicePickerToolbarItem 967 | UITabBarItemStateAppearance 968 | UITabBarItemAppearance 969 | UITabBarAppearance 970 | UIContextualAction 971 | UITabBar 972 | UIBarButtonItemGroup 973 | UIVisualEffect 974 | UIBarItem 975 | UINavigationBarAppearance 976 | UIAlertView 977 | UIFontMetrics 978 | UIActionSheet 979 | UINib 980 | UIStatusBarManager 981 | UILexiconEntry 982 | UILexicon 983 | UIImpactFeedbackGenerator 984 | UIStackView 985 | UIActivityItemsConfiguration 986 | UISegmentedControl 987 | NSStringDrawingContext 988 | NSString 989 | UITabBarController 990 | UIFontPickerViewControllerConfiguration 991 | UIActivity 992 | UIFieldBehavior 993 | UIOpenURLContext 994 | UILocalizedIndexedCollation 995 | NSCoder 996 | UIFontDescriptor 997 | UISceneConnectionOptions 998 | UISceneOpenURLOptions 999 | UISceneOpenExternalURLOptions 1000 | UISceneActivationRequestOptions 1001 | UISceneDestructionRequestOptions 1002 | UISlider 1003 | UIActivityViewController 1004 | UICollectionViewCompositionalLayoutConfiguration 1005 | UICollectionViewCompositionalLayout 1006 | NSCollectionLayoutSection 1007 | NSCollectionLayoutItem 1008 | NSCollectionLayoutGroupCustomItem 1009 | NSCollectionLayoutGroup 1010 | NSCollectionLayoutDimension 1011 | NSCollectionLayoutSize 1012 | NSCollectionLayoutSpacing 1013 | NSCollectionLayoutEdgeSpacing 1014 | NSCollectionLayoutSupplementaryItem 1015 | NSCollectionLayoutBoundarySupplementaryItem 1016 | NSCollectionLayoutDecorationItem 1017 | NSCollectionLayoutAnchor 1018 | UIPopoverController 1019 | UIVideoEditorController 1020 | UITextView 1021 | UISearchController 1022 | UIFocusMovementHint 1023 | MFMessageComposeViewController 1024 | MFMailComposeViewController 1025 | NFCReaderSession 1026 | NFCNDEFReaderSession 1027 | NFCVASCommandConfiguration 1028 | NFCVASResponse 1029 | NFCVASReaderSession 1030 | NFCNDEFPayload 1031 | NFCNDEFMessage 1032 | NFCTagCommandConfiguration 1033 | HMEvent 1034 | HMCameraStream 1035 | HMLocationEvent 1036 | HMMutableLocationEvent 1037 | HMCameraSettingsControl 1038 | HMAccessoryProfile 1039 | HMHomeAccessControl 1040 | HMNumberRange 1041 | HMAccessControl 1042 | HMCameraSource 1043 | HMEventTrigger 1044 | HMCameraAudioControl 1045 | HMCharacteristicEvent 1046 | HMMutableCharacteristicEvent 1047 | HMAccessoryCategory 1048 | HMRoom 1049 | HMServiceGroup 1050 | HMAction 1051 | HMZone 1052 | HMNetworkConfigurationProfile 1053 | HMAccessoryBrowser 1054 | HMService 1055 | HMCharacteristicWriteAction 1056 | HMDurationEvent 1057 | HMMutableDurationEvent 1058 | HMPresenceEvent 1059 | HMMutablePresenceEvent 1060 | HMActionSet 1061 | HMCharacteristicThresholdRangeEvent 1062 | HMMutableCharacteristicThresholdRangeEvent 1063 | HMTimeEvent 1064 | HMAccessory 1065 | HMCharacteristicMetadata 1066 | HMAddAccessoryRequest 1067 | HMCameraSnapshotControl 1068 | HMAccessoryOwnershipToken 1069 | HMAccessorySetupPayload 1070 | HMUser 1071 | HMCameraProfile 1072 | HMHome 1073 | HMCharacteristic 1074 | HMCameraSnapshot 1075 | HMSignificantTimeEvent 1076 | HMMutableSignificantTimeEvent 1077 | HMCameraControl 1078 | HMCameraView 1079 | HMCameraStreamControl 1080 | HMTimerTrigger 1081 | HMCalendarEvent 1082 | HMMutableCalendarEvent 1083 | HMHomeManager 1084 | HMTrigger 1085 | NKIssue 1086 | NSURLConnection 1087 | NKAssetDownload 1088 | NKLibrary 1089 | NLTokenizer 1090 | NLLanguageRecognizer 1091 | NLGazetteer 1092 | NLTagger 1093 | NLModel 1094 | NLModelConfiguration 1095 | NLEmbedding 1096 | MTKMeshBufferAllocator 1097 | MTKMeshBuffer 1098 | MTKSubmesh 1099 | MTKMesh 1100 | MTKView 1101 | MTKTextureLoader 1102 | PDFAnnotation 1103 | PDFActionResetForm 1104 | PDFAction 1105 | PDFActionRemoteGoTo 1106 | PDFActionGoTo 1107 | PDFAppearanceCharacteristics 1108 | PDFDestination 1109 | PDFActionNamed 1110 | PDFActionURL 1111 | PDFThumbnailView 1112 | PDFBorder 1113 | PDFView 1114 | PDFPage 1115 | PDFDocument 1116 | PDFSelection 1117 | PDFOutline 1118 | AVAudioMix 1119 | AVMutableAudioMix 1120 | AVAudioMixInputParameters 1121 | AVMutableAudioMixInputParameters 1122 | AVAssetCache 1123 | AVCaptureAudioDataOutput 1124 | AVAssetTrackGroup 1125 | AVCaptureInput 1126 | AVCaptureInputPort 1127 | AVCaptureDeviceInput 1128 | AVCaptureScreenInput 1129 | AVCaptureMetadataInput 1130 | AVAssetDownloadTask 1131 | AVAggregateAssetDownloadTask 1132 | AVAssetDownloadURLSession 1133 | AVCaptureVideoPreviewLayer 1134 | AVSampleBufferDisplayLayer 1135 | AVAssetWriterInput 1136 | AVAssetWriterInputPassDescription 1137 | AVAssetWriterInputPixelBufferAdaptor 1138 | AVAssetWriterInputMetadataAdaptor 1139 | AVAssetWriter 1140 | AVAssetWriterInputGroup 1141 | AVMovieTrack 1142 | AVMutableMovieTrack 1143 | AVFragmentedMovieTrack 1144 | AVCaptureMetadataOutput 1145 | AVVideoCompositionRenderContext 1146 | AVVideoCompositionRenderHint 1147 | AVAsynchronousVideoCompositionRequest 1148 | AVAsynchronousCIImageFilteringRequest 1149 | AVMetadataGroup 1150 | AVTimedMetadataGroup 1151 | AVMutableTimedMetadataGroup 1152 | AVDateRangeMetadataGroup 1153 | AVMutableDateRangeMetadataGroup 1154 | AVPortraitEffectsMatte 1155 | AVAssetImageGenerator 1156 | AVComposition 1157 | AVMutableComposition 1158 | AVSampleBufferRenderSynchronizer 1159 | AVMediaSelection 1160 | AVMutableMediaSelection 1161 | AVAssetTrackSegment 1162 | AVTextStyleRule 1163 | AVCaptureDataOutputSynchronizer 1164 | AVCaptureSynchronizedDataCollection 1165 | AVCaptureSynchronizedData 1166 | AVCaptureSynchronizedSampleBufferData 1167 | AVCaptureSynchronizedMetadataObjectData 1168 | AVCaptureSynchronizedDepthData 1169 | AVAsset 1170 | AVURLAsset 1171 | AVFragmentedAsset 1172 | AVFragmentedAssetMinder 1173 | AVVideoComposition 1174 | AVMutableVideoComposition 1175 | AVVideoCompositionInstruction 1176 | AVMutableVideoCompositionInstruction 1177 | AVVideoCompositionLayerInstruction 1178 | AVMutableVideoCompositionLayerInstruction 1179 | AVVideoCompositionCoreAnimationTool 1180 | AVAssetReaderOutput 1181 | AVAssetReaderTrackOutput 1182 | AVAssetReaderAudioMixOutput 1183 | AVAssetReaderVideoCompositionOutput 1184 | AVAssetReaderOutputMetadataAdaptor 1185 | AVAssetReaderSampleReferenceOutput 1186 | AVSemanticSegmentationMatte 1187 | AVCompositionTrackSegment 1188 | AVContentKeySession 1189 | AVContentKeyRequest 1190 | AVPersistableContentKeyRequest 1191 | AVContentKeyResponse 1192 | AVCaptureVideoDataOutput 1193 | AVPlayer 1194 | AVQueuePlayer 1195 | AVCaptureSession 1196 | AVCaptureMultiCamSession 1197 | AVCaptureConnection 1198 | AVCaptureAudioChannel 1199 | AVCaptureAudioPreviewOutput 1200 | AVPlayerItemMediaDataCollector 1201 | AVPlayerItemMetadataCollector 1202 | AVCaptureStillImageOutput 1203 | AVCaptureBracketedStillImageSettings 1204 | AVCaptureManualExposureBracketedStillImageSettings 1205 | AVCaptureAutoExposureBracketedStillImageSettings 1206 | AVCaptureOutput 1207 | AVPlayerLooper 1208 | AVCameraCalibrationData 1209 | AVPlayerLayer 1210 | AVSampleBufferAudioRenderer 1211 | AVOutputSettingsAssistant 1212 | AVCaptureSystemPressureState 1213 | AVCaptureDepthDataOutput 1214 | AVDisplayCriteria 1215 | AVCapturePhotoOutput 1216 | AVCapturePhotoSettings 1217 | AVCapturePhotoBracketSettings 1218 | AVCaptureResolvedPhotoSettings 1219 | AVCapturePhoto 1220 | AVAssetReader 1221 | AVMetadataObject 1222 | AVMetadataBodyObject 1223 | AVMetadataHumanBodyObject 1224 | AVMetadataCatBodyObject 1225 | AVMetadataDogBodyObject 1226 | AVMetadataSalientObject 1227 | AVMetadataFaceObject 1228 | AVMetadataMachineReadableCodeObject 1229 | AVMovie 1230 | AVMutableMovie 1231 | AVMediaDataStorage 1232 | AVFragmentedMovie 1233 | AVFragmentedMovieMinder 1234 | AVAssetExportSession 1235 | AVRouteDetector 1236 | AVAssetTrack 1237 | AVFragmentedAssetTrack 1238 | AVPlayerItemOutput 1239 | AVPlayerItemVideoOutput 1240 | AVPlayerItemLegibleOutput 1241 | AVPlayerItemMetadataOutput 1242 | AVAssetDownloadStorageManager 1243 | AVAssetDownloadStorageManagementPolicy 1244 | AVMutableAssetDownloadStorageManagementPolicy 1245 | AVMetadataItem 1246 | AVMutableMetadataItem 1247 | AVMetadataItemValueRequest 1248 | AVMetadataItemFilter 1249 | AVCaptureDevice 1250 | AVCaptureDeviceDiscoverySession 1251 | AVFrameRateRange 1252 | AVCaptureDeviceFormat 1253 | AVCaptureDeviceInputSource 1254 | AVSynchronizedLayer 1255 | AVPlayerItem 1256 | AVPlayerItemAccessLog 1257 | AVPlayerItemErrorLog 1258 | AVPlayerItemAccessLogEvent 1259 | AVPlayerItemErrorLogEvent 1260 | AVAssetResourceLoader 1261 | AVAssetResourceLoadingRequestor 1262 | AVAssetResourceLoadingRequest 1263 | AVAssetResourceRenewalRequest 1264 | AVAssetResourceLoadingContentInformationRequest 1265 | AVAssetResourceLoadingDataRequest 1266 | AVCompositionTrack 1267 | AVMutableCompositionTrack 1268 | AVCompositionTrackFormatDescriptionReplacement 1269 | AVPlayerItemTrack 1270 | AVPlayerMediaSelectionCriteria 1271 | AVDepthData 1272 | AVCaptureFileOutput 1273 | AVCaptureMovieFileOutput 1274 | AVCaptureAudioFileOutput 1275 | AVAudioUnitSampler 1276 | AVAudioEngine 1277 | AVAudioUnitGenerator 1278 | AVAudioTime 1279 | AVAudioUnitMIDIInstrument 1280 | AVAudioUnitEffect 1281 | AVAudioUnitComponent 1282 | AVAudioUnitComponentManager 1283 | AVAudioSequencer 1284 | AVMusicTrack 1285 | AVMIDIPlayer 1286 | AVAudioSession 1287 | AVAudioSessionChannelDescription 1288 | AVAudioSessionPortDescription 1289 | AVAudioSessionRouteDescription 1290 | AVAudioSessionDataSourceDescription 1291 | AVAudioSourceNode 1292 | AVSpeechSynthesisVoice 1293 | AVSpeechUtterance 1294 | AVSpeechSynthesizer 1295 | AVAudioFile 1296 | AVAudioChannelLayout 1297 | AVAudioUnitDelay 1298 | AVAudioEnvironmentDistanceAttenuationParameters 1299 | AVAudioEnvironmentReverbParameters 1300 | AVAudioEnvironmentNode 1301 | AVAudioPlayer 1302 | AVAudioSinkNode 1303 | AVAudioConnectionPoint 1304 | AVAudioNode 1305 | AVAudioUnit 1306 | AVAudioBuffer 1307 | AVAudioPCMBuffer 1308 | AVAudioCompressedBuffer 1309 | AVAudioIONode 1310 | AVAudioInputNode 1311 | AVAudioOutputNode 1312 | AVAudioPlayerNode 1313 | AVAudioRecorder 1314 | AVAudioConverter 1315 | AVAudioUnitDistortion 1316 | AVAudioUnitTimePitch 1317 | AVAudioUnitEQFilterParameters 1318 | AVAudioUnitEQ 1319 | AVAudioMixingDestination 1320 | AVAudioMixerNode 1321 | AVAudioFormat 1322 | AVAudioUnitVarispeed 1323 | AVAudioUnitReverb 1324 | AVAudioUnitTimeEffect 1325 | DCDevice 1326 | BGTaskRequest 1327 | BGAppRefreshTaskRequest 1328 | BGProcessingTaskRequest 1329 | BGTask 1330 | BGProcessingTask 1331 | BGAppRefreshTask 1332 | BGTaskScheduler 1333 | CBManager 1334 | CBPeer 1335 | CBUUID 1336 | CBCentral 1337 | CBDescriptor 1338 | CBMutableDescriptor 1339 | CBService 1340 | CBMutableService 1341 | CBCentralManager 1342 | CBATTRequest 1343 | CBPeripheralManager 1344 | CBAttribute 1345 | CBCharacteristic 1346 | CBMutableCharacteristic 1347 | CBPeripheral 1348 | CNGroup 1349 | CNContactFormatter 1350 | CNPhoneNumber 1351 | CNChangeHistoryFetchRequest 1352 | CNContactStore 1353 | CNContact 1354 | CNChangeHistoryEvent 1355 | CNChangeHistoryDropEverythingEvent 1356 | CNChangeHistoryAddContactEvent 1357 | CNChangeHistoryUpdateContactEvent 1358 | CNChangeHistoryDeleteContactEvent 1359 | CNChangeHistoryAddGroupEvent 1360 | CNChangeHistoryUpdateGroupEvent 1361 | CNChangeHistoryDeleteGroupEvent 1362 | CNChangeHistoryAddMemberToGroupEvent 1363 | CNChangeHistoryRemoveMemberFromGroupEvent 1364 | CNChangeHistoryAddSubgroupToGroupEvent 1365 | CNChangeHistoryRemoveSubgroupFromGroupEvent 1366 | CNContactRelation 1367 | CNMutablePostalAddress 1368 | CNContainer 1369 | CNSocialProfile 1370 | CNLabeledValue 1371 | CNPostalAddressFormatter 1372 | CNInstantMessageAddress 1373 | CNContactsUserDefaults 1374 | CNFetchRequest 1375 | CNContactProperty 1376 | CNPostalAddress 1377 | CNMutableGroup 1378 | CNFetchResult 1379 | CNContactVCardSerialization 1380 | CNContactFetchRequest 1381 | CNMutableContact 1382 | CNSaveRequest 1383 | CPRouteChoice 1384 | CPTrip 1385 | CPVoiceControlState 1386 | CPVoiceControlTemplate 1387 | CPManeuver 1388 | CPMapButton 1389 | CPTripPreviewTextConfiguration 1390 | CPListSection 1391 | CPInterfaceController 1392 | CPGridButton 1393 | CPMapTemplate 1394 | CPNavigationSession 1395 | CPAlertTemplate 1396 | CPWindow 1397 | CPSearchTemplate 1398 | CPGridTemplate 1399 | CPSessionConfiguration 1400 | CPTemplate 1401 | CPNavigationAlert 1402 | CPImageSet 1403 | CPActionSheetTemplate 1404 | CPTemplateApplicationScene 1405 | CPTravelEstimates 1406 | CPListItem 1407 | CPListTemplate 1408 | CPAlertAction 1409 | CPBarButton 1410 | PHEditingExtensionContext 1411 | PHLivePhotoView 1412 | RPBroadcastConfiguration 1413 | RPBroadcastActivityViewController 1414 | RPBroadcastController 1415 | RPSystemBroadcastPickerView 1416 | RPBroadcastHandler 1417 | RPBroadcastSampleHandler 1418 | RPPreviewViewController 1419 | RPScreenRecorder 1420 | IOSurface 1421 | SKAudioNode 1422 | SKAction 1423 | SKAttribute 1424 | SKAttributeValue 1425 | SKRenderer 1426 | SKVideoNode 1427 | SKScene 1428 | SKRange 1429 | SKConstraint 1430 | SKEmitterNode 1431 | SKReferenceNode 1432 | SKShader 1433 | SKLightNode 1434 | SKShapeNode 1435 | SKReachConstraints 1436 | SKTextureAtlas 1437 | SKCameraNode 1438 | SKWarpGeometry 1439 | SKWarpGeometryGrid 1440 | SKMutableTexture 1441 | SKKeyframeSequence 1442 | SKPhysicsContact 1443 | SKPhysicsWorld 1444 | SKView 1445 | SKSpriteNode 1446 | SKNode 1447 | NSEvent 1448 | SKTransformNode 1449 | SKFieldNode 1450 | SKRegion 1451 | SKTexture 1452 | SKTileSet 1453 | SKTileGroup 1454 | SKTileGroupRule 1455 | SKTileMapNode 1456 | SKCropNode 1457 | SKLabelNode 1458 | SKPhysicsJoint 1459 | SKPhysicsJointPin 1460 | SKPhysicsJointSpring 1461 | SKPhysicsJointFixed 1462 | SKPhysicsJointSliding 1463 | SKPhysicsJointLimit 1464 | SKEffectNode 1465 | SKTransition 1466 | SKTileDefinition 1467 | SKPhysicsBody 1468 | SKUniform 1469 | INUIAddVoiceShortcutViewController 1470 | INUIEditVoiceShortcutViewController 1471 | INImage 1472 | INUIAddVoiceShortcutButton 1473 | QLFileThumbnailRequest 1474 | QLThumbnailGenerator 1475 | QLThumbnailRepresentation 1476 | QLThumbnailGenerationRequest 1477 | QLThumbnailReply 1478 | QLThumbnailProvider 1479 | BCChatButton 1480 | BCChatAction 1481 | INRestaurantReservationBooking 1482 | INGetAvailableRestaurantReservationBookingDefaultsIntentResponse 1483 | INCancelRideIntentResponse 1484 | INCallRecordTypeOptionsResolutionResult 1485 | INDoubleResolutionResult 1486 | INMediaSearch 1487 | INMediaDestination 1488 | INMessageAttributeResolutionResult 1489 | INRelevantShortcut 1490 | INSaveProfileInCarIntentResponse 1491 | INSetSeatSettingsInCarIntent 1492 | INGetCarPowerLevelStatusIntentResponse 1493 | INSendRideFeedbackIntentResponse 1494 | INSearchForMessagesIntent 1495 | INSetDefrosterSettingsInCarIntentResponse 1496 | INStartCallIntent 1497 | INAddMediaIntent 1498 | INStartAudioCallIntent 1499 | INSetClimateSettingsInCarIntentResponse 1500 | INSetAudioSourceInCarIntentResponse 1501 | INTicketedEvent 1502 | INMediaAffinityTypeResolutionResult 1503 | INGetUserCurrentRestaurantReservationBookingsIntentResponse 1504 | INPaymentMethod 1505 | INSetRadioStationIntentResponse 1506 | INPaymentRecord 1507 | INPlayMediaPlaybackSpeedResolutionResult 1508 | INTaskList 1509 | INStartAudioCallIntentResponse 1510 | INRideDriver 1511 | INRequestPaymentPayerResolutionResult 1512 | INEndWorkoutIntent 1513 | INCarSeatResolutionResult 1514 | INSearchCallHistoryIntent 1515 | INLodgingReservation 1516 | INMessage 1517 | INGetVisualCodeIntentResponse 1518 | INShortcut 1519 | INRequestPaymentCurrencyAmountResolutionResult 1520 | INMassResolutionResult 1521 | INPlaybackQueueLocationResolutionResult 1522 | INAppendToNoteIntentResponse 1523 | INSetRadioStationIntent 1524 | INDefaultCardTemplate 1525 | INSpeakableStringResolutionResult 1526 | INGetCarPowerLevelStatusIntent 1527 | INResumeWorkoutIntent 1528 | INVoiceShortcut 1529 | INVocabulary 1530 | INUserContext 1531 | INRelevantShortcutStore 1532 | INAccountTypeResolutionResult 1533 | INListRideOptionsIntent 1534 | INBillDetails 1535 | INTemperatureResolutionResult 1536 | INSaveProfileInCarIntent 1537 | INBookRestaurantReservationIntent 1538 | INMediaUserContext 1539 | INRestaurantGuestDisplayPreferences 1540 | INDateSearchTypeResolutionResult 1541 | INTransferMoneyIntent 1542 | INStartCallIntentResponse 1543 | INMediaDestinationResolutionResult 1544 | INTaskPriorityResolutionResult 1545 | INBalanceAmount 1546 | INSearchForMessagesIntentResponse 1547 | INDeleteTasksIntent 1548 | INRidePartySizeOption 1549 | INCallRecord 1550 | INSetDefrosterSettingsInCarIntent 1551 | INTrainTrip 1552 | INPlayMediaIntent 1553 | INStartPhotoPlaybackIntent 1554 | INGetCarLockStatusIntentResponse 1555 | INPlayMediaIntentResponse 1556 | CLPlacemark 1557 | INCarAudioSourceResolutionResult 1558 | INPaymentAmount 1559 | INCancelWorkoutIntentResponse 1560 | INSetClimateSettingsInCarIntent 1561 | INCarAirCirculationModeResolutionResult 1562 | INRequestPaymentIntentResponse 1563 | INCarSignalOptionsResolutionResult 1564 | INSendMessageRecipientResolutionResult 1565 | INFlight 1566 | INSetProfileInCarIntent 1567 | INRideFareLineItem 1568 | INGetRestaurantGuestIntent 1569 | INRelativeSettingResolutionResult 1570 | INCreateTaskListIntent 1571 | INUpdateMediaAffinityMediaItemResolutionResult 1572 | INDeleteTasksIntentResponse 1573 | INSendPaymentIntent 1574 | INRideStatus 1575 | INIntentResponse 1576 | INGetVisualCodeIntent 1577 | INImageNoteContent 1578 | INSendPaymentCurrencyAmountResolutionResult 1579 | INAirport 1580 | INGetCarLockStatusIntent 1581 | INCallDestinationTypeResolutionResult 1582 | INRequestRideIntentResponse 1583 | INNote 1584 | INGetReservationDetailsIntentResponse 1585 | INPayBillIntentResponse 1586 | INPersonHandle 1587 | INSearchForMediaMediaItemResolutionResult 1588 | INSendRideFeedbackIntent 1589 | INStartCallContactResolutionResult 1590 | INRentalCar 1591 | INSearchForBillsIntentResponse 1592 | INSetTaskAttributeTemporalEventTriggerResolutionResult 1593 | INSetAudioSourceInCarIntent 1594 | INLocationSearchTypeResolutionResult 1595 | INExtension 1596 | INCreateNoteIntent 1597 | INGetReservationDetailsIntent 1598 | INCancelWorkoutIntent 1599 | INDeleteTasksTaskResolutionResult 1600 | INMediaItem 1601 | INPerson 1602 | INSetTaskAttributeIntent 1603 | INTemporalEventTriggerResolutionResult 1604 | INSetTaskAttributeIntentResponse 1605 | INAddTasksIntent 1606 | INAddTasksIntentResponse 1607 | INResumeWorkoutIntentResponse 1608 | INNotebookItemTypeResolutionResult 1609 | INPaymentAccount 1610 | INBillTypeResolutionResult 1611 | INListRideOptionsIntentResponse 1612 | INSearchCallHistoryIntentResponse 1613 | INCallRecordTypeResolutionResult 1614 | INSendPaymentIntentResponse 1615 | INSearchForMediaIntentResponse 1616 | INSnoozeTasksIntent 1617 | INRentalCarReservation 1618 | INSnoozeTasksIntentResponse 1619 | INBalanceTypeResolutionResult 1620 | INLengthResolutionResult 1621 | INURLResolutionResult 1622 | INActivateCarSignalIntentResponse 1623 | INSetSeatSettingsInCarIntentResponse 1624 | INGetAvailableRestaurantReservationBookingDefaultsIntent 1625 | INBillPayee 1626 | INRecurrenceRule 1627 | INStartVideoCallIntent 1628 | INDateComponentsRange 1629 | INSearchForPhotosIntent 1630 | INGetUserCurrentRestaurantReservationBookingsIntent 1631 | INActivateCarSignalIntent 1632 | INReservation 1633 | INMessageAttributeOptionsResolutionResult 1634 | INWorkoutGoalUnitTypeResolutionResult 1635 | INNoteContent 1636 | INBookRestaurantReservationIntentResponse 1637 | INSearchForBillsIntent 1638 | INAddTasksTargetTaskListResolutionResult 1639 | INGetRideStatusIntent 1640 | INIntentResolutionResult 1641 | INTemporalEventTriggerTypeOptionsResolutionResult 1642 | INSendMessageIntent 1643 | INCancelRideIntent 1644 | INPriceRange 1645 | INEnumResolutionResult 1646 | INNoteContentResolutionResult 1647 | INSearchForAccountsIntentResponse 1648 | INRestaurantReservation 1649 | INVolumeResolutionResult 1650 | INPaymentAmountResolutionResult 1651 | INPaymentAccountResolutionResult 1652 | INAirportGate 1653 | INRadioTypeResolutionResult 1654 | INPauseWorkoutIntentResponse 1655 | INStartWorkoutIntentResponse 1656 | INTermsAndConditions 1657 | INRequestRideIntent 1658 | INPauseWorkoutIntent 1659 | INTemporalEventTrigger 1660 | INBooleanResolutionResult 1661 | INTaskListResolutionResult 1662 | INWorkoutLocationTypeResolutionResult 1663 | INTimeIntervalResolutionResult 1664 | INGetRideStatusIntentResponse 1665 | INPersonResolutionResult 1666 | INEnergyResolutionResult 1667 | INPaymentStatusResolutionResult 1668 | INAddMediaMediaItemResolutionResult 1669 | INSetProfileInCarIntentResponse 1670 | INRestaurantOffer 1671 | INSendMessageIntentResponse 1672 | INRestaurant 1673 | INObjectResolutionResult 1674 | INTransferMoneyIntentResponse 1675 | INFileResolutionResult 1676 | INRideVehicle 1677 | INRideCompletionStatus 1678 | INIntent 1679 | INCurrencyAmount 1680 | INSearchForNotebookItemsIntentResponse 1681 | INTask 1682 | INSearchForNotebookItemsIntent 1683 | INSetCarLockStatusIntentResponse 1684 | INPlacemarkResolutionResult 1685 | INFlightReservation 1686 | INSearchForAccountsIntent 1687 | INDateComponentsRangeResolutionResult 1688 | INAddMediaMediaDestinationResolutionResult 1689 | INRequestPaymentIntent 1690 | INSendPaymentPayeeResolutionResult 1691 | INStartCallCallCapabilityResolutionResult 1692 | INSpeakableString 1693 | INCreateTaskListIntentResponse 1694 | INAirline 1695 | INPlayMediaMediaItemResolutionResult 1696 | INSpeedResolutionResult 1697 | INGetAvailableRestaurantReservationBookingsIntentResponse 1698 | INSetMessageAttributeIntent 1699 | INRestaurantGuestResolutionResult 1700 | INVisualCodeTypeResolutionResult 1701 | INCurrencyAmountResolutionResult 1702 | INEndWorkoutIntentResponse 1703 | INCreateNoteIntentResponse 1704 | INDeleteTasksTaskListResolutionResult 1705 | INSearchForPhotosIntentResponse 1706 | INTaskResolutionResult 1707 | INTaskStatusResolutionResult 1708 | INSpatialEventTrigger 1709 | INAddMediaIntentResponse 1710 | INStringResolutionResult 1711 | INGetRestaurantGuestIntentResponse 1712 | INObject 1713 | INUpcomingMediaManager 1714 | INGetAvailableRestaurantReservationBookingsIntent 1715 | INRestaurantReservationUserBooking 1716 | INSpatialEventTriggerResolutionResult 1717 | INMediaItemResolutionResult 1718 | INNoteContentTypeResolutionResult 1719 | INUpdateMediaAffinityIntentResponse 1720 | INSearchForMediaIntent 1721 | INAppendToNoteIntent 1722 | INSeat 1723 | INRelativeReferenceResolutionResult 1724 | INAddTasksTemporalEventTriggerResolutionResult 1725 | INPlaybackRepeatModeResolutionResult 1726 | INSetMessageAttributeIntentResponse 1727 | INIntegerResolutionResult 1728 | INStartPhotoPlaybackIntentResponse 1729 | INPaymentMethodResolutionResult 1730 | INRelevanceProvider 1731 | INDateRelevanceProvider 1732 | INLocationRelevanceProvider 1733 | INDailyRoutineRelevanceProvider 1734 | INCallCapabilityResolutionResult 1735 | INUpdateMediaAffinityIntent 1736 | INInteraction 1737 | INRestaurantResolutionResult 1738 | INParameter 1739 | INSetCarLockStatusIntent 1740 | INTextNoteContent 1741 | INBillPayeeResolutionResult 1742 | INSnoozeTasksTaskResolutionResult 1743 | INTrainReservation 1744 | INRestaurantGuest 1745 | INStartWorkoutIntent 1746 | INTicketedEventReservation 1747 | INCarDefrosterResolutionResult 1748 | INDateComponentsResolutionResult 1749 | INReservationAction 1750 | INVoiceShortcutCenter 1751 | INNoteResolutionResult 1752 | INStartVideoCallIntentResponse 1753 | INPayBillIntent 1754 | INRideOption 1755 | INPreferences 1756 | INFile 1757 | VSAccountMetadataRequest 1758 | VSSubscription 1759 | VSSubscriptionRegistrationCenter 1760 | VSAccountManager 1761 | VSAccountManagerResult 1762 | VSAccountProviderResponse 1763 | VSAccountMetadata 1764 | PKInkingTool 1765 | PKToolPicker 1766 | PKEraserTool 1767 | PKLassoTool 1768 | PKTool 1769 | PKCanvasView 1770 | PKDrawing 1771 | HKQuantity 1772 | HKSeriesBuilder 1773 | HKHealthStore 1774 | HKHeartbeatSeriesSample 1775 | HKObject 1776 | HKUnit 1777 | HKQueryAnchor 1778 | HKAudiogramSample 1779 | HKAudiogramSensitivityPoint 1780 | HKSourceRevision 1781 | HKCumulativeQuantitySample 1782 | HKStatisticsQuery 1783 | HKQuery 1784 | HKClinicalRecord 1785 | HKCumulativeQuantitySeriesSample 1786 | HKSampleQuery 1787 | HKCategorySample 1788 | HKSample 1789 | HKBiologicalSexObject 1790 | HKBloodTypeObject 1791 | HKFitzpatrickSkinTypeObject 1792 | HKWheelchairUseObject 1793 | HKLiveWorkoutDataSource 1794 | HKCDADocumentSample 1795 | HKCDADocument 1796 | HKCorrelation 1797 | HKAnchoredObjectQuery 1798 | HKDiscreteQuantitySample 1799 | HKActivitySummary 1800 | HKLiveWorkoutBuilder 1801 | HKObserverQuery 1802 | HKSourceQuery 1803 | HKWorkoutBuilder 1804 | HKDocumentSample 1805 | HKQuantitySample 1806 | HKSeriesSample 1807 | HKDevice 1808 | HKWorkoutSession 1809 | HKWorkoutRouteBuilder 1810 | HKHeartbeatSeriesQuery 1811 | HKQuantitySeriesSampleBuilder 1812 | HKCorrelationQuery 1813 | HKFHIRResource 1814 | HKDeletedObject 1815 | HKStatistics 1816 | HKWorkoutRoute 1817 | HKSource 1818 | HKWorkoutConfiguration 1819 | HKObjectType 1820 | HKCharacteristicType 1821 | HKSampleType 1822 | HKCategoryType 1823 | HKCorrelationType 1824 | HKDocumentType 1825 | HKQuantityType 1826 | HKWorkoutType 1827 | HKSeriesType 1828 | HKActivitySummaryType 1829 | HKAudiogramSampleType 1830 | HKClinicalType 1831 | HKDocumentQuery 1832 | HKWorkoutRouteQuery 1833 | HKWorkoutEvent 1834 | HKWorkout 1835 | HKStatisticsCollection 1836 | HKStatisticsCollectionQuery 1837 | HKHeartbeatSeriesBuilder 1838 | HKQuantitySeriesSampleQuery 1839 | HKActivitySummaryQuery 1840 | MCNearbyServiceBrowser 1841 | MCSession 1842 | MCBrowserViewController 1843 | MCNearbyServiceAdvertiser 1844 | MCPeerID 1845 | MCAdvertiserAssistant 1846 | WKWebpagePreferences 1847 | WKContentRuleListStore 1848 | WKNavigationAction 1849 | WKWebView 1850 | WKHTTPCookieStore 1851 | WKUserContentController 1852 | WKScriptMessage 1853 | WKNavigation 1854 | WKSecurityOrigin 1855 | WKBackForwardList 1856 | WKContentRuleList 1857 | WKWindowFeatures 1858 | WKFrameInfo 1859 | WKNavigationResponse 1860 | WKPreferences 1861 | WKWebsiteDataRecord 1862 | WKOpenPanelParameters 1863 | WKProcessPool 1864 | WKWebViewConfiguration 1865 | WKBackForwardListItem 1866 | WKWebsiteDataStore 1867 | WKUserScript 1868 | WKSnapshotConfiguration 1869 | WKContextMenuElementInfo 1870 | WKPreviewElementInfo 1871 | NCWidgetController 1872 | GCExtendedGamepadSnapshot 1873 | GCControllerButtonInput 1874 | GCGamepad 1875 | GCEventViewController 1876 | GCExtendedGamepad 1877 | GCGamepadSnapshot 1878 | GCControllerAxisInput 1879 | GCControllerDirectionPad 1880 | GCMicroGamepadSnapshot 1881 | GCController 1882 | GCControllerElement 1883 | GCMotion 1884 | GCMicroGamepad 1885 | CTCallCenter 1886 | CTTelephonyNetworkInfo 1887 | CTCellularData 1888 | CTCellularPlanProvisioningRequest 1889 | CTSubscriberInfo 1890 | CTSubscriber 1891 | CTCall 1892 | CTCarrier 1893 | CTCellularPlanProvisioning 1894 | ALAssetRepresentation 1895 | ALAssetsGroup 1896 | ALAsset 1897 | ALAssetsLibrary 1898 | ALAssetsFilter 1899 | NSFileProviderExtension 1900 | NSFileProviderDomain 1901 | NSFileProviderRequest 1902 | NSError 1903 | NSFileProviderManager 1904 | NSFileProviderItemVersion 1905 | NSFileProviderSearchQuery 1906 | SLComposeSheetConfigurationItem 1907 | SLComposeServiceViewController 1908 | SLComposeViewController 1909 | SLRequest 1910 | ILCommunication 1911 | ILCallCommunication 1912 | ILMessageFilterQueryResponse 1913 | ILCallClassificationRequest 1914 | ILNetworkResponse 1915 | ILMessageCommunication 1916 | ILMessageClassificationRequest 1917 | ILMessageFilterQueryRequest 1918 | ILClassificationRequest 1919 | ILMessageFilterExtension 1920 | ILMessageFilterExtensionContext 1921 | ILClassificationResponse 1922 | CIContext 1923 | CIRenderDestination 1924 | CIRenderInfo 1925 | CIRenderTask 1926 | CIFeature 1927 | CIFaceFeature 1928 | CIRectangleFeature 1929 | CIQRCodeFeature 1930 | CITextFeature 1931 | CIFilter 1932 | CIImageAccumulator 1933 | CIVector 1934 | CIFilterShape 1935 | CIBarcodeDescriptor 1936 | CIQRCodeDescriptor 1937 | CIAztecCodeDescriptor 1938 | CIDataMatrixCodeDescriptor 1939 | CIColor 1940 | CIKernel 1941 | CIColorKernel 1942 | CIWarpKernel 1943 | CIBlendKernel 1944 | CISampler 1945 | CIImageProcessorKernel 1946 | CIDetector 1947 | CIImage 1948 | CABTMIDILocalPeripheralViewController 1949 | AUViewController 1950 | AUAudioUnitViewConfiguration 1951 | AUAudioUnit 1952 | CAInterAppAudioTransportView 1953 | CAInterAppAudioSwitcherView 1954 | CABTMIDICentralViewController 1955 | CLSScoreItem 1956 | CLSObject 1957 | CLSContext 1958 | CLSDataStore 1959 | CLSActivityItem 1960 | CLSBinaryItem 1961 | CLSActivity 1962 | CLSQuantityItem 1963 | VNDocumentCameraScan 1964 | VNDocumentCameraViewController 1965 | MDLSubmeshTopology 1966 | MDLSubmesh 1967 | MDLTransform 1968 | MDLAnimatedValue 1969 | MDLAnimatedScalarArray 1970 | MDLAnimatedQuaternionArray 1971 | MDLAnimatedScalar 1972 | MDLAnimatedQuaternion 1973 | MDLRelativeAssetResolver 1974 | MDLPathAssetResolver 1975 | MDLBundleAssetResolver 1976 | MDLMeshBufferMap 1977 | MDLMeshBufferData 1978 | MDLMeshBufferDataAllocator 1979 | MDLMeshBufferZoneDefault 1980 | MDLVertexAttributeData 1981 | MDLMesh 1982 | MDLAsset 1983 | MDLObject 1984 | MDLObjectContainer 1985 | MDLCamera 1986 | MDLStereoscopicCamera 1987 | MDLLight 1988 | MDLPhysicallyPlausibleLight 1989 | MDLAreaLight 1990 | MDLPhotometricLight 1991 | MDLLightProbe 1992 | MDLTextureFilter 1993 | MDLTextureSampler 1994 | MDLMaterialProperty 1995 | MDLMaterialPropertyConnection 1996 | MDLMaterialPropertyNode 1997 | MDLMaterialPropertyGraph 1998 | MDLScatteringFunction 1999 | MDLPhysicallyPlausibleScatteringFunction 2000 | MDLMaterial 2001 | MDLSkeleton 2002 | MDLPackedJointAnimation 2003 | MDLAnimationBindComponent 2004 | MDLVoxelArray 2005 | MDLTransformRotateXOp 2006 | MDLTransformRotateYOp 2007 | MDLTransformRotateZOp 2008 | MDLTransformRotateOp 2009 | MDLTransformTranslateOp 2010 | MDLTransformScaleOp 2011 | MDLTransformMatrixOp 2012 | MDLTransformOrientOp 2013 | MDLTransformStack 2014 | MDLVertexBufferLayout 2015 | MDLVertexAttribute 2016 | MDLVertexDescriptor 2017 | MDLTexture 2018 | MDLURLTexture 2019 | MDLCheckerboardTexture 2020 | MDLSkyCubeTexture 2021 | MDLColorSwatchTexture 2022 | MDLNoiseTexture 2023 | MDLNormalMapTexture 2024 | EAGLContext 2025 | EAGLSharegroup 2026 | ACAccountCredential 2027 | ACAccountType 2028 | ACAccount 2029 | ACAccountStore 2030 | FPUIActionExtensionViewController 2031 | FPUIActionExtensionContext 2032 | NSURL 2033 | QLPreviewController 2034 | ASAuthorizationOpenIDRequest 2035 | ASCredentialServiceIdentifier 2036 | ASAuthorizationProviderExtensionAuthorizationRequest 2037 | ASCredentialProviderExtensionContext 2038 | ASAuthorization 2039 | ASCredentialIdentityStore 2040 | ASAuthorizationAppleIDButton 2041 | ASAuthorizationRequest 2042 | ASAuthorizationAppleIDCredential 2043 | ASCredentialProviderViewController 2044 | ASAuthorizationController 2045 | ASAuthorizationAppleIDProvider 2046 | ASWebAuthenticationSession 2047 | ASAuthorizationSingleSignOnProvider 2048 | ASAuthorizationAppleIDRequest 2049 | ASCredentialIdentityStoreState 2050 | ASWebAuthenticationSessionWebBrowserSessionManager 2051 | ASWebAuthenticationSessionRequest 2052 | ASAuthorizationPasswordRequest 2053 | ASAuthorizationSingleSignOnCredential 2054 | ASAuthorizationPasswordProvider 2055 | ASAuthorizationSingleSignOnRequest 2056 | ASPasswordCredentialIdentity 2057 | ASPasswordCredential 2058 | AUAudioUnitBus 2059 | AUAudioUnitBusArray 2060 | AUParameterTree 2061 | AUParameterNode 2062 | AUAudioUnitPreset 2063 | AUParameterGroup 2064 | AUParameter 2065 | CNContactViewController 2066 | CNContactPickerViewController 2067 | CSSearchableItemAttributeSet 2068 | CSSearchableIndex 2069 | CSPerson 2070 | CSSearchableItem 2071 | CSSearchQuery 2072 | CSLocalizedString 2073 | CSCustomAttributeKey 2074 | CSIndexExtensionRequestHandler 2075 | LAContext 2076 | NSPredicate 2077 | NSArray 2078 | NSMutableArray 2079 | NSSet 2080 | NSMutableSet 2081 | NSOrderedSet 2082 | NSMutableOrderedSet 2083 | NSLocale 2084 | NSLock 2085 | NSConditionLock 2086 | NSRecursiveLock 2087 | NSCondition 2088 | NSFileVersion 2089 | NSExtensionItem 2090 | NSURLQueryItem 2091 | NSURLComponents 2092 | NSCharacterSet 2093 | NSFileSecurity 2094 | NSMutableData 2095 | NSPurgeableData 2096 | NSDecimalNumber 2097 | NSDecimalNumberHandler 2098 | NSNumber 2099 | NSScanner 2100 | NSHTTPCookieStorage 2101 | NSOrthography 2102 | NSPointerFunctions 2103 | NSException 2104 | NSAssertionHandler 2105 | NSURLSession 2106 | NSURLSessionTask 2107 | NSURLSessionDataTask 2108 | NSURLSessionUploadTask 2109 | NSURLSessionDownloadTask 2110 | NSURLSessionStreamTask 2111 | NSURLSessionWebSocketMessage 2112 | NSURLSessionWebSocketTask 2113 | NSURLSessionConfiguration 2114 | NSURLSessionTaskTransactionMetrics 2115 | NSURLSessionTaskMetrics 2116 | NSDate 2117 | NSOperation 2118 | NSBlockOperation 2119 | NSInvocationOperation 2120 | NSOperationQueue 2121 | NSURLProtectionSpace 2122 | NSNetService 2123 | NSNetServiceBrowser 2124 | NSURLRequest 2125 | NSMutableURLRequest 2126 | NSExpression 2127 | NSNotification 2128 | NSNotificationCenter 2129 | NSUnitConverter 2130 | NSUnitConverterLinear 2131 | NSUnit 2132 | NSDimension 2133 | NSUnitAcceleration 2134 | NSUnitAngle 2135 | NSUnitArea 2136 | NSUnitConcentrationMass 2137 | NSUnitDispersion 2138 | NSUnitDuration 2139 | NSUnitElectricCharge 2140 | NSUnitElectricCurrent 2141 | NSUnitElectricPotentialDifference 2142 | NSUnitElectricResistance 2143 | NSUnitEnergy 2144 | NSUnitFrequency 2145 | NSUnitFuelEfficiency 2146 | NSUnitInformationStorage 2147 | NSUnitLength 2148 | NSUnitIlluminance 2149 | NSUnitMass 2150 | NSUnitPower 2151 | NSUnitPressure 2152 | NSUnitSpeed 2153 | NSUnitTemperature 2154 | NSUnitVolume 2155 | NSDictionary 2156 | NSMutableDictionary 2157 | NSMethodSignature 2158 | NSByteCountFormatter 2159 | NSAutoreleasePool 2160 | NSLengthFormatter 2161 | NSMapTable 2162 | NSComparisonPredicate 2163 | NSFileWrapper 2164 | NSDateIntervalFormatter 2165 | NSTimer 2166 | NSCachedURLResponse 2167 | NSURLCache 2168 | NSURLResponse 2169 | NSHTTPURLResponse 2170 | NSDateComponentsFormatter 2171 | NSMutableCharacterSet 2172 | NSDateFormatter 2173 | NSTextCheckingResult 2174 | NSHTTPCookie 2175 | NSStream 2176 | NSInputStream 2177 | NSOutputStream 2178 | NSProxy 2179 | NSDateInterval 2180 | NSPort 2181 | NSMachPort 2182 | NSMessagePort 2183 | NSSocketPort 2184 | NSURLProtocol 2185 | NSCountedSet 2186 | NSFileManager 2187 | NSDirectoryEnumerator 2188 | NSFileProviderService 2189 | NSMeasurementFormatter 2190 | NSPersonNameComponentsFormatter 2191 | NSBundle 2192 | NSBundleResourceRequest 2193 | NSMutableIndexSet 2194 | NSUUID 2195 | NSUbiquitousKeyValueStore 2196 | NSNotificationQueue 2197 | NSRunLoop 2198 | NSURLCredential 2199 | NSFileAccessIntent 2200 | NSFileCoordinator 2201 | NSTimeZone 2202 | NSOrderedCollectionChange 2203 | NSCache 2204 | NSFormatter 2205 | NSEnumerator 2206 | NSThread 2207 | NSValueTransformer 2208 | NSSecureUnarchiveFromDataTransformer 2209 | NSProgress 2210 | NSLinguisticTagger 2211 | NSXPCConnection 2212 | NSXPCListener 2213 | NSXPCInterface 2214 | NSXPCListenerEndpoint 2215 | NSXPCCoder 2216 | NSUserDefaults 2217 | NSCompoundPredicate 2218 | NSInvocation 2219 | NSJSONSerialization 2220 | NSEnergyFormatter 2221 | NSCalendar 2222 | NSDateComponents 2223 | NSMassFormatter 2224 | NSListFormatter 2225 | NSOrderedCollectionDifference 2226 | NSPointerArray 2227 | NSMutableString 2228 | NSSimpleCString 2229 | NSConstantString 2230 | NSFileHandle 2231 | NSPipe 2232 | NSSortDescriptor 2233 | NSMetadataQuery 2234 | NSMetadataItem 2235 | NSMetadataQueryAttributeValueTuple 2236 | NSMetadataQueryResultGroup 2237 | NSURLAuthenticationChallenge 2238 | NSUndoManager 2239 | NSProcessInfo 2240 | NSRegularExpression 2241 | NSDataDetector 2242 | NSRelativeDateTimeFormatter 2243 | NSKeyedArchiver 2244 | NSKeyedUnarchiver 2245 | NSXMLParser 2246 | NSURLCredentialStorage 2247 | NSMeasurement 2248 | NSPersonNameComponents 2249 | NSHashTable 2250 | NSNumberFormatter 2251 | NSPropertyListSerialization 2252 | ASIdentifierManager 2253 | HKActivityRingView 2254 | PKPushCredentials 2255 | PKPushPayload 2256 | PKPushRegistry 2257 | VNDetectFaceCaptureQualityRequest 2258 | VNClassifyImageRequest 2259 | VNFaceLandmarkRegion 2260 | VNFaceLandmarks 2261 | VNCoreMLModel 2262 | VNCoreMLRequest 2263 | VNTrackingRequest 2264 | VNDetectTextRectanglesRequest 2265 | VNDetectFaceLandmarksRequest 2266 | VNRecognizeAnimalsRequest 2267 | VNGenerateAttentionBasedSaliencyImageRequest 2268 | VNImageRequestHandler 2269 | VNSequenceRequestHandler 2270 | VNGenerateObjectnessBasedSaliencyImageRequest 2271 | VNDetectHorizonRequest 2272 | VNDetectRectanglesRequest 2273 | VNRequest 2274 | VNImageBasedRequest 2275 | VNImageRegistrationRequest 2276 | VNTranslationalImageRegistrationRequest 2277 | VNHomographicImageRegistrationRequest 2278 | VNDetectFaceRectanglesRequest 2279 | VNObservation 2280 | VNDetectedObjectObservation 2281 | VNFaceObservation 2282 | VNClassificationObservation 2283 | VNRecognizedObjectObservation 2284 | VNCoreMLFeatureValueObservation 2285 | VNPixelBufferObservation 2286 | VNRectangleObservation 2287 | VNTextObservation 2288 | VNRecognizedText 2289 | VNRecognizedTextObservation 2290 | VNBarcodeObservation 2291 | VNHorizonObservation 2292 | VNImageAlignmentObservation 2293 | VNImageTranslationAlignmentObservation 2294 | VNImageHomographicAlignmentObservation 2295 | VNSaliencyImageObservation 2296 | VNFeaturePrintObservation 2297 | VNTrackObjectRequest 2298 | VNGenerateImageFeaturePrintRequest 2299 | VNDetectHumanRectanglesRequest 2300 | VNDetectBarcodesRequest 2301 | VNTargetedImageRequest 2302 | VNTrackRectangleRequest 2303 | VNRecognizeTextRequest 2304 | NWEndpoint 2305 | NEVPNProtocolIPSec 2306 | NEFilterSettings 2307 | NEDNSProxyProvider 2308 | NETunnelProviderSession 2309 | NEVPNManager 2310 | NEFilterDataProvider 2311 | NEFilterDataVerdict 2312 | NEFilterRemediationVerdict 2313 | NEDNSSettings 2314 | NWTCPConnection 2315 | NETransparentProxyManager 2316 | NEAppRule 2317 | NWTLSParameters 2318 | NEFilterProviderConfiguration 2319 | NWPath 2320 | NEDNSProxyProviderProtocol 2321 | NEOnDemandRule 2322 | NEOnDemandRuleConnect 2323 | NEOnDemandRuleDisconnect 2324 | NEOnDemandRuleIgnore 2325 | NEOnDemandRuleEvaluateConnection 2326 | NEEvaluateConnectionRule 2327 | NEPacketTunnelNetworkSettings 2328 | NEHotspotNetwork 2329 | NEHotspotHelperCommand 2330 | NEHotspotHelperResponse 2331 | NEHotspotHelper 2332 | NETunnelProviderProtocol 2333 | NEPacketTunnelProvider 2334 | NEAppProxyProviderManager 2335 | NEVPNProtocol 2336 | NEAppProxyTCPFlow 2337 | NENetworkRule 2338 | NEProxyServer 2339 | NEProxySettings 2340 | NEAppProxyFlow 2341 | NEAppProxyUDPFlow 2342 | NETunnelNetworkSettings 2343 | NEAppProxyProvider 2344 | NEDNSProxyManager 2345 | NEFilterProvider 2346 | NEFilterVerdict 2347 | NEFilterNewFlowVerdict 2348 | NEFilterControlVerdict 2349 | NEFilterReport 2350 | NEPacketTunnelFlow 2351 | NEFilterManager 2352 | NEVPNConnection 2353 | NEPacket 2354 | NEFilterControlProvider 2355 | NETransparentProxyNetworkSettings 2356 | NEFilterRule 2357 | NETunnelProvider 2358 | NWBonjourServiceEndpoint 2359 | NWUDPSession 2360 | NETunnelProviderManager 2361 | NEFilterFlow 2362 | NEFilterBrowserFlow 2363 | NEFilterSocketFlow 2364 | NEFilterPacketContext 2365 | NEFilterPacketProvider 2366 | NEHotspotEAPSettings 2367 | NEHotspotConfiguration 2368 | NEHotspotConfigurationManager 2369 | NEFlowMetaData 2370 | NWHostEndpoint 2371 | NEProvider 2372 | EKCalendar 2373 | EKStructuredLocation 2374 | EKRecurrenceDayOfWeek 2375 | EKRecurrenceEnd 2376 | EKEventStore 2377 | EKObject 2378 | EKReminder 2379 | EKRecurrenceRule 2380 | EKEvent 2381 | EKAlarm 2382 | EKSource 2383 | EKParticipant 2384 | EKCalendarItem 2385 | AVPlayerViewController 2386 | ADBannerView 2387 | ADInterstitialAd 2388 | ADInterstitialAdPresentationViewController 2389 | ADClient 2390 | MKGeodesicPolyline 2391 | MKPolygon 2392 | MKMapCamera 2393 | MKLocalSearch 2394 | MKCircleRenderer 2395 | MKPolyline 2396 | MKUserTrackingButton 2397 | MKGeoJSONDecoder 2398 | MKGeoJSONFeature 2399 | MKPointAnnotation 2400 | MKMultiPoint 2401 | MKMultiPolyline 2402 | MKMultiPolygon 2403 | MKPolylineRenderer 2404 | MKReverseGeocoder 2405 | MKPolygonRenderer 2406 | MKOverlayPathView 2407 | MKCircleView 2408 | MKAnnotationView 2409 | MKMapCameraZoomRange 2410 | MKDistanceFormatter 2411 | MKPlacemark 2412 | MKCircle 2413 | MKMapSnapshotOptions 2414 | MKMapSnapshotter 2415 | MKPinAnnotationView 2416 | MKScaleView 2417 | MKPolygonView 2418 | MKOverlayRenderer 2419 | MKDirectionsResponse 2420 | MKRoute 2421 | MKRouteStep 2422 | MKETAResponse 2423 | MKTileOverlayRenderer 2424 | MKMultiPolygonRenderer 2425 | MKUserLocation 2426 | MKLocalSearchCompleter 2427 | MKLocalSearchCompletion 2428 | MKLocalSearchRequest 2429 | MKLocalSearchResponse 2430 | MKMultiPolylineRenderer 2431 | MKUserTrackingBarButtonItem 2432 | MKTileOverlay 2433 | MKDirectionsRequest 2434 | MKMarkerAnnotationView 2435 | MKPointOfInterestFilter 2436 | MKMapItem 2437 | MKMapView 2438 | MKPolylineView 2439 | MKClusterAnnotation 2440 | MKOverlayView 2441 | MKMapCameraBoundary 2442 | MKShape 2443 | MKOverlayPathRenderer 2444 | MKDirections 2445 | MKCompassButton 2446 | MKMapSnapshot 2447 | CHHapticPattern 2448 | CHHapticEvent 2449 | CHHapticEngine 2450 | CHHapticEventParameter 2451 | CHHapticDynamicParameter 2452 | CHHapticParameterCurveControlPoint 2453 | CHHapticParameterCurve 2454 | CXCallObserver 2455 | CXProvider 2456 | CXCall 2457 | CXCallController 2458 | CXEndCallAction 2459 | CXCallDirectoryExtensionContext 2460 | CXAction 2461 | CXSetMutedCallAction 2462 | CXPlayDTMFCallAction 2463 | CXAnswerCallAction 2464 | CXCallAction 2465 | CXSetHeldCallAction 2466 | CXSetGroupCallAction 2467 | CXHandle 2468 | CXTransaction 2469 | CXCallDirectoryManager 2470 | CXCallDirectoryProvider 2471 | CXStartCallAction 2472 | CXProviderConfiguration 2473 | CXCallUpdate 2474 | CMRecordedAccelerometerData 2475 | CMSensorDataList 2476 | CMSensorRecorder 2477 | CMMotionActivityManager 2478 | CMMotionManager 2479 | CMGyroData 2480 | CMDyskineticSymptomResult 2481 | CMTremorResult 2482 | CMMovementDisorderManager 2483 | CMAltitudeData 2484 | CMStepCounter 2485 | CMDeviceMotion 2486 | CMAltimeter 2487 | CMAccelerometerData 2488 | CMLogItem 2489 | CMAttitude 2490 | CMMagnetometerData 2491 | CMMotionActivity 2492 | CMPedometerData 2493 | CMPedometerEvent 2494 | CMPedometer 2495 | AVRoutePickerView 2496 | AVPictureInPictureController 2497 | SNClassification 2498 | SNClassificationResult 2499 | SNClassifySoundRequest 2500 | SNAudioStreamAnalyzer 2501 | SNAudioFileAnalyzer 2502 | CLFloor 2503 | CLLocation 2504 | CLBeaconRegion 2505 | CLBeacon 2506 | CLBeaconIdentityConstraint 2507 | CLGeocoder 2508 | CLLocationManager 2509 | CLVisit 2510 | CLHeading 2511 | CLRegion 2512 | CLCircularRegion 2513 | CKDatabase 2514 | CKFetchSubscriptionsOperation 2515 | CKDiscoverUserIdentitiesOperation 2516 | CKDiscoverUserInfosOperation 2517 | CKNotificationID 2518 | CKNotification 2519 | CKQueryNotification 2520 | CKRecordZoneNotification 2521 | CKDatabaseNotification 2522 | CKServerChangeToken 2523 | CKModifyRecordZonesOperation 2524 | CKQuery 2525 | CKFetchNotificationChangesOperation 2526 | CKFetchShareMetadataOperation 2527 | CKMarkNotificationsReadOperation 2528 | CKReference 2529 | CKShareParticipant 2530 | CKOperation 2531 | CKOperationConfiguration 2532 | CKFetchDatabaseChangesOperation 2533 | CKFetchRecordChangesOperation 2534 | CKRecordZoneID 2535 | CKFetchRecordsOperation 2536 | CKModifyRecordsOperation 2537 | CKDiscoveredUserInfo 2538 | CKDatabaseOperation 2539 | CKRecordZone 2540 | CKFetchShareParticipantsOperation 2541 | CKRecordID 2542 | CKOperationGroup 2543 | CKFetchWebAuthTokenOperation 2544 | CKFetchRecordZonesOperation 2545 | CKShare 2546 | CKLocationSortDescriptor 2547 | CKQueryCursor 2548 | CKQueryOperation 2549 | CKDiscoverAllContactsOperation 2550 | CKSubscription 2551 | CKQuerySubscription 2552 | CKRecordZoneSubscription 2553 | CKDatabaseSubscription 2554 | CKNotificationInfo 2555 | CKAcceptSharesOperation 2556 | CKModifySubscriptionsOperation 2557 | CKShareMetadata 2558 | CKRecord 2559 | CKAsset 2560 | CKContainer 2561 | CKUserIdentityLookupInfo 2562 | CKUserIdentity 2563 | CKModifyBadgeOperation 2564 | CKDiscoverAllUserIdentitiesOperation 2565 | CKFetchRecordZoneChangesOperation 2566 | CKFetchRecordZoneChangesConfiguration 2567 | CKFetchRecordZoneChangesOptions 2568 | PHCloudIdentifier 2569 | PHPhotoLibrary 2570 | PHFetchResult 2571 | PHChange 2572 | PHObjectChangeDetails 2573 | PHFetchResultChangeDetails 2574 | PHCollectionListChangeRequest 2575 | PHObject 2576 | PHObjectPlaceholder 2577 | PHAssetResource 2578 | PHAssetChangeRequest 2579 | PHContentEditingInputRequestOptions 2580 | PHAsset 2581 | PHContentEditingOutput 2582 | PHLivePhoto 2583 | PHAssetResourceRequestOptions 2584 | PHAssetResourceManager 2585 | PHFetchOptions 2586 | PHImageRequestOptions 2587 | PHLivePhotoRequestOptions 2588 | PHVideoRequestOptions 2589 | PHImageManager 2590 | PHCachingImageManager 2591 | PHChangeRequest 2592 | PHContentEditingInput 2593 | PHProject 2594 | PHAdjustmentData 2595 | PHCollection 2596 | PHAssetCollection 2597 | PHCollectionList 2598 | PHLivePhotoEditingContext 2599 | PHAssetResourceCreationOptions 2600 | PHAssetCreationRequest 2601 | PHProjectChangeRequest 2602 | PHAssetCollectionChangeRequest 2603 | JSVirtualMachine 2604 | JSContext 2605 | JSValue 2606 | JSManagedValue 2607 | GKRandomDistribution 2608 | GKGaussianDistribution 2609 | GKShuffledDistribution 2610 | GKState 2611 | GKNoiseSource 2612 | GKCoherentNoiseSource 2613 | GKPerlinNoiseSource 2614 | GKBillowNoiseSource 2615 | GKRidgedNoiseSource 2616 | GKVoronoiNoiseSource 2617 | GKConstantNoiseSource 2618 | GKCylindersNoiseSource 2619 | GKSpheresNoiseSource 2620 | GKCheckerboardNoiseSource 2621 | GKStateMachine 2622 | GKRuleSystem 2623 | GKRule 2624 | GKNSPredicateRule 2625 | GKScene 2626 | GKSCNNodeComponent 2627 | GKObstacleGraph 2628 | GKDecisionNode 2629 | GKDecisionTree 2630 | GKMonteCarloStrategist 2631 | GKGoal 2632 | GKBehavior 2633 | GKAgent 2634 | SCNNode 2635 | SCNScene 2636 | GKOctreeNode 2637 | GKOctree 2638 | GKMinmaxStrategist 2639 | GKGraphNode 2640 | GKGridGraphNode 2641 | GKGridGraph 2642 | GKRandomSource 2643 | GKLinearCongruentialRandomSource 2644 | GKMersenneTwisterRandomSource 2645 | GKGraph 2646 | GKSKNodeComponent 2647 | GKMeshGraph 2648 | GKRTree 2649 | GKComponent 2650 | GKComponentSystem 2651 | GKPath 2652 | GKNoiseMap 2653 | GKNoise 2654 | GKObstacle 2655 | GKCircleObstacle 2656 | GKPolygonObstacle 2657 | GKSphereObstacle 2658 | GKEntity 2659 | GKQuadtreeNode 2660 | GKQuadtree 2661 | GKCompositeBehavior 2662 | @interface MIDIDriverInterface 2663 | MIDINetworkHost 2664 | MIDINetworkConnection 2665 | MIDINetworkSession 2666 | MIDICIProfile 2667 | MIDICIProfileState 2668 | MIDICISession 2669 | TWRequest 2670 | TWTweetComposeViewController 2671 | PKDisbursementRequest 2672 | PKPaymentButton 2673 | PKContact 2674 | PKPaymentAuthorizationResult 2675 | PKPaymentRequestUpdate 2676 | PKPaymentRequestShippingContactUpdate 2677 | PKPaymentRequestShippingMethodUpdate 2678 | PKPaymentRequestPaymentMethodUpdate 2679 | PKPassLibrary 2680 | PKAddPassButton 2681 | PKLabeledValue 2682 | PKObject 2683 | PKAddPassesViewController 2684 | PKDisbursementVoucher 2685 | PKSuicaPassProperties 2686 | PKPaymentToken 2687 | PKPaymentAuthorizationController 2688 | PKPaymentPass 2689 | PKDisbursementAuthorizationController 2690 | PKPaymentSummaryItem 2691 | PKShippingMethod 2692 | PKPaymentRequest 2693 | PKPaymentAuthorizationViewController 2694 | PKPayment 2695 | PKTransitPassProperties 2696 | PKPaymentMethod 2697 | PKAddPaymentPassRequestConfiguration 2698 | PKAddPaymentPassRequest 2699 | PKAddPaymentPassViewController 2700 | PKPass 2701 | ICCameraFile 2702 | ICCameraDevice 2703 | ICCameraItem 2704 | ICScannerBandData 2705 | ICScannerDevice 2706 | ICScannerFeature 2707 | ICScannerFeatureEnumeration 2708 | ICScannerFeatureRange 2709 | ICScannerFeatureBoolean 2710 | ICScannerFeatureTemplate 2711 | ICScannerFunctionalUnit 2712 | ICScannerFunctionalUnitFlatbed 2713 | ICScannerFunctionalUnitPositiveTransparency 2714 | ICScannerFunctionalUnitNegativeTransparency 2715 | ICScannerFunctionalUnitDocumentFeeder 2716 | ICDeviceBrowser 2717 | ICDevice 2718 | ICCameraFolder 2719 | NSPersistentHistoryTransaction 2720 | NSFetchIndexDescription 2721 | NSEntityMigrationPolicy 2722 | NSExpressionDescription 2723 | NSFetchIndexElementDescription 2724 | NSAttributeDescription 2725 | NSPersistentHistoryToken 2726 | NSPersistentHistoryChangeRequest 2727 | NSPropertyDescription 2728 | NSManagedObject 2729 | NSManagedObjectID 2730 | NSFetchRequest 2731 | NSAsynchronousFetchRequest 2732 | NSRelationshipDescription 2733 | NSBatchInsertRequest 2734 | NSIncrementalStore 2735 | NSQueryGenerationToken 2736 | NSPersistentCloudKitContainerOptions 2737 | NSCoreDataCoreSpotlightDelegate 2738 | NSAtomicStoreCacheNode 2739 | NSPersistentHistoryChange 2740 | NSBatchDeleteRequest 2741 | NSPersistentStoreResult 2742 | NSPersistentStoreAsynchronousResult 2743 | NSAsynchronousFetchResult 2744 | NSBatchInsertResult 2745 | NSBatchUpdateResult 2746 | NSBatchDeleteResult 2747 | NSPersistentHistoryResult 2748 | NSPersistentStoreCoordinator 2749 | NSPersistentStore 2750 | NSMigrationManager 2751 | NSAtomicStore 2752 | NSFetchedResultsController 2753 | NSPersistentStoreDescription 2754 | NSFetchRequestExpression 2755 | NSEntityDescription 2756 | NSSaveChangesRequest 2757 | NSPersistentStoreRequest 2758 | NSIncrementalStoreNode 2759 | NSEntityMapping 2760 | NSFetchedPropertyDescription 2761 | NSManagedObjectModel 2762 | NSMergeConflict 2763 | NSConstraintConflict 2764 | NSMergePolicy 2765 | NSBatchUpdateRequest 2766 | NSPersistentContainer 2767 | NSManagedObjectContext 2768 | NSMappingModel 2769 | NSDerivedAttributeDescription 2770 | NSPersistentCloudKitContainer 2771 | NSPropertyMapping 2772 | GLKEffectPropertyLight 2773 | GLKView 2774 | GLKEffectProperty 2775 | GLKEffectPropertyTransform 2776 | GLKBaseEffect 2777 | GLKEffectPropertyTexture 2778 | GLKEffectPropertyMaterial 2779 | GLKEffectPropertyFog 2780 | GLKViewController 2781 | GLKTextureInfo 2782 | GLKTextureLoader 2783 | GLKSkyboxEffect 2784 | GLKMeshBufferAllocator 2785 | GLKMeshBuffer 2786 | GLKSubmesh 2787 | GLKMesh 2788 | GLKReflectionMapEffect 2789 | MSMessageLiveLayout 2790 | MSMessage 2791 | MSStickerView 2792 | MSMessageTemplateLayout 2793 | MSMessageLayout 2794 | MSSticker 2795 | MSStickerBrowserView 2796 | MSConversation 2797 | MSStickerBrowserViewController 2798 | MSSession 2799 | MSMessagesAppViewController 2800 | TKTokenSmartCardPINAuthOperation 2801 | TKSmartCardTokenSession 2802 | TKSmartCardToken 2803 | TKSmartCardTokenDriver 2804 | TKTokenWatcher 2805 | TKTokenKeychainItem 2806 | TKTokenKeychainCertificate 2807 | TKTokenKeychainKey 2808 | TKTokenKeychainContents 2809 | TKTokenDriverConfiguration 2810 | TKTokenConfiguration 2811 | TKTokenKeyAlgorithm 2812 | TKTokenKeyExchangeParameters 2813 | TKTokenSession 2814 | TKToken 2815 | TKTokenDriver 2816 | TKTokenAuthOperation 2817 | TKTokenPasswordAuthOperation 2818 | TKSmartCardSlotManager 2819 | TKSmartCardPINFormat 2820 | TKSmartCardUserInteraction 2821 | TKSmartCardUserInteractionForPINOperation 2822 | TKSmartCardUserInteractionForSecurePINVerification 2823 | TKSmartCardUserInteractionForSecurePINChange 2824 | TKSmartCardSlot 2825 | TKSmartCard 2826 | TKSmartCardATRInterfaceGroup 2827 | TKSmartCardATR 2828 | TKTLVRecord 2829 | TKBERTLVRecord 2830 | TKSimpleTLVRecord 2831 | TKCompactTLVRecord 2832 | UNNotificationServiceExtension 2833 | UNUserNotificationCenter 2834 | UNNotificationCategory 2835 | UNNotification 2836 | UNNotificationRequest 2837 | UNNotificationTrigger 2838 | UNPushNotificationTrigger 2839 | UNTimeIntervalNotificationTrigger 2840 | UNCalendarNotificationTrigger 2841 | UNLocationNotificationTrigger 2842 | UNNotificationAttachment 2843 | UNNotificationAction 2844 | UNTextInputNotificationAction 2845 | UNNotificationSound 2846 | UNNotificationContent 2847 | UNMutableNotificationContent 2848 | UNTextInputNotificationResponse 2849 | UNNotificationSettings 2850 | EKEventEditViewController 2851 | EKCalendarChooser 2852 | EKEventViewController 2853 | SCNPhysicsWorld 2854 | SCNParticlePropertyController 2855 | SCNParticleSystem 2856 | SCNLight 2857 | SCNCameraController 2858 | SCNAudioSource 2859 | SCNAudioPlayer 2860 | SCNTimingFunction 2861 | SCNAnimation 2862 | SCNAnimationPlayer 2863 | SCNAnimationEvent 2864 | SCNLevelOfDetail 2865 | SCNPhysicsBehavior 2866 | SCNPhysicsHingeJoint 2867 | SCNPhysicsBallSocketJoint 2868 | SCNPhysicsSliderJoint 2869 | SCNPhysicsConeTwistJoint 2870 | SCNPhysicsVehicleWheel 2871 | SCNPhysicsVehicle 2872 | SCNTechnique 2873 | SCNPhysicsBody 2874 | SCNProgram 2875 | SCNGeometry 2876 | SCNGeometrySource 2877 | SCNGeometryElement 2878 | SCNGeometryTessellator 2879 | SCNAction 2880 | SCNTransaction 2881 | SCNPhysicsField 2882 | SCNMaterial 2883 | SCNCamera 2884 | SCNMorpher 2885 | SCNPlane 2886 | SCNBox 2887 | SCNPyramid 2888 | SCNSphere 2889 | SCNCylinder 2890 | SCNCone 2891 | SCNTube 2892 | SCNCapsule 2893 | SCNTorus 2894 | SCNFloor 2895 | SCNText 2896 | SCNShape 2897 | SCNReferenceNode 2898 | SCNPhysicsContact 2899 | SCNMaterialProperty 2900 | SCNPhysicsShape 2901 | SCNHitTestResult 2902 | SCNRenderer 2903 | SCNSkinner 2904 | SCNConstraint 2905 | SCNLookAtConstraint 2906 | SCNBillboardConstraint 2907 | SCNTransformConstraint 2908 | SCNIKConstraint 2909 | SCNDistanceConstraint 2910 | SCNReplicatorConstraint 2911 | SCNAccelerationConstraint 2912 | SCNSliderConstraint 2913 | SCNAvoidOccluderConstraint 2914 | SCNSceneSource 2915 | SCNView --------------------------------------------------------------------------------