├── Tracer
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Tracer.entitlements
├── ViewController.swift
├── Info.plist
├── AppDelegate.swift
└── Base.lproj
│ └── Main.storyboard
├── .gitmodules
├── tracerd
├── main.swift
├── tracerd.entitlements
├── Info.plist
├── ESClient.swift
└── IPCConnection.swift
├── LICENSE
└── Tracer.xcodeproj
└── project.pbxproj
/Tracer/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "EndpointSecurity"]
2 | path = EndpointSecurity
3 | url = https://github.com/knightsc/EndpointSecurity.git
4 |
--------------------------------------------------------------------------------
/tracerd/main.swift:
--------------------------------------------------------------------------------
1 | //
2 | // main.swift
3 | // tracerd
4 | //
5 | // Created by Scott Knight on 7/4/19.
6 | // Copyright © 2019 Scott Knight. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | autoreleasepool {
12 | IPCConnection.shared.startListener()
13 | ESClient.shared.connect()
14 | }
15 |
16 | dispatchMain()
17 |
--------------------------------------------------------------------------------
/tracerd/tracerd.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.endpoint-security.client
6 |
7 | com.apple.security.application-groups
8 |
9 | $(TeamIdentifierPrefix)sc.knight.Tracer
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Tracer/Tracer.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.system-extension.install
6 |
7 | com.apple.security.app-sandbox
8 |
9 | com.apple.security.application-groups
10 |
11 | $(TeamIdentifierPrefix)sc.knight.Tracer
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Tracer/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // Tracer
4 | //
5 | // Created by Scott Knight on 7/4/19.
6 | // Copyright © 2019 Scott Knight. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | class ViewController: NSViewController {
12 |
13 | override func viewDidLoad() {
14 | super.viewDidLoad()
15 |
16 | // Do any additional setup after loading the view.
17 | }
18 |
19 | override var representedObject: Any? {
20 | didSet {
21 | // Update the view, if already loaded.
22 | }
23 | }
24 |
25 |
26 | }
27 |
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Scott Knight
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Tracer/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/tracerd/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | tracerd
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | $(MARKETING_VERSION)
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2019 Scott Knight. All rights reserved.
27 | NSSystemExtensionUsageDescription
28 | Endpoint Security system extension
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Tracer/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | $(MARKETING_VERSION)
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2019 Scott Knight. All rights reserved.
27 | NSMainStoryboardFile
28 | Main
29 | NSPrincipalClass
30 | NSApplication
31 | NSSupportsAutomaticTermination
32 |
33 | NSSupportsSuddenTermination
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/tracerd/ESClient.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ESClient.swift
3 | // tracerd
4 | //
5 | // Created by Scott Knight on 7/4/19.
6 | // Copyright © 2019 Scott Knight. All rights reserved.
7 | //
8 |
9 | //import Foundation
10 | import EndpointSecurity
11 | import os.log
12 |
13 | let tracerdESLog = OSLog.init(subsystem: "sc.knight.Tracer.tracerd", category: "EndpointSecurity")
14 |
15 | class ESClient {
16 | var client: OpaquePointer?
17 |
18 | static let shared = ESClient()
19 |
20 | func connect() {
21 | let res = es_new_client(&client) { (client, message) in
22 | if message.pointee.event_type == ES_EVENT_TYPE_NOTIFY_EXEC {
23 | IPCConnection.shared.exec(file: String(cString: (message.pointee.event.exec.target?.pointee.executable?.pointee.path.data)!))
24 | }
25 |
26 | if message.pointee.action_type == ES_ACTION_TYPE_AUTH {
27 | let res = es_respond_auth_result(client, message, ES_AUTH_RESULT_ALLOW, false)
28 | if res != ES_RESPOND_RESULT_SUCCESS {
29 | os_log("es_respond_auth_result failed", log: tracerdESLog, type: .error)
30 | }
31 | }
32 | }
33 |
34 | guard res == ES_NEW_CLIENT_RESULT_SUCCESS else {
35 | fatalError("Could not connect to endpoint security subsystem.")
36 | }
37 |
38 | if let client = client {
39 | os_log("Connected to endpoint security subsystem.", log: tracerdESLog, type: .info)
40 |
41 | var events = [ ES_EVENT_TYPE_NOTIFY_EXEC ]
42 | let ret = es_subscribe(client, &events, UInt32(events.count))
43 | if ret != ES_RETURN_SUCCESS {
44 | os_log("Failed to subscribe", log: tracerdESLog, type: .error)
45 | } else {
46 | os_log("Subscribed", log: tracerdESLog, type: .info)
47 | }
48 | }
49 | }
50 |
51 | func disconnect() {
52 | if let client = client {
53 | es_delete_client(client)
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/Tracer/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Tracer
4 | //
5 | // Created by Scott Knight on 7/4/19.
6 | // Copyright © 2019 Scott Knight. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import SystemExtensions
11 | import os.log
12 |
13 | let tracerLog = OSLog.init(subsystem: "sc.knight.Tracer", category: "Main")
14 |
15 | @NSApplicationMain
16 | class AppDelegate: NSObject, NSApplicationDelegate {
17 | func applicationDidFinishLaunching(_ aNotification: Notification) {
18 | // Insert code here to initialize your application
19 | let activationRequest = OSSystemExtensionRequest.activationRequest(forExtensionWithIdentifier: "sc.knight.Tracer.tracerd", queue: .main)
20 | activationRequest.delegate = self
21 | OSSystemExtensionManager.shared.submitRequest(activationRequest)
22 | }
23 |
24 | func applicationWillTerminate(_ aNotification: Notification) {
25 | // Insert code here to tear down your application
26 | }
27 | }
28 |
29 | extension AppDelegate: OSSystemExtensionRequestDelegate {
30 | func extensionBundle() -> Bundle {
31 |
32 | let extensionsDirectoryURL = URL(fileURLWithPath: "Contents/Library/SystemExtensions", relativeTo: Bundle.main.bundleURL)
33 | let extensionURLs: [URL]
34 | do {
35 | extensionURLs = try FileManager.default.contentsOfDirectory(at: extensionsDirectoryURL,
36 | includingPropertiesForKeys: nil,
37 | options: .skipsHiddenFiles)
38 | } catch let error {
39 | fatalError("Failed to get the contents of \(extensionsDirectoryURL.absoluteString): \(error.localizedDescription)")
40 | }
41 |
42 | guard let extensionURL = extensionURLs.first else {
43 | fatalError("Failed to find any system extensions")
44 | }
45 |
46 | guard let extensionBundle = Bundle(url: extensionURL) else {
47 | fatalError("Failed to create a bundle with URL \(extensionURL.absoluteString)")
48 | }
49 |
50 | return extensionBundle
51 | }
52 |
53 | func request(_ request: OSSystemExtensionRequest, actionForReplacingExtension existing: OSSystemExtensionProperties, withExtension ext: OSSystemExtensionProperties) -> OSSystemExtensionRequest.ReplacementAction {
54 | os_log("sysex actionForReplacingExtension %@ %@", log: tracerLog, type: .info, existing, ext)
55 |
56 | return .replace
57 | }
58 |
59 | func requestNeedsUserApproval(_ request: OSSystemExtensionRequest) {
60 | os_log("sysex needsUserApproval", log: tracerLog, type: .info)
61 |
62 | }
63 |
64 | func request(_ request: OSSystemExtensionRequest, didFinishWithResult result: OSSystemExtensionRequest.Result) {
65 | os_log("sysex didFinishWithResult %@", log: tracerLog, type: .info, result.rawValue)
66 |
67 | guard result == .completed else {
68 | os_log("Unexpected result %d for system extension request", log: tracerLog, type: .error, result.rawValue)
69 | return
70 | }
71 |
72 | registerWithProvider()
73 | }
74 |
75 | func request(_ request: OSSystemExtensionRequest, didFailWithError error: Error) {
76 | os_log("sysex didFailWithError %@", log: tracerLog, type: .error, error.localizedDescription)
77 | }
78 |
79 | func registerWithProvider() {
80 |
81 | IPCConnection.shared.register(withExtension: extensionBundle(), delegate: self) { success in
82 | DispatchQueue.main.async {
83 | if success {
84 | os_log("registered", log: tracerLog, type: .info)
85 | } else {
86 | os_log("failed register", log: tracerLog, type: .error)
87 | }
88 | }
89 | }
90 | }
91 | }
92 |
93 | extension AppDelegate: AppCommunication {
94 |
95 | // MARK: AppCommunication
96 |
97 | func exec(file : String) {
98 | os_log("exec: %s", log: tracerLog, type: .info, file)
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/tracerd/IPCConnection.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IPCConnection.swift
3 | // tracerd
4 | //
5 | // Created by Scott Knight on 7/4/19.
6 | // Copyright © 2019 Scott Knight. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import os.log
11 |
12 | let tracerdIPCLog = OSLog.init(subsystem: "sc.knight.Tracer.tracerd", category: "IPC")
13 |
14 | @objc protocol ProviderCommunication {
15 |
16 | func register(_ completionHandler: @escaping (Bool) -> Void)
17 | }
18 |
19 | /// Provider --> App IPC
20 | @objc protocol AppCommunication {
21 |
22 | func exec(file: String)
23 | }
24 |
25 | class IPCConnection: NSObject {
26 |
27 | // MARK: Properties
28 |
29 | var listener: NSXPCListener?
30 | var currentConnection: NSXPCConnection?
31 | weak var delegate: AppCommunication?
32 | static let shared = IPCConnection()
33 |
34 | // MARK: Methods
35 |
36 | private func extensionMachServiceName(from bundle: Bundle) -> String {
37 |
38 | guard let identifier = bundle.bundleIdentifier else {
39 | fatalError("Bundle identifier is missing from the Info.plist")
40 | }
41 |
42 | return "." + identifier + ".xpc"
43 | }
44 |
45 | func startListener() {
46 |
47 | let machServiceName = extensionMachServiceName(from: Bundle.main)
48 | os_log("Starting XPC listener for mach service %@", log: tracerdIPCLog, type: .info, machServiceName)
49 |
50 | let newListener = NSXPCListener(machServiceName: machServiceName)
51 | newListener.delegate = self
52 | newListener.resume()
53 | listener = newListener
54 | }
55 |
56 | /// This method is called by the app to register with the provider running in the system extension.
57 | func register(withExtension bundle: Bundle, delegate: AppCommunication, completionHandler: @escaping (Bool) -> Void) {
58 |
59 | self.delegate = delegate
60 |
61 | guard currentConnection == nil else {
62 | os_log("Already registered with the provider", log: tracerdIPCLog, type: .error)
63 | completionHandler(true)
64 | return
65 | }
66 |
67 | let machServiceName = extensionMachServiceName(from: bundle)
68 | let newConnection = NSXPCConnection(machServiceName: machServiceName, options: [])
69 |
70 | // The exported object is the delegate.
71 | newConnection.exportedInterface = NSXPCInterface(with: AppCommunication.self)
72 | newConnection.exportedObject = delegate
73 |
74 | // The remote object is the provider's IPCConnection instance.
75 | newConnection.remoteObjectInterface = NSXPCInterface(with: ProviderCommunication.self)
76 |
77 | currentConnection = newConnection
78 | newConnection.resume()
79 |
80 | guard let providerProxy = newConnection.remoteObjectProxyWithErrorHandler({ registerError in
81 | os_log("Failed to register with the provider: %@", log: tracerdIPCLog, type: .error, registerError.localizedDescription)
82 | self.currentConnection?.invalidate()
83 | self.currentConnection = nil
84 | completionHandler(false)
85 | }) as? ProviderCommunication else {
86 | fatalError("Failed to create a remote object proxy for the provider")
87 | }
88 |
89 | providerProxy.register(completionHandler)
90 | }
91 |
92 | func exec(file : String) {
93 | guard let connection = currentConnection else {
94 | os_log("Cannot send log because the app isn't registered", log: tracerdIPCLog, type: .error)
95 | return
96 | }
97 |
98 | guard let appProxy = connection.remoteObjectProxyWithErrorHandler({ promptError in
99 | os_log("Failed to send log: %@", log: tracerdIPCLog, type: .error, promptError.localizedDescription)
100 | self.currentConnection = nil
101 | return
102 | }) as? AppCommunication else {
103 | fatalError("Failed to create a remote object proxy for the app")
104 | }
105 |
106 | appProxy.exec(file: file)
107 | }
108 | }
109 |
110 | extension IPCConnection: NSXPCListenerDelegate {
111 |
112 | // MARK: NSXPCListenerDelegate
113 |
114 | func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
115 |
116 | // The exported object is this IPCConnection instance.
117 | newConnection.exportedInterface = NSXPCInterface(with: ProviderCommunication.self)
118 | newConnection.exportedObject = self
119 |
120 | // The remote object is the delegate of the app's IPCConnection instance.
121 | newConnection.remoteObjectInterface = NSXPCInterface(with: AppCommunication.self)
122 |
123 | newConnection.invalidationHandler = {
124 | self.currentConnection = nil
125 | }
126 |
127 | newConnection.interruptionHandler = {
128 | self.currentConnection = nil
129 | }
130 |
131 | currentConnection = newConnection
132 | newConnection.resume()
133 |
134 | return true
135 | }
136 | }
137 |
138 | extension IPCConnection: ProviderCommunication {
139 |
140 | // MARK: ProviderCommunication
141 |
142 | func register(_ completionHandler: @escaping (Bool) -> Void) {
143 |
144 | os_log("App registered", log: tracerdIPCLog, type: .info)
145 | completionHandler(true)
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/Tracer.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 6F5F611C22CE545B00EC9816 /* IPCConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5F611B22CE545B00EC9816 /* IPCConnection.swift */; };
11 | 6FAC93E222CE520C00324BF8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAC93E122CE520C00324BF8 /* AppDelegate.swift */; };
12 | 6FAC93E422CE520C00324BF8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAC93E322CE520C00324BF8 /* ViewController.swift */; };
13 | 6FAC93E622CE520D00324BF8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6FAC93E522CE520D00324BF8 /* Assets.xcassets */; };
14 | 6FAC93E922CE520D00324BF8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6FAC93E722CE520D00324BF8 /* Main.storyboard */; };
15 | 6FD780C622CE55C8000559A0 /* IPCConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5F611B22CE545B00EC9816 /* IPCConnection.swift */; };
16 | 6FD780C822CE6BD8000559A0 /* ESClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FD780C722CE6BD8000559A0 /* ESClient.swift */; };
17 | 6FF4DC9922CE52C800F127A2 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF4DC9822CE52C800F127A2 /* main.swift */; };
18 | 6FF4DC9E22CE52C800F127A2 /* sc.knight.Tracer.tracerd.systemextension in Embed System Extensions */ = {isa = PBXBuildFile; fileRef = 6FF4DC9122CE52C800F127A2 /* sc.knight.Tracer.tracerd.systemextension */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
19 | 6FF4DCA422CE52EE00F127A2 /* SystemExtensions.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FF4DCA322CE52EE00F127A2 /* SystemExtensions.framework */; };
20 | 6FF4DCA622CE530600F127A2 /* libEndpointSecurity.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FF4DCA522CE52FE00F127A2 /* libEndpointSecurity.tbd */; };
21 | /* End PBXBuildFile section */
22 |
23 | /* Begin PBXContainerItemProxy section */
24 | 6FF4DC9C22CE52C800F127A2 /* PBXContainerItemProxy */ = {
25 | isa = PBXContainerItemProxy;
26 | containerPortal = 6FAC93D622CE520C00324BF8 /* Project object */;
27 | proxyType = 1;
28 | remoteGlobalIDString = 6FF4DC9022CE52C800F127A2;
29 | remoteInfo = tracerd;
30 | };
31 | /* End PBXContainerItemProxy section */
32 |
33 | /* Begin PBXCopyFilesBuildPhase section */
34 | 6FF4DC9F22CE52C800F127A2 /* Embed System Extensions */ = {
35 | isa = PBXCopyFilesBuildPhase;
36 | buildActionMask = 2147483647;
37 | dstPath = "$(SYSTEM_EXTENSIONS_FOLDER_PATH)";
38 | dstSubfolderSpec = 16;
39 | files = (
40 | 6FF4DC9E22CE52C800F127A2 /* sc.knight.Tracer.tracerd.systemextension in Embed System Extensions */,
41 | );
42 | name = "Embed System Extensions";
43 | runOnlyForDeploymentPostprocessing = 0;
44 | };
45 | /* End PBXCopyFilesBuildPhase section */
46 |
47 | /* Begin PBXFileReference section */
48 | 6F5F611B22CE545B00EC9816 /* IPCConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPCConnection.swift; sourceTree = ""; };
49 | 6FAC93DE22CE520C00324BF8 /* Tracer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tracer.app; sourceTree = BUILT_PRODUCTS_DIR; };
50 | 6FAC93E122CE520C00324BF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
51 | 6FAC93E322CE520C00324BF8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
52 | 6FAC93E522CE520D00324BF8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
53 | 6FAC93E822CE520D00324BF8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
54 | 6FAC93EA22CE520D00324BF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
55 | 6FAC93EB22CE520D00324BF8 /* Tracer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Tracer.entitlements; sourceTree = ""; };
56 | 6FD780C722CE6BD8000559A0 /* ESClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ESClient.swift; sourceTree = ""; };
57 | 6FF4DC9122CE52C800F127A2 /* sc.knight.Tracer.tracerd.systemextension */ = {isa = PBXFileReference; explicitFileType = "wrapper.system-extension"; includeInIndex = 0; path = sc.knight.Tracer.tracerd.systemextension; sourceTree = BUILT_PRODUCTS_DIR; };
58 | 6FF4DC9322CE52C800F127A2 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
59 | 6FF4DC9822CE52C800F127A2 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
60 | 6FF4DC9A22CE52C800F127A2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
61 | 6FF4DC9B22CE52C800F127A2 /* tracerd.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = tracerd.entitlements; sourceTree = ""; };
62 | 6FF4DCA322CE52EE00F127A2 /* SystemExtensions.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemExtensions.framework; path = System/Library/Frameworks/SystemExtensions.framework; sourceTree = SDKROOT; };
63 | 6FF4DCA522CE52FE00F127A2 /* libEndpointSecurity.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libEndpointSecurity.tbd; path = usr/lib/libEndpointSecurity.tbd; sourceTree = SDKROOT; };
64 | /* End PBXFileReference section */
65 |
66 | /* Begin PBXFrameworksBuildPhase section */
67 | 6FAC93DB22CE520C00324BF8 /* Frameworks */ = {
68 | isa = PBXFrameworksBuildPhase;
69 | buildActionMask = 2147483647;
70 | files = (
71 | 6FF4DCA422CE52EE00F127A2 /* SystemExtensions.framework in Frameworks */,
72 | );
73 | runOnlyForDeploymentPostprocessing = 0;
74 | };
75 | 6FF4DC8E22CE52C800F127A2 /* Frameworks */ = {
76 | isa = PBXFrameworksBuildPhase;
77 | buildActionMask = 2147483647;
78 | files = (
79 | 6FF4DCA622CE530600F127A2 /* libEndpointSecurity.tbd in Frameworks */,
80 | );
81 | runOnlyForDeploymentPostprocessing = 0;
82 | };
83 | /* End PBXFrameworksBuildPhase section */
84 |
85 | /* Begin PBXGroup section */
86 | 6FAC93D522CE520C00324BF8 = {
87 | isa = PBXGroup;
88 | children = (
89 | 6FAC93E022CE520C00324BF8 /* Tracer */,
90 | 6FF4DC9522CE52C800F127A2 /* tracerd */,
91 | 6FF4DC9222CE52C800F127A2 /* Frameworks */,
92 | 6FAC93DF22CE520C00324BF8 /* Products */,
93 | );
94 | sourceTree = "";
95 | };
96 | 6FAC93DF22CE520C00324BF8 /* Products */ = {
97 | isa = PBXGroup;
98 | children = (
99 | 6FAC93DE22CE520C00324BF8 /* Tracer.app */,
100 | 6FF4DC9122CE52C800F127A2 /* sc.knight.Tracer.tracerd.systemextension */,
101 | );
102 | name = Products;
103 | sourceTree = "";
104 | };
105 | 6FAC93E022CE520C00324BF8 /* Tracer */ = {
106 | isa = PBXGroup;
107 | children = (
108 | 6FAC93E122CE520C00324BF8 /* AppDelegate.swift */,
109 | 6FAC93E322CE520C00324BF8 /* ViewController.swift */,
110 | 6FAC93E522CE520D00324BF8 /* Assets.xcassets */,
111 | 6FAC93E722CE520D00324BF8 /* Main.storyboard */,
112 | 6FAC93EA22CE520D00324BF8 /* Info.plist */,
113 | 6FAC93EB22CE520D00324BF8 /* Tracer.entitlements */,
114 | );
115 | path = Tracer;
116 | sourceTree = "";
117 | };
118 | 6FF4DC9222CE52C800F127A2 /* Frameworks */ = {
119 | isa = PBXGroup;
120 | children = (
121 | 6FF4DCA522CE52FE00F127A2 /* libEndpointSecurity.tbd */,
122 | 6FF4DCA322CE52EE00F127A2 /* SystemExtensions.framework */,
123 | 6FF4DC9322CE52C800F127A2 /* NetworkExtension.framework */,
124 | );
125 | name = Frameworks;
126 | sourceTree = "";
127 | };
128 | 6FF4DC9522CE52C800F127A2 /* tracerd */ = {
129 | isa = PBXGroup;
130 | children = (
131 | 6F5F611B22CE545B00EC9816 /* IPCConnection.swift */,
132 | 6FD780C722CE6BD8000559A0 /* ESClient.swift */,
133 | 6FF4DC9822CE52C800F127A2 /* main.swift */,
134 | 6FF4DC9A22CE52C800F127A2 /* Info.plist */,
135 | 6FF4DC9B22CE52C800F127A2 /* tracerd.entitlements */,
136 | );
137 | path = tracerd;
138 | sourceTree = "";
139 | };
140 | /* End PBXGroup section */
141 |
142 | /* Begin PBXNativeTarget section */
143 | 6FAC93DD22CE520C00324BF8 /* Tracer */ = {
144 | isa = PBXNativeTarget;
145 | buildConfigurationList = 6FAC93EE22CE520D00324BF8 /* Build configuration list for PBXNativeTarget "Tracer" */;
146 | buildPhases = (
147 | 6FAC93DA22CE520C00324BF8 /* Sources */,
148 | 6FAC93DB22CE520C00324BF8 /* Frameworks */,
149 | 6FAC93DC22CE520C00324BF8 /* Resources */,
150 | 6FF4DC9F22CE52C800F127A2 /* Embed System Extensions */,
151 | );
152 | buildRules = (
153 | );
154 | dependencies = (
155 | 6FF4DC9D22CE52C800F127A2 /* PBXTargetDependency */,
156 | );
157 | name = Tracer;
158 | productName = Tracer;
159 | productReference = 6FAC93DE22CE520C00324BF8 /* Tracer.app */;
160 | productType = "com.apple.product-type.application";
161 | };
162 | 6FF4DC9022CE52C800F127A2 /* tracerd */ = {
163 | isa = PBXNativeTarget;
164 | buildConfigurationList = 6FF4DCA222CE52C800F127A2 /* Build configuration list for PBXNativeTarget "tracerd" */;
165 | buildPhases = (
166 | 6FF4DC8D22CE52C800F127A2 /* Sources */,
167 | 6FF4DC8E22CE52C800F127A2 /* Frameworks */,
168 | 6FF4DC8F22CE52C800F127A2 /* Resources */,
169 | );
170 | buildRules = (
171 | );
172 | dependencies = (
173 | );
174 | name = tracerd;
175 | productName = tracerd;
176 | productReference = 6FF4DC9122CE52C800F127A2 /* sc.knight.Tracer.tracerd.systemextension */;
177 | productType = "com.apple.product-type.system-extension";
178 | };
179 | /* End PBXNativeTarget section */
180 |
181 | /* Begin PBXProject section */
182 | 6FAC93D622CE520C00324BF8 /* Project object */ = {
183 | isa = PBXProject;
184 | attributes = {
185 | LastSwiftUpdateCheck = 1100;
186 | LastUpgradeCheck = 1100;
187 | ORGANIZATIONNAME = "Scott Knight";
188 | TargetAttributes = {
189 | 6FAC93DD22CE520C00324BF8 = {
190 | CreatedOnToolsVersion = 11.0;
191 | };
192 | 6FF4DC9022CE52C800F127A2 = {
193 | CreatedOnToolsVersion = 11.0;
194 | };
195 | };
196 | };
197 | buildConfigurationList = 6FAC93D922CE520C00324BF8 /* Build configuration list for PBXProject "Tracer" */;
198 | compatibilityVersion = "Xcode 9.3";
199 | developmentRegion = en;
200 | hasScannedForEncodings = 0;
201 | knownRegions = (
202 | en,
203 | Base,
204 | );
205 | mainGroup = 6FAC93D522CE520C00324BF8;
206 | productRefGroup = 6FAC93DF22CE520C00324BF8 /* Products */;
207 | projectDirPath = "";
208 | projectRoot = "";
209 | targets = (
210 | 6FAC93DD22CE520C00324BF8 /* Tracer */,
211 | 6FF4DC9022CE52C800F127A2 /* tracerd */,
212 | );
213 | };
214 | /* End PBXProject section */
215 |
216 | /* Begin PBXResourcesBuildPhase section */
217 | 6FAC93DC22CE520C00324BF8 /* Resources */ = {
218 | isa = PBXResourcesBuildPhase;
219 | buildActionMask = 2147483647;
220 | files = (
221 | 6FAC93E622CE520D00324BF8 /* Assets.xcassets in Resources */,
222 | 6FAC93E922CE520D00324BF8 /* Main.storyboard in Resources */,
223 | );
224 | runOnlyForDeploymentPostprocessing = 0;
225 | };
226 | 6FF4DC8F22CE52C800F127A2 /* Resources */ = {
227 | isa = PBXResourcesBuildPhase;
228 | buildActionMask = 2147483647;
229 | files = (
230 | );
231 | runOnlyForDeploymentPostprocessing = 0;
232 | };
233 | /* End PBXResourcesBuildPhase section */
234 |
235 | /* Begin PBXSourcesBuildPhase section */
236 | 6FAC93DA22CE520C00324BF8 /* Sources */ = {
237 | isa = PBXSourcesBuildPhase;
238 | buildActionMask = 2147483647;
239 | files = (
240 | 6FD780C622CE55C8000559A0 /* IPCConnection.swift in Sources */,
241 | 6FAC93E422CE520C00324BF8 /* ViewController.swift in Sources */,
242 | 6FAC93E222CE520C00324BF8 /* AppDelegate.swift in Sources */,
243 | );
244 | runOnlyForDeploymentPostprocessing = 0;
245 | };
246 | 6FF4DC8D22CE52C800F127A2 /* Sources */ = {
247 | isa = PBXSourcesBuildPhase;
248 | buildActionMask = 2147483647;
249 | files = (
250 | 6F5F611C22CE545B00EC9816 /* IPCConnection.swift in Sources */,
251 | 6FF4DC9922CE52C800F127A2 /* main.swift in Sources */,
252 | 6FD780C822CE6BD8000559A0 /* ESClient.swift in Sources */,
253 | );
254 | runOnlyForDeploymentPostprocessing = 0;
255 | };
256 | /* End PBXSourcesBuildPhase section */
257 |
258 | /* Begin PBXTargetDependency section */
259 | 6FF4DC9D22CE52C800F127A2 /* PBXTargetDependency */ = {
260 | isa = PBXTargetDependency;
261 | target = 6FF4DC9022CE52C800F127A2 /* tracerd */;
262 | targetProxy = 6FF4DC9C22CE52C800F127A2 /* PBXContainerItemProxy */;
263 | };
264 | /* End PBXTargetDependency section */
265 |
266 | /* Begin PBXVariantGroup section */
267 | 6FAC93E722CE520D00324BF8 /* Main.storyboard */ = {
268 | isa = PBXVariantGroup;
269 | children = (
270 | 6FAC93E822CE520D00324BF8 /* Base */,
271 | );
272 | name = Main.storyboard;
273 | sourceTree = "";
274 | };
275 | /* End PBXVariantGroup section */
276 |
277 | /* Begin XCBuildConfiguration section */
278 | 6FAC93EC22CE520D00324BF8 /* Debug */ = {
279 | isa = XCBuildConfiguration;
280 | buildSettings = {
281 | ALWAYS_SEARCH_USER_PATHS = NO;
282 | CLANG_ANALYZER_NONNULL = YES;
283 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
284 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
285 | CLANG_CXX_LIBRARY = "libc++";
286 | CLANG_ENABLE_MODULES = YES;
287 | CLANG_ENABLE_OBJC_ARC = YES;
288 | CLANG_ENABLE_OBJC_WEAK = YES;
289 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
290 | CLANG_WARN_BOOL_CONVERSION = YES;
291 | CLANG_WARN_COMMA = YES;
292 | CLANG_WARN_CONSTANT_CONVERSION = YES;
293 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
294 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
295 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
296 | CLANG_WARN_EMPTY_BODY = YES;
297 | CLANG_WARN_ENUM_CONVERSION = YES;
298 | CLANG_WARN_INFINITE_RECURSION = YES;
299 | CLANG_WARN_INT_CONVERSION = YES;
300 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
301 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
302 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
303 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
304 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
305 | CLANG_WARN_STRICT_PROTOTYPES = YES;
306 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
307 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
308 | CLANG_WARN_UNREACHABLE_CODE = YES;
309 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
310 | COPY_PHASE_STRIP = NO;
311 | DEBUG_INFORMATION_FORMAT = dwarf;
312 | ENABLE_STRICT_OBJC_MSGSEND = YES;
313 | ENABLE_TESTABILITY = YES;
314 | GCC_C_LANGUAGE_STANDARD = gnu11;
315 | GCC_DYNAMIC_NO_PIC = NO;
316 | GCC_NO_COMMON_BLOCKS = YES;
317 | GCC_OPTIMIZATION_LEVEL = 0;
318 | GCC_PREPROCESSOR_DEFINITIONS = (
319 | "DEBUG=1",
320 | "$(inherited)",
321 | );
322 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
323 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
324 | GCC_WARN_UNDECLARED_SELECTOR = YES;
325 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
326 | GCC_WARN_UNUSED_FUNCTION = YES;
327 | GCC_WARN_UNUSED_VARIABLE = YES;
328 | MACOSX_DEPLOYMENT_TARGET = 10.15;
329 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
330 | MTL_FAST_MATH = YES;
331 | ONLY_ACTIVE_ARCH = YES;
332 | SDKROOT = macosx;
333 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
334 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
335 | };
336 | name = Debug;
337 | };
338 | 6FAC93ED22CE520D00324BF8 /* Release */ = {
339 | isa = XCBuildConfiguration;
340 | buildSettings = {
341 | ALWAYS_SEARCH_USER_PATHS = NO;
342 | CLANG_ANALYZER_NONNULL = YES;
343 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
344 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
345 | CLANG_CXX_LIBRARY = "libc++";
346 | CLANG_ENABLE_MODULES = YES;
347 | CLANG_ENABLE_OBJC_ARC = YES;
348 | CLANG_ENABLE_OBJC_WEAK = YES;
349 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
350 | CLANG_WARN_BOOL_CONVERSION = YES;
351 | CLANG_WARN_COMMA = YES;
352 | CLANG_WARN_CONSTANT_CONVERSION = YES;
353 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
354 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
355 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
356 | CLANG_WARN_EMPTY_BODY = YES;
357 | CLANG_WARN_ENUM_CONVERSION = YES;
358 | CLANG_WARN_INFINITE_RECURSION = YES;
359 | CLANG_WARN_INT_CONVERSION = YES;
360 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
361 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
362 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
363 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
364 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
365 | CLANG_WARN_STRICT_PROTOTYPES = YES;
366 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
367 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
368 | CLANG_WARN_UNREACHABLE_CODE = YES;
369 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
370 | COPY_PHASE_STRIP = NO;
371 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
372 | ENABLE_NS_ASSERTIONS = NO;
373 | ENABLE_STRICT_OBJC_MSGSEND = YES;
374 | GCC_C_LANGUAGE_STANDARD = gnu11;
375 | GCC_NO_COMMON_BLOCKS = YES;
376 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
377 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
378 | GCC_WARN_UNDECLARED_SELECTOR = YES;
379 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
380 | GCC_WARN_UNUSED_FUNCTION = YES;
381 | GCC_WARN_UNUSED_VARIABLE = YES;
382 | MACOSX_DEPLOYMENT_TARGET = 10.15;
383 | MTL_ENABLE_DEBUG_INFO = NO;
384 | MTL_FAST_MATH = YES;
385 | SDKROOT = macosx;
386 | SWIFT_COMPILATION_MODE = wholemodule;
387 | SWIFT_OPTIMIZATION_LEVEL = "-O";
388 | };
389 | name = Release;
390 | };
391 | 6FAC93EF22CE520D00324BF8 /* Debug */ = {
392 | isa = XCBuildConfiguration;
393 | buildSettings = {
394 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
395 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
396 | CODE_SIGN_ENTITLEMENTS = Tracer/Tracer.entitlements;
397 | CODE_SIGN_STYLE = Automatic;
398 | COMBINE_HIDPI_IMAGES = YES;
399 | CURRENT_PROJECT_VERSION = 1;
400 | DEVELOPMENT_TEAM = "";
401 | ENABLE_HARDENED_RUNTIME = YES;
402 | INFOPLIST_FILE = Tracer/Info.plist;
403 | LD_RUNPATH_SEARCH_PATHS = (
404 | "$(inherited)",
405 | "@executable_path/../Frameworks",
406 | );
407 | MARKETING_VERSION = 1.0;
408 | PRODUCT_BUNDLE_IDENTIFIER = sc.knight.Tracer;
409 | PRODUCT_NAME = "$(TARGET_NAME)";
410 | SWIFT_VERSION = 5.0;
411 | };
412 | name = Debug;
413 | };
414 | 6FAC93F022CE520D00324BF8 /* Release */ = {
415 | isa = XCBuildConfiguration;
416 | buildSettings = {
417 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
418 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
419 | CODE_SIGN_ENTITLEMENTS = Tracer/Tracer.entitlements;
420 | CODE_SIGN_STYLE = Automatic;
421 | COMBINE_HIDPI_IMAGES = YES;
422 | CURRENT_PROJECT_VERSION = 1;
423 | DEVELOPMENT_TEAM = "";
424 | ENABLE_HARDENED_RUNTIME = YES;
425 | INFOPLIST_FILE = Tracer/Info.plist;
426 | LD_RUNPATH_SEARCH_PATHS = (
427 | "$(inherited)",
428 | "@executable_path/../Frameworks",
429 | );
430 | MARKETING_VERSION = 1.0;
431 | PRODUCT_BUNDLE_IDENTIFIER = sc.knight.Tracer;
432 | PRODUCT_NAME = "$(TARGET_NAME)";
433 | SWIFT_VERSION = 5.0;
434 | };
435 | name = Release;
436 | };
437 | 6FF4DCA022CE52C800F127A2 /* Debug */ = {
438 | isa = XCBuildConfiguration;
439 | buildSettings = {
440 | CODE_SIGN_ENTITLEMENTS = tracerd/tracerd.entitlements;
441 | CODE_SIGN_STYLE = Automatic;
442 | CURRENT_PROJECT_VERSION = 1;
443 | DEVELOPMENT_TEAM = "";
444 | ENABLE_HARDENED_RUNTIME = YES;
445 | INFOPLIST_FILE = tracerd/Info.plist;
446 | LD_RUNPATH_SEARCH_PATHS = (
447 | "$(inherited)",
448 | "@executable_path/../Frameworks",
449 | "@executable_path/../../../../Frameworks",
450 | );
451 | MARKETING_VERSION = 1.0;
452 | PRODUCT_BUNDLE_IDENTIFIER = sc.knight.Tracer.tracerd;
453 | PRODUCT_MODULE_NAME = "$(TARGET_NAME)";
454 | PRODUCT_NAME = "$(PRODUCT_BUNDLE_IDENTIFIER)";
455 | SKIP_INSTALL = YES;
456 | SWIFT_INCLUDE_PATHS = EndpointSecurity;
457 | SWIFT_VERSION = 5.0;
458 | };
459 | name = Debug;
460 | };
461 | 6FF4DCA122CE52C800F127A2 /* Release */ = {
462 | isa = XCBuildConfiguration;
463 | buildSettings = {
464 | CODE_SIGN_ENTITLEMENTS = tracerd/tracerd.entitlements;
465 | CODE_SIGN_STYLE = Automatic;
466 | CURRENT_PROJECT_VERSION = 1;
467 | DEVELOPMENT_TEAM = "";
468 | ENABLE_HARDENED_RUNTIME = YES;
469 | INFOPLIST_FILE = tracerd/Info.plist;
470 | LD_RUNPATH_SEARCH_PATHS = (
471 | "$(inherited)",
472 | "@executable_path/../Frameworks",
473 | "@executable_path/../../../../Frameworks",
474 | );
475 | MARKETING_VERSION = 1.0;
476 | PRODUCT_BUNDLE_IDENTIFIER = sc.knight.Tracer.tracerd;
477 | PRODUCT_MODULE_NAME = "$(TARGET_NAME)";
478 | PRODUCT_NAME = "$(PRODUCT_BUNDLE_IDENTIFIER)";
479 | SKIP_INSTALL = YES;
480 | SWIFT_INCLUDE_PATHS = EndpointSecurity;
481 | SWIFT_VERSION = 5.0;
482 | };
483 | name = Release;
484 | };
485 | /* End XCBuildConfiguration section */
486 |
487 | /* Begin XCConfigurationList section */
488 | 6FAC93D922CE520C00324BF8 /* Build configuration list for PBXProject "Tracer" */ = {
489 | isa = XCConfigurationList;
490 | buildConfigurations = (
491 | 6FAC93EC22CE520D00324BF8 /* Debug */,
492 | 6FAC93ED22CE520D00324BF8 /* Release */,
493 | );
494 | defaultConfigurationIsVisible = 0;
495 | defaultConfigurationName = Release;
496 | };
497 | 6FAC93EE22CE520D00324BF8 /* Build configuration list for PBXNativeTarget "Tracer" */ = {
498 | isa = XCConfigurationList;
499 | buildConfigurations = (
500 | 6FAC93EF22CE520D00324BF8 /* Debug */,
501 | 6FAC93F022CE520D00324BF8 /* Release */,
502 | );
503 | defaultConfigurationIsVisible = 0;
504 | defaultConfigurationName = Release;
505 | };
506 | 6FF4DCA222CE52C800F127A2 /* Build configuration list for PBXNativeTarget "tracerd" */ = {
507 | isa = XCConfigurationList;
508 | buildConfigurations = (
509 | 6FF4DCA022CE52C800F127A2 /* Debug */,
510 | 6FF4DCA122CE52C800F127A2 /* Release */,
511 | );
512 | defaultConfigurationIsVisible = 0;
513 | defaultConfigurationName = Release;
514 | };
515 | /* End XCConfigurationList section */
516 | };
517 | rootObject = 6FAC93D622CE520C00324BF8 /* Project object */;
518 | }
519 |
--------------------------------------------------------------------------------
/Tracer/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
--------------------------------------------------------------------------------