├── README.md ├── imux ├── imux-Prefix.pch ├── utils.h ├── mobiledevice.h ├── utils.m └── main.m ├── .gitignore └── imux.xcodeproj └── project.pbxproj /README.md: -------------------------------------------------------------------------------- 1 | imux 2 | ==== 3 | 4 | transfer tcp connection to iDevice through usb cable, using MobileDevice private framework -------------------------------------------------------------------------------- /imux/imux-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'imux' target in the 'imux' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | -------------------------------------------------------------------------------- /imux/utils.h: -------------------------------------------------------------------------------- 1 | // 2 | // utils.h 3 | // imux 4 | // 5 | // Created by Smirnov on 1/4/13. 6 | // Copyright (c) 2013 Borsch Lab. All rights reserved. 7 | // 8 | 9 | #ifndef imux_utils_h 10 | #define imux_utils_h 11 | 12 | #ifdef __cplusplus 13 | extern "C" { 14 | #endif 15 | 16 | int util_start_tcp_server(int port); 17 | int util_accept_connection(int server_socket, void(^handler)(int client_socket)); 18 | void util_tie_in_sockets(int socket1, int socket2); 19 | 20 | 21 | #ifdef __cplusplus 22 | } 23 | #endif 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /imux/mobiledevice.h: -------------------------------------------------------------------------------- 1 | #ifndef MOBILEDEVICE_H_ 2 | #define MOBILEDEVICE_H_ 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | #define ADNCI_MSG_CONNECTED 1 9 | #define ADNCI_MSG_DISCONNECTED 2 10 | #define ADNCI_MSG_UNKNOWN 3 11 | 12 | typedef void* am_device_t; 13 | typedef void* am_device_callbacks_t; 14 | typedef int muxconn_t; 15 | struct am_device_notification_callback_info 16 | { 17 | am_device_t dev; /* 0 device */ 18 | unsigned int msg; /* 4 one of ADNCI_MSG_* */ 19 | }; 20 | typedef void (*am_device_notification_callback_t)(struct am_device_notification_callback_info *); 21 | 22 | CFStringRef AMDeviceCopyDeviceIdentifier(am_device_t device); 23 | 24 | int AMDeviceNotificationSubscribe(am_device_notification_callback_t notificationCallback, int , int, int , am_device_callbacks_t *callbacks); 25 | 26 | int AMDeviceGetInterfaceType(am_device_t device); 27 | 28 | int AMDeviceConnect(am_device_t am_device); 29 | int AMDeviceDisconnect(am_device_t am_device); 30 | 31 | muxconn_t AMDeviceGetConnectionID(am_device_t device); 32 | 33 | int USBMuxConnectByPort(muxconn_t muxConn, short netPort, int* sockHandle); 34 | 35 | #ifdef __cplusplus 36 | } 37 | #endif 38 | 39 | #endif -------------------------------------------------------------------------------- /imux/utils.m: -------------------------------------------------------------------------------- 1 | // 2 | // utils.c 3 | // imux 4 | // 5 | // Created by Smirnov on 1/4/13. 6 | // Copyright (c) 2013 Borsch Lab. All rights reserved. 7 | // 8 | 9 | #include "utils.h" 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | int util_start_tcp_server(int port) { 20 | int server_socket; 21 | struct sockaddr_in server_addr; 22 | 23 | server_socket = socket(AF_INET, SOCK_STREAM, 0); 24 | if (server_socket < 0) 25 | return -1; 26 | 27 | bzero((char *) &server_addr, sizeof(server_addr)); 28 | 29 | server_addr.sin_family = AF_INET; 30 | server_addr.sin_addr.s_addr = INADDR_ANY; 31 | server_addr.sin_port = htons(port); 32 | 33 | if (bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { 34 | close(server_socket); 35 | return -1; 36 | } 37 | 38 | if(listen(server_socket,5) !=0) { 39 | close(server_socket); 40 | return -1; 41 | } 42 | 43 | return server_socket; 44 | } 45 | 46 | int util_accept_connection(int server_socket, void(^handler)(int client_socket)) { 47 | int client_socket; 48 | socklen_t length; 49 | struct sockaddr_in client_addr; 50 | 51 | length = sizeof(client_addr); 52 | client_socket = accept(server_socket, 53 | (struct sockaddr *) &client_addr, 54 | &length); 55 | 56 | if (client_socket < 0) 57 | return -1; 58 | 59 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 60 | handler(client_socket); 61 | close(client_socket); 62 | }); 63 | 64 | return 0; 65 | } 66 | 67 | void util_tie_in_sockets(int socket1, int socket2) { 68 | fd_set read_set; 69 | 70 | struct timeval timeout; 71 | timeout.tv_usec = 0; 72 | timeout.tv_sec = 240; 73 | 74 | const long buffer_size = 1024; 75 | char* buffer = (char*)malloc(buffer_size); 76 | 77 | if(!buffer) 78 | return; 79 | 80 | long(^redirect)(int,int,fd_set*) = ^(int s1, int s2, fd_set* set) { 81 | if(FD_ISSET(s1, set)) { 82 | ssize_t bytes_recvd = recv(s1, buffer, buffer_size, 0); 83 | if(bytes_recvd <= 0) { 84 | return (long)-1; 85 | } 86 | 87 | char* p = buffer; 88 | ssize_t overall_bytes_sent = 0; 89 | 90 | while(overall_bytes_sent != bytes_recvd) { 91 | ssize_t bytes_sent = write(s2, p, bytes_recvd - overall_bytes_sent); 92 | 93 | if(bytes_sent < 0) 94 | return (long) -1; 95 | 96 | overall_bytes_sent += bytes_sent; 97 | p+=bytes_sent; 98 | } 99 | } 100 | return (long)0; 101 | }; 102 | 103 | FD_ZERO(&read_set); 104 | 105 | int activity = 1; 106 | while(activity >=0 || errno != EINTR) { 107 | FD_SET(socket1, &read_set); 108 | FD_SET(socket2, &read_set); 109 | 110 | activity = select(FD_SETSIZE, &read_set, NULL, NULL, &timeout); 111 | 112 | if(activity >= 0) { 113 | 114 | long res = 0; 115 | 116 | res = redirect(socket1,socket2,&read_set); 117 | 118 | if(res != 0) 119 | break; 120 | 121 | res = redirect(socket2,socket1,&read_set); 122 | 123 | if(res != 0) 124 | break; 125 | 126 | } 127 | } 128 | 129 | free(buffer); 130 | } 131 | 132 | -------------------------------------------------------------------------------- /imux/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // imux 4 | // 5 | // Created by Smirnov on 1/4/13. 6 | // Copyright (c) 2013 Borsch Lab. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #include "mobiledevice.h" 12 | #include "utils.h" 13 | 14 | volatile am_device_t target_device = NULL; 15 | 16 | NSString *target_device_id = nil; 17 | 18 | NSString* am_deviceIdentifier(am_device_t device) { 19 | CFStringRef deviceIdentifier = AMDeviceCopyDeviceIdentifier(device); 20 | return [((NSString*)deviceIdentifier) autorelease]; 21 | } 22 | 23 | void am_notification_handler(struct am_device_notification_callback_info * notificationInfo) { 24 | @autoreleasepool { 25 | NSString* deviceIdentifier = am_deviceIdentifier(notificationInfo->dev); 26 | if(notificationInfo->msg == ADNCI_MSG_CONNECTED) { 27 | printf("[%s] connected\n",deviceIdentifier.UTF8String); 28 | if(AMDeviceConnect(notificationInfo->dev)!=0) { 29 | printf("[%s] failed to AMDeviceConnect\n",deviceIdentifier.UTF8String); 30 | return; 31 | } 32 | 33 | int interface_type = AMDeviceGetInterfaceType(notificationInfo->dev); 34 | 35 | if(interface_type != 1) { 36 | printf("[%s] non usb connection, ignoring\n",deviceIdentifier.UTF8String); 37 | return; 38 | } 39 | 40 | if(target_device_id == nil) { 41 | printf("stick with first connected device [%s]\n", [deviceIdentifier cStringUsingEncoding: NSASCIIStringEncoding]); 42 | target_device_id = deviceIdentifier; 43 | } 44 | 45 | if([target_device_id isEqualToString: deviceIdentifier]) { 46 | 47 | 48 | target_device = notificationInfo->dev; 49 | } 50 | } 51 | if(notificationInfo->msg == ADNCI_MSG_DISCONNECTED) { 52 | printf("[%s] disconnected\n", deviceIdentifier.UTF8String); 53 | if(notificationInfo->dev == target_device) { 54 | target_device = NULL; 55 | } 56 | } 57 | } 58 | } 59 | 60 | int main(int argc, const char * argv[]) 61 | { 62 | 63 | @autoreleasepool { 64 | NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 65 | 66 | if(argc < 3) { 67 | fprintf(stderr, "usage: imux []\n"); 68 | exit(1); 69 | } 70 | 71 | uint32_t localport = atoi(argv[1]); 72 | uint32_t remoteport = atoi(argv[2]); 73 | 74 | printf("local port : %u\n",localport); 75 | printf("remote port : %u\n",remoteport); 76 | 77 | if(argc == 4) { 78 | target_device_id = [NSString stringWithCString: argv[3] encoding: NSASCIIStringEncoding]; 79 | 80 | printf("target device : %s\n", argv[3]); 81 | } 82 | 83 | am_device_callbacks_t callbacks; 84 | int result = AMDeviceNotificationSubscribe(am_notification_handler, 0, 0, 0, &callbacks); 85 | 86 | if(result != 0) { 87 | fprintf(stderr,"[-] failed to subscribe to iDevice notifications"); 88 | exit(-1); 89 | } 90 | 91 | int server_socket = util_start_tcp_server(localport); 92 | 93 | if(server_socket <= 0) { 94 | fprintf(stderr,"[-] failed to start local tcp server at port '%d'", localport); 95 | exit(-1); 96 | } 97 | 98 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 99 | while(1) { 100 | util_accept_connection(server_socket, ^(int client_socket) { 101 | am_device_t device = target_device; 102 | int iphone_socket; 103 | if(!device) 104 | return; 105 | printf("[+] Got a local connection\n"); 106 | muxconn_t connection_id = AMDeviceGetConnectionID(device); 107 | int ret = USBMuxConnectByPort(connection_id, htons(remoteport), &iphone_socket); 108 | 109 | if(ret!=0) { 110 | fprintf(stderr,"[-] failed to perform mux connect on device"); 111 | return; 112 | } 113 | printf("[+] Tying local connection with iDevice[%s]\n",[target_device_id cStringUsingEncoding: NSASCIIStringEncoding]); 114 | util_tie_in_sockets(client_socket, iphone_socket); 115 | }); 116 | } 117 | }); 118 | 119 | [runLoop run]; 120 | } 121 | return 0; 122 | } 123 | 124 | -------------------------------------------------------------------------------- /imux.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B209005E169757F70052305F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B209005D169757F70052305F /* Foundation.framework */; }; 11 | B2090061169757F70052305F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B2090060169757F70052305F /* main.m */; }; 12 | B20900741697690F0052305F /* utils.m in Sources */ = {isa = PBXBuildFile; fileRef = B20900731697690F0052305F /* utils.m */; }; 13 | B2FCB75F20495EBC00A0112B /* MobileDevice.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2FCB75E20495EBC00A0112B /* MobileDevice.framework */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXCopyFilesBuildPhase section */ 17 | B2090057169757F70052305F /* CopyFiles */ = { 18 | isa = PBXCopyFilesBuildPhase; 19 | buildActionMask = 2147483647; 20 | dstPath = /usr/share/man/man1/; 21 | dstSubfolderSpec = 0; 22 | files = ( 23 | ); 24 | runOnlyForDeploymentPostprocessing = 1; 25 | }; 26 | /* End PBXCopyFilesBuildPhase section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | B2090059169757F70052305F /* imux */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = imux; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | B209005D169757F70052305F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 31 | B2090060169757F70052305F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32 | B2090063169757F70052305F /* imux-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "imux-Prefix.pch"; sourceTree = ""; }; 33 | B2090070169758950052305F /* MobileDevice.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileDevice.framework; path = /System/Library/PrivateFrameworks/MobileDevice.framework; sourceTree = ""; }; 34 | B2090072169759490052305F /* mobiledevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mobiledevice.h; sourceTree = ""; }; 35 | B20900731697690F0052305F /* utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = utils.m; sourceTree = ""; }; 36 | B2090075169769210052305F /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; 37 | B2FCB75E20495EBC00A0112B /* MobileDevice.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileDevice.framework; path = thirdparty/MobileDevice.framework; sourceTree = ""; }; 38 | /* End PBXFileReference section */ 39 | 40 | /* Begin PBXFrameworksBuildPhase section */ 41 | B2090056169757F70052305F /* Frameworks */ = { 42 | isa = PBXFrameworksBuildPhase; 43 | buildActionMask = 2147483647; 44 | files = ( 45 | B2FCB75F20495EBC00A0112B /* MobileDevice.framework in Frameworks */, 46 | B209005E169757F70052305F /* Foundation.framework in Frameworks */, 47 | ); 48 | runOnlyForDeploymentPostprocessing = 0; 49 | }; 50 | /* End PBXFrameworksBuildPhase section */ 51 | 52 | /* Begin PBXGroup section */ 53 | B209004E169757F70052305F = { 54 | isa = PBXGroup; 55 | children = ( 56 | B209005F169757F70052305F /* imux */, 57 | B209005C169757F70052305F /* Frameworks */, 58 | B209005A169757F70052305F /* Products */, 59 | ); 60 | sourceTree = ""; 61 | }; 62 | B209005A169757F70052305F /* Products */ = { 63 | isa = PBXGroup; 64 | children = ( 65 | B2090059169757F70052305F /* imux */, 66 | ); 67 | name = Products; 68 | sourceTree = ""; 69 | }; 70 | B209005C169757F70052305F /* Frameworks */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | B2090070169758950052305F /* MobileDevice.framework */, 74 | B2FCB75E20495EBC00A0112B /* MobileDevice.framework */, 75 | B209005D169757F70052305F /* Foundation.framework */, 76 | ); 77 | name = Frameworks; 78 | sourceTree = ""; 79 | }; 80 | B209005F169757F70052305F /* imux */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | B2090075169769210052305F /* utils.h */, 84 | B20900731697690F0052305F /* utils.m */, 85 | B2090060169757F70052305F /* main.m */, 86 | B2090062169757F70052305F /* Supporting Files */, 87 | B2090072169759490052305F /* mobiledevice.h */, 88 | ); 89 | path = imux; 90 | sourceTree = ""; 91 | }; 92 | B2090062169757F70052305F /* Supporting Files */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | B2090063169757F70052305F /* imux-Prefix.pch */, 96 | ); 97 | name = "Supporting Files"; 98 | sourceTree = ""; 99 | }; 100 | /* End PBXGroup section */ 101 | 102 | /* Begin PBXNativeTarget section */ 103 | B2090058169757F70052305F /* imux */ = { 104 | isa = PBXNativeTarget; 105 | buildConfigurationList = B2090068169757F70052305F /* Build configuration list for PBXNativeTarget "imux" */; 106 | buildPhases = ( 107 | B2090055169757F70052305F /* Sources */, 108 | B2090056169757F70052305F /* Frameworks */, 109 | B2090057169757F70052305F /* CopyFiles */, 110 | ); 111 | buildRules = ( 112 | ); 113 | dependencies = ( 114 | ); 115 | name = imux; 116 | productName = imux; 117 | productReference = B2090059169757F70052305F /* imux */; 118 | productType = "com.apple.product-type.tool"; 119 | }; 120 | /* End PBXNativeTarget section */ 121 | 122 | /* Begin PBXProject section */ 123 | B2090050169757F70052305F /* Project object */ = { 124 | isa = PBXProject; 125 | attributes = { 126 | LastUpgradeCheck = 0450; 127 | ORGANIZATIONNAME = "Borsch Lab"; 128 | }; 129 | buildConfigurationList = B2090053169757F70052305F /* Build configuration list for PBXProject "imux" */; 130 | compatibilityVersion = "Xcode 3.2"; 131 | developmentRegion = English; 132 | hasScannedForEncodings = 0; 133 | knownRegions = ( 134 | en, 135 | ); 136 | mainGroup = B209004E169757F70052305F; 137 | productRefGroup = B209005A169757F70052305F /* Products */; 138 | projectDirPath = ""; 139 | projectRoot = ""; 140 | targets = ( 141 | B2090058169757F70052305F /* imux */, 142 | ); 143 | }; 144 | /* End PBXProject section */ 145 | 146 | /* Begin PBXSourcesBuildPhase section */ 147 | B2090055169757F70052305F /* Sources */ = { 148 | isa = PBXSourcesBuildPhase; 149 | buildActionMask = 2147483647; 150 | files = ( 151 | B2090061169757F70052305F /* main.m in Sources */, 152 | B20900741697690F0052305F /* utils.m in Sources */, 153 | ); 154 | runOnlyForDeploymentPostprocessing = 0; 155 | }; 156 | /* End PBXSourcesBuildPhase section */ 157 | 158 | /* Begin XCBuildConfiguration section */ 159 | B2090066169757F70052305F /* Debug */ = { 160 | isa = XCBuildConfiguration; 161 | buildSettings = { 162 | ALWAYS_SEARCH_USER_PATHS = NO; 163 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 164 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 165 | CLANG_CXX_LIBRARY = "libc++"; 166 | CLANG_WARN_EMPTY_BODY = YES; 167 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 168 | COPY_PHASE_STRIP = NO; 169 | GCC_C_LANGUAGE_STANDARD = gnu99; 170 | GCC_DYNAMIC_NO_PIC = NO; 171 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 172 | GCC_OPTIMIZATION_LEVEL = 0; 173 | GCC_PREPROCESSOR_DEFINITIONS = ( 174 | "DEBUG=1", 175 | "$(inherited)", 176 | ); 177 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 178 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 179 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 180 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 181 | GCC_WARN_UNUSED_VARIABLE = YES; 182 | MACOSX_DEPLOYMENT_TARGET = 10.7; 183 | ONLY_ACTIVE_ARCH = YES; 184 | SDKROOT = macosx; 185 | }; 186 | name = Debug; 187 | }; 188 | B2090067169757F70052305F /* Release */ = { 189 | isa = XCBuildConfiguration; 190 | buildSettings = { 191 | ALWAYS_SEARCH_USER_PATHS = NO; 192 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 193 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 194 | CLANG_CXX_LIBRARY = "libc++"; 195 | CLANG_WARN_EMPTY_BODY = YES; 196 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 197 | COPY_PHASE_STRIP = YES; 198 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 199 | GCC_C_LANGUAGE_STANDARD = gnu99; 200 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 201 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 202 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 203 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 204 | GCC_WARN_UNUSED_VARIABLE = YES; 205 | MACOSX_DEPLOYMENT_TARGET = 10.7; 206 | SDKROOT = macosx; 207 | }; 208 | name = Release; 209 | }; 210 | B2090069169757F70052305F /* Debug */ = { 211 | isa = XCBuildConfiguration; 212 | buildSettings = { 213 | FRAMEWORK_SEARCH_PATHS = ( 214 | "$(inherited)", 215 | /System/Library/PrivateFrameworks/MobileDevice.framework, 216 | "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", 217 | "$(PROJECT_DIR)/thirdparty", 218 | ); 219 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 220 | GCC_PREFIX_HEADER = "imux/imux-Prefix.pch"; 221 | PRODUCT_NAME = "$(TARGET_NAME)"; 222 | }; 223 | name = Debug; 224 | }; 225 | B209006A169757F70052305F /* Release */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | FRAMEWORK_SEARCH_PATHS = ( 229 | "$(inherited)", 230 | /System/Library/PrivateFrameworks/MobileDevice.framework, 231 | "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", 232 | "$(PROJECT_DIR)/thirdparty", 233 | ); 234 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 235 | GCC_PREFIX_HEADER = "imux/imux-Prefix.pch"; 236 | PRODUCT_NAME = "$(TARGET_NAME)"; 237 | }; 238 | name = Release; 239 | }; 240 | /* End XCBuildConfiguration section */ 241 | 242 | /* Begin XCConfigurationList section */ 243 | B2090053169757F70052305F /* Build configuration list for PBXProject "imux" */ = { 244 | isa = XCConfigurationList; 245 | buildConfigurations = ( 246 | B2090066169757F70052305F /* Debug */, 247 | B2090067169757F70052305F /* Release */, 248 | ); 249 | defaultConfigurationIsVisible = 0; 250 | defaultConfigurationName = Release; 251 | }; 252 | B2090068169757F70052305F /* Build configuration list for PBXNativeTarget "imux" */ = { 253 | isa = XCConfigurationList; 254 | buildConfigurations = ( 255 | B2090069169757F70052305F /* Debug */, 256 | B209006A169757F70052305F /* Release */, 257 | ); 258 | defaultConfigurationIsVisible = 0; 259 | defaultConfigurationName = Release; 260 | }; 261 | /* End XCConfigurationList section */ 262 | }; 263 | rootObject = B2090050169757F70052305F /* Project object */; 264 | } 265 | --------------------------------------------------------------------------------