├── LICENSE └── parse-browser-history ├── Package.swift ├── README.md ├── Sources └── parse-browser-history │ └── main.swift ├── Tests ├── LinuxMain.swift └── parse-browser-historyTests │ ├── XCTestManifests.swift │ └── parse_browser_historyTests.swift ├── compiled-historyparser ├── parse-browser-history.xcodeproj ├── parse_browser_historyTests_Info.plist ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings │ └── xcuserdata │ │ └── redteam.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcshareddata │ └── xcschemes │ ├── parse-browser-history-Package.xcscheme │ └── parse-browser-history.xcscheme └── usage.jpeg /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020, Cedric Owens 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /parse-browser-history/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.0 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "parse-browser-history", 8 | dependencies: [ 9 | // Dependencies declare other packages that this package depends on. 10 | // .package(url: /* package url */, from: "1.0.0"), 11 | ], 12 | targets: [ 13 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 14 | // Targets can depend on other targets in this package, and on products in packages which this package depends on. 15 | .target( 16 | name: "parse-browser-history", 17 | dependencies: []), 18 | .testTarget( 19 | name: "parse-browser-historyTests", 20 | dependencies: ["parse-browser-history"]), 21 | ] 22 | ) 23 | -------------------------------------------------------------------------------- /parse-browser-history/README.md: -------------------------------------------------------------------------------- 1 | # macOS Browser History Parser 2 | 3 | Sample Swift code to parse the following history databases on macOS: 4 | 5 | - Quarantine events history database (/Users/[user]/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2) 6 | - Safari history database (/Users/[user]/Library/Safari/History.db) 7 | - Chrome history database (/Users/[user]/Library/Application Support/Google/Chrome/Default/History) 8 | - Firefox history database (/Users/[user]/Library/Application Support/Firefox/Profiles/.default-release/places.sqlite) 9 | 10 | The results are written to the same directory in a file named "browser-history.txt". 11 | 12 | Steps: 13 | 1. You can pull the project down, make whatever modifications you desire, and compile your own binary OR you can use the compiled binary included here in the repo named "compiled-historyparser". 14 | 2. Depending on your use of the binary, you may need to sign and notarize it first or remove the quarantine flag (xattr -d [binary name]) (if you plan to download it via a browser and run it). Otherwise you should be fine 15 | 16 | ![Image](usage.jpeg) 17 | -------------------------------------------------------------------------------- /parse-browser-history/Sources/parse-browser-history/main.swift: -------------------------------------------------------------------------------- 1 | import SQLite3 2 | import Cocoa 3 | 4 | let fileMan = FileManager() 5 | var nm1 = "" 6 | var nm2 = "" 7 | var nm3 = "" 8 | var nm4 = "" 9 | var visitDate = "" 10 | var histURL = "" 11 | var cVisitDate = "" 12 | var cUrl = "" 13 | var cTitle = "" 14 | var ffoxDate = "" 15 | var ffoxURL = "" 16 | 17 | 18 | var browserHistFile = "browser_and_quarantine_history.txt" 19 | fileMan.createFile(atPath: "browser-history.txt", contents: nil, attributes: nil) 20 | 21 | let browseHistCollectorURL = URL(fileURLWithPath: "browser-history.txt") 22 | 23 | let browseHistFileHandle = try FileHandle(forWritingTo: browseHistCollectorURL) 24 | var isDir = ObjCBool(true) 25 | let username = NSUserName() 26 | 27 | //quarantine history 28 | if fileMan.fileExists(atPath: "/Users/\(username)/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2", isDirectory: &isDir){ 29 | browseHistFileHandle.write("Results for user \(username)\r----------------------------\r".data(using: .utf8)!) 30 | var db : OpaquePointer? 31 | var dbURL = URL(fileURLWithPath: "/Users/\(username)/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2") 32 | if sqlite3_open(dbURL.path, &db) != SQLITE_OK{ 33 | browseHistFileHandle.write("[-] Could not open quarantive events database.".data(using: .utf8)!) 34 | }else { 35 | 36 | let queryString = "select datetime(LSQuarantineTimeStamp, 'unixepoch') as last_visited, LSQuarantineAgentBundleIdentifier, LSQuarantineDataURLString, LSQuarantineOriginURLString from LSQuarantineEvent where LSQuarantineDataURLString is not null order by last_visited;" 37 | 38 | var queryStatement: OpaquePointer? = nil 39 | 40 | if sqlite3_prepare_v2(db, queryString, -1, &queryStatement, nil) == SQLITE_OK{ 41 | while sqlite3_step(queryStatement) == SQLITE_ROW { 42 | let col1 = sqlite3_column_text(queryStatement, 0) 43 | if col1 != nil{ 44 | nm1 = String(cString: col1!) 45 | 46 | } 47 | 48 | let col2 = sqlite3_column_text(queryStatement, 1) 49 | if col2 != nil{ 50 | nm2 = String(cString: col2!) 51 | } 52 | 53 | let col3 = sqlite3_column_text(queryStatement, 2) 54 | if col3 != nil{ 55 | nm3 = String(cString:col3!) 56 | } 57 | 58 | 59 | let col4 = sqlite3_column_text(queryStatement, 3) 60 | if col4 != nil{ 61 | nm4 = String(cString: col4!) 62 | } 63 | 64 | 65 | browseHistFileHandle.write("Date: \(nm1) | App: \(nm2) | File: \(nm3) | OriginURL: \(nm4)\r".data(using: .utf8)!) 66 | 67 | } 68 | // 69 | sqlite3_finalize(queryStatement) 70 | print("[+] Quarantine history database parsed and written to \"browser-history.txt\" in current directory.") 71 | } 72 | 73 | 74 | 75 | } 76 | 77 | }else { 78 | browseHistFileHandle.write("[-] QuarantineEventsV2 database not found for user \(username)\r".data(using: .utf8)!) 79 | } 80 | 81 | //safari history check 82 | if fileMan.fileExists(atPath: "/Users/\(username)/Library/Safari/History.db", isDirectory: &isDir){ 83 | browseHistFileHandle.write("\r[+] Safari history results for user \(username):\r----------------------------\r".data(using: .utf8)!) 84 | var db : OpaquePointer? 85 | var dbURL = URL(fileURLWithPath: "/Users/\(username)/Library/Safari/History.db") 86 | if sqlite3_open(dbURL.path, &db) != SQLITE_OK{ 87 | browseHistFileHandle.write("[-] Could not open the Safari History.db file for user \(username)\r".data(using: .utf8)!) 88 | }else { 89 | //let queryString = "select history_visits.visit_time, history_items.url from history_visits, history_items where history_visits.history_item=history_items.id;" 90 | let queryString = "select datetime(history_visits.visit_time + 978307200, 'unixepoch') as last_visited, history_items.url from history_visits, history_items where history_visits.history_item=history_items.id order by last_visited;" 91 | var queryStatement: OpaquePointer? = nil 92 | 93 | if sqlite3_prepare_v2(db, queryString, -1, &queryStatement, nil) == SQLITE_OK{ 94 | while sqlite3_step(queryStatement) == SQLITE_ROW{ 95 | let col1 = sqlite3_column_text(queryStatement, 0) 96 | if col1 != nil{ 97 | visitDate = String(cString: col1!) 98 | 99 | } 100 | let col2 = sqlite3_column_text(queryStatement, 1) 101 | if col2 != nil{ 102 | histURL = String(cString: col2!) 103 | 104 | } 105 | 106 | browseHistFileHandle.write("Date: \(visitDate) | URL: \(histURL)\r".data(using: .utf8)!) 107 | 108 | } 109 | sqlite3_finalize(queryStatement) 110 | print("[+] Safari history database parsed and written to \"browser-history.txt\" in current directory.") 111 | } 112 | 113 | } 114 | } 115 | else { 116 | browseHistFileHandle.write("[-] Safari History.db database not found for user \(username)\r".data(using: .utf8)!) 117 | } 118 | 119 | //chrome history check 120 | if fileMan.fileExists(atPath: "/Users/\(username)/Library/Application Support/Google/Chrome/Default/History", isDirectory: &isDir){ 121 | browseHistFileHandle.write("\r[+] Chrome history results for user \(username):\r----------------------------\r".data(using: .utf8)!) 122 | var db : OpaquePointer? 123 | var dbURL = URL(fileURLWithPath: "/Users/\(username)/Library/Application Support/Google/Chrome/Default/History") 124 | 125 | if sqlite3_open(dbURL.path, &db) != SQLITE_OK{ 126 | browseHistFileHandle.write("[-] Could not open the Chrome history database file for user \(username)".data(using: .utf8)!) 127 | 128 | } else{ 129 | 130 | let queryString = "select datetime(last_visit_time/1000000-11644473600, \"unixepoch\") as last_visited, url, title from urls order by last_visited;" 131 | 132 | var queryStatement: OpaquePointer? = nil 133 | 134 | if sqlite3_prepare_v2(db, queryString, -1, &queryStatement, nil) == SQLITE_OK{ 135 | 136 | while sqlite3_step(queryStatement) == SQLITE_ROW{ 137 | 138 | 139 | let col1 = sqlite3_column_text(queryStatement, 0) 140 | if col1 != nil{ 141 | cVisitDate = String(cString: col1!) 142 | 143 | } 144 | 145 | let col2 = sqlite3_column_text(queryStatement, 1) 146 | if col2 != nil{ 147 | cUrl = String(cString: col2!) 148 | 149 | } 150 | 151 | let col3 = sqlite3_column_text(queryStatement, 2) 152 | if col3 != nil{ 153 | cTitle = String(cString: col3!) 154 | 155 | } 156 | 157 | 158 | browseHistFileHandle.write("Date: \(cVisitDate) | URL: \(cUrl) | Title: \(cTitle)\r".data(using: .utf8)!) 159 | 160 | } 161 | 162 | sqlite3_finalize(queryStatement) 163 | print("[+] Chrome history database parsed and written to \"browser-history.txt\" in current directory.") 164 | 165 | 166 | } 167 | else { 168 | print("\r[-] Issue with preparing the Chrome History database...this may be because something is currently writing to it (i.e., an active Chrome browser)...kill the browser and try again") 169 | } 170 | 171 | } 172 | } 173 | else{ 174 | browseHistFileHandle.write("[-] Chrome History database not found for user \(username)\r".data(using: .utf8)!) 175 | } 176 | 177 | //firefox history check 178 | if fileMan.fileExists(atPath: "/Users/\(username)/Library/Application Support/Firefox/Profiles/"){ 179 | let fileEnum = fileMan.enumerator(atPath: "/Users/\(username)/Library/Application Support/Firefox/Profiles/") 180 | browseHistFileHandle.write("\r[+] Firefox history results for user \(username):\r----------------------------\r".data(using: .utf8)!) 181 | 182 | while let each = fileEnum?.nextObject() as? String { 183 | if each.contains("places.sqlite"){ 184 | let placesDBPath = "/Users/\(username)/Library/Application Support/Firefox/Profiles/\(each)" 185 | var db : OpaquePointer? 186 | var dbURL = URL(fileURLWithPath: placesDBPath) 187 | 188 | var printTest = sqlite3_open(dbURL.path, &db) 189 | 190 | if sqlite3_open(dbURL.path, &db) != SQLITE_OK{ 191 | browseHistFileHandle.write("[-] Could not open the Firefox history database file for user \(username)".data(using: .utf8)!) 192 | } else { 193 | 194 | let queryString = "select datetime(visit_date/1000000,'unixepoch') as time, url FROM moz_places, moz_historyvisits where moz_places.id=moz_historyvisits.place_id order by time;" 195 | 196 | var queryStatement: OpaquePointer? = nil 197 | 198 | if sqlite3_prepare_v2(db, queryString, -1, &queryStatement, nil) == SQLITE_OK{ 199 | 200 | while sqlite3_step(queryStatement) == SQLITE_ROW{ 201 | let col1 = sqlite3_column_text(queryStatement, 0) 202 | if col1 != nil{ 203 | ffoxDate = String(cString: col1!) 204 | } 205 | 206 | let col2 = sqlite3_column_text(queryStatement, 1) 207 | if col2 != nil{ 208 | ffoxURL = String(cString: col2!) 209 | } 210 | 211 | browseHistFileHandle.write("Date: \(ffoxDate) | URL: \(ffoxURL)\r".data(using: .utf8)!) 212 | 213 | } 214 | 215 | sqlite3_finalize(queryStatement) 216 | print("[+] Firefox history database parsed and written to \"browser-history.txt\" in current directory.") 217 | 218 | } 219 | 220 | 221 | } 222 | } 223 | } 224 | } 225 | else { 226 | browseHistFileHandle.write("[-] Firefox places.sqlite database not found for user \(username)\r".data(using: .utf8)!) 227 | } 228 | 229 | 230 | print("DONE!") 231 | 232 | 233 | 234 | 235 | 236 | -------------------------------------------------------------------------------- /parse-browser-history/Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | import parse_browser_historyTests 4 | 5 | var tests = [XCTestCaseEntry]() 6 | tests += parse_browser_historyTests.allTests() 7 | XCTMain(tests) 8 | -------------------------------------------------------------------------------- /parse-browser-history/Tests/parse-browser-historyTests/XCTestManifests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | #if !canImport(ObjectiveC) 4 | public func allTests() -> [XCTestCaseEntry] { 5 | return [ 6 | testCase(parse_browser_historyTests.allTests), 7 | ] 8 | } 9 | #endif 10 | -------------------------------------------------------------------------------- /parse-browser-history/Tests/parse-browser-historyTests/parse_browser_historyTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import class Foundation.Bundle 3 | 4 | final class parse_browser_historyTests: XCTestCase { 5 | func testExample() throws { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | 10 | // Some of the APIs that we use below are available in macOS 10.13 and above. 11 | guard #available(macOS 10.13, *) else { 12 | return 13 | } 14 | 15 | let fooBinary = productsDirectory.appendingPathComponent("parse-browser-history") 16 | 17 | let process = Process() 18 | process.executableURL = fooBinary 19 | 20 | let pipe = Pipe() 21 | process.standardOutput = pipe 22 | 23 | try process.run() 24 | process.waitUntilExit() 25 | 26 | let data = pipe.fileHandleForReading.readDataToEndOfFile() 27 | let output = String(data: data, encoding: .utf8) 28 | 29 | XCTAssertEqual(output, "Hello, world!\n") 30 | } 31 | 32 | /// Returns path to the built products directory. 33 | var productsDirectory: URL { 34 | #if os(macOS) 35 | for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") { 36 | return bundle.bundleURL.deletingLastPathComponent() 37 | } 38 | fatalError("couldn't find the products directory") 39 | #else 40 | return Bundle.main.bundleURL 41 | #endif 42 | } 43 | 44 | static var allTests = [ 45 | ("testExample", testExample), 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /parse-browser-history/compiled-historyparser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedowens/macOS-browserhist-parser/1971f704eb43c7d7d35b5831ec362ce4924f5dd6/parse-browser-history/compiled-historyparser -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/parse_browser_historyTests_Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundleDevelopmentRegion 5 | en 6 | CFBundleExecutable 7 | $(EXECUTABLE_NAME) 8 | CFBundleIdentifier 9 | $(PRODUCT_BUNDLE_IDENTIFIER) 10 | CFBundleInfoDictionaryVersion 11 | 6.0 12 | CFBundleName 13 | $(PRODUCT_NAME) 14 | CFBundlePackageType 15 | BNDL 16 | CFBundleShortVersionString 17 | 1.0 18 | CFBundleSignature 19 | ???? 20 | CFBundleVersion 21 | $(CURRENT_PROJECT_VERSION) 22 | NSPrincipalClass 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = "1"; 4 | objectVersion = "46"; 5 | objects = { 6 | "OBJ_1" = { 7 | isa = "PBXProject"; 8 | attributes = { 9 | LastSwiftMigration = "9999"; 10 | LastUpgradeCheck = "9999"; 11 | }; 12 | buildConfigurationList = "OBJ_2"; 13 | compatibilityVersion = "Xcode 3.2"; 14 | developmentRegion = "English"; 15 | hasScannedForEncodings = "0"; 16 | knownRegions = ( 17 | "en" 18 | ); 19 | mainGroup = "OBJ_5"; 20 | productRefGroup = "OBJ_14"; 21 | projectDirPath = "."; 22 | targets = ( 23 | "parse-browser-history::parse-browser-history", 24 | "parse-browser-history::SwiftPMPackageDescription", 25 | "parse-browser-history::parse-browser-historyPackageTests::ProductTarget", 26 | "parse-browser-history::parse-browser-historyTests" 27 | ); 28 | }; 29 | "OBJ_10" = { 30 | isa = "PBXGroup"; 31 | children = ( 32 | "OBJ_11" 33 | ); 34 | name = "Tests"; 35 | path = ""; 36 | sourceTree = "SOURCE_ROOT"; 37 | }; 38 | "OBJ_11" = { 39 | isa = "PBXGroup"; 40 | children = ( 41 | "OBJ_12", 42 | "OBJ_13" 43 | ); 44 | name = "parse-browser-historyTests"; 45 | path = "Tests/parse-browser-historyTests"; 46 | sourceTree = "SOURCE_ROOT"; 47 | }; 48 | "OBJ_12" = { 49 | isa = "PBXFileReference"; 50 | path = "XCTestManifests.swift"; 51 | sourceTree = ""; 52 | }; 53 | "OBJ_13" = { 54 | isa = "PBXFileReference"; 55 | path = "parse_browser_historyTests.swift"; 56 | sourceTree = ""; 57 | }; 58 | "OBJ_14" = { 59 | isa = "PBXGroup"; 60 | children = ( 61 | "parse-browser-history::parse-browser-historyTests::Product", 62 | "parse-browser-history::parse-browser-history::Product" 63 | ); 64 | name = "Products"; 65 | path = ""; 66 | sourceTree = "BUILT_PRODUCTS_DIR"; 67 | }; 68 | "OBJ_18" = { 69 | isa = "XCConfigurationList"; 70 | buildConfigurations = ( 71 | "OBJ_19", 72 | "OBJ_20" 73 | ); 74 | defaultConfigurationIsVisible = "0"; 75 | defaultConfigurationName = "Release"; 76 | }; 77 | "OBJ_19" = { 78 | isa = "XCBuildConfiguration"; 79 | buildSettings = { 80 | FRAMEWORK_SEARCH_PATHS = ( 81 | "$(inherited)", 82 | "$(PLATFORM_DIR)/Developer/Library/Frameworks" 83 | ); 84 | HEADER_SEARCH_PATHS = ( 85 | "$(inherited)" 86 | ); 87 | INFOPLIST_FILE = "parse-browser-history.xcodeproj/parse_browser_history_Info.plist"; 88 | IPHONEOS_DEPLOYMENT_TARGET = "8.0"; 89 | LD_RUNPATH_SEARCH_PATHS = ( 90 | "$(inherited)", 91 | "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", 92 | "@executable_path" 93 | ); 94 | MACOSX_DEPLOYMENT_TARGET = "10.10"; 95 | OTHER_CFLAGS = ( 96 | "$(inherited)" 97 | ); 98 | OTHER_LDFLAGS = ( 99 | "$(inherited)" 100 | ); 101 | OTHER_SWIFT_FLAGS = ( 102 | "$(inherited)" 103 | ); 104 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 105 | "$(inherited)" 106 | ); 107 | SWIFT_FORCE_DYNAMIC_LINK_STDLIB = "YES"; 108 | SWIFT_FORCE_STATIC_LINK_STDLIB = "NO"; 109 | SWIFT_VERSION = "5.0"; 110 | TARGET_NAME = "parse-browser-history"; 111 | TVOS_DEPLOYMENT_TARGET = "9.0"; 112 | WATCHOS_DEPLOYMENT_TARGET = "2.0"; 113 | }; 114 | name = "Debug"; 115 | }; 116 | "OBJ_2" = { 117 | isa = "XCConfigurationList"; 118 | buildConfigurations = ( 119 | "OBJ_3", 120 | "OBJ_4" 121 | ); 122 | defaultConfigurationIsVisible = "0"; 123 | defaultConfigurationName = "Release"; 124 | }; 125 | "OBJ_20" = { 126 | isa = "XCBuildConfiguration"; 127 | buildSettings = { 128 | FRAMEWORK_SEARCH_PATHS = ( 129 | "$(inherited)", 130 | "$(PLATFORM_DIR)/Developer/Library/Frameworks" 131 | ); 132 | HEADER_SEARCH_PATHS = ( 133 | "$(inherited)" 134 | ); 135 | INFOPLIST_FILE = "parse-browser-history.xcodeproj/parse_browser_history_Info.plist"; 136 | IPHONEOS_DEPLOYMENT_TARGET = "8.0"; 137 | LD_RUNPATH_SEARCH_PATHS = ( 138 | "$(inherited)", 139 | "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", 140 | "@executable_path" 141 | ); 142 | MACOSX_DEPLOYMENT_TARGET = "10.10"; 143 | OTHER_CFLAGS = ( 144 | "$(inherited)" 145 | ); 146 | OTHER_LDFLAGS = ( 147 | "$(inherited)" 148 | ); 149 | OTHER_SWIFT_FLAGS = ( 150 | "$(inherited)" 151 | ); 152 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 153 | "$(inherited)" 154 | ); 155 | SWIFT_FORCE_DYNAMIC_LINK_STDLIB = "YES"; 156 | SWIFT_FORCE_STATIC_LINK_STDLIB = "NO"; 157 | SWIFT_VERSION = "5.0"; 158 | TARGET_NAME = "parse-browser-history"; 159 | TVOS_DEPLOYMENT_TARGET = "9.0"; 160 | WATCHOS_DEPLOYMENT_TARGET = "2.0"; 161 | }; 162 | name = "Release"; 163 | }; 164 | "OBJ_21" = { 165 | isa = "PBXSourcesBuildPhase"; 166 | files = ( 167 | "OBJ_22" 168 | ); 169 | }; 170 | "OBJ_22" = { 171 | isa = "PBXBuildFile"; 172 | fileRef = "OBJ_9"; 173 | }; 174 | "OBJ_23" = { 175 | isa = "PBXFrameworksBuildPhase"; 176 | files = ( 177 | ); 178 | }; 179 | "OBJ_25" = { 180 | isa = "XCConfigurationList"; 181 | buildConfigurations = ( 182 | "OBJ_26", 183 | "OBJ_27" 184 | ); 185 | defaultConfigurationIsVisible = "0"; 186 | defaultConfigurationName = "Release"; 187 | }; 188 | "OBJ_26" = { 189 | isa = "XCBuildConfiguration"; 190 | buildSettings = { 191 | LD = "/usr/bin/true"; 192 | OTHER_SWIFT_FLAGS = ( 193 | "-swift-version", 194 | "5", 195 | "-I", 196 | "$(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2", 197 | "-target", 198 | "x86_64-apple-macosx10.10", 199 | "-sdk", 200 | "/Users/redteam/Downloads/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk" 201 | ); 202 | SWIFT_VERSION = "5.0"; 203 | }; 204 | name = "Debug"; 205 | }; 206 | "OBJ_27" = { 207 | isa = "XCBuildConfiguration"; 208 | buildSettings = { 209 | LD = "/usr/bin/true"; 210 | OTHER_SWIFT_FLAGS = ( 211 | "-swift-version", 212 | "5", 213 | "-I", 214 | "$(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2", 215 | "-target", 216 | "x86_64-apple-macosx10.10", 217 | "-sdk", 218 | "/Users/redteam/Downloads/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk" 219 | ); 220 | SWIFT_VERSION = "5.0"; 221 | }; 222 | name = "Release"; 223 | }; 224 | "OBJ_28" = { 225 | isa = "PBXSourcesBuildPhase"; 226 | files = ( 227 | "OBJ_29" 228 | ); 229 | }; 230 | "OBJ_29" = { 231 | isa = "PBXBuildFile"; 232 | fileRef = "OBJ_6"; 233 | }; 234 | "OBJ_3" = { 235 | isa = "XCBuildConfiguration"; 236 | buildSettings = { 237 | CLANG_ENABLE_OBJC_ARC = "YES"; 238 | COMBINE_HIDPI_IMAGES = "YES"; 239 | COPY_PHASE_STRIP = "NO"; 240 | DEBUG_INFORMATION_FORMAT = "dwarf"; 241 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 242 | ENABLE_NS_ASSERTIONS = "YES"; 243 | GCC_OPTIMIZATION_LEVEL = "0"; 244 | GCC_PREPROCESSOR_DEFINITIONS = ( 245 | "$(inherited)", 246 | "SWIFT_PACKAGE=1", 247 | "DEBUG=1" 248 | ); 249 | MACOSX_DEPLOYMENT_TARGET = "10.10"; 250 | ONLY_ACTIVE_ARCH = "YES"; 251 | OTHER_SWIFT_FLAGS = ( 252 | "-DXcode" 253 | ); 254 | PRODUCT_NAME = "$(TARGET_NAME)"; 255 | SDKROOT = "macosx"; 256 | SUPPORTED_PLATFORMS = ( 257 | "macosx", 258 | "iphoneos", 259 | "iphonesimulator", 260 | "appletvos", 261 | "appletvsimulator", 262 | "watchos", 263 | "watchsimulator" 264 | ); 265 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 266 | "$(inherited)", 267 | "SWIFT_PACKAGE", 268 | "DEBUG" 269 | ); 270 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 271 | USE_HEADERMAP = "NO"; 272 | }; 273 | name = "Debug"; 274 | }; 275 | "OBJ_31" = { 276 | isa = "XCConfigurationList"; 277 | buildConfigurations = ( 278 | "OBJ_32", 279 | "OBJ_33" 280 | ); 281 | defaultConfigurationIsVisible = "0"; 282 | defaultConfigurationName = "Release"; 283 | }; 284 | "OBJ_32" = { 285 | isa = "XCBuildConfiguration"; 286 | buildSettings = { 287 | }; 288 | name = "Debug"; 289 | }; 290 | "OBJ_33" = { 291 | isa = "XCBuildConfiguration"; 292 | buildSettings = { 293 | }; 294 | name = "Release"; 295 | }; 296 | "OBJ_34" = { 297 | isa = "PBXTargetDependency"; 298 | target = "parse-browser-history::parse-browser-historyTests"; 299 | }; 300 | "OBJ_36" = { 301 | isa = "XCConfigurationList"; 302 | buildConfigurations = ( 303 | "OBJ_37", 304 | "OBJ_38" 305 | ); 306 | defaultConfigurationIsVisible = "0"; 307 | defaultConfigurationName = "Release"; 308 | }; 309 | "OBJ_37" = { 310 | isa = "XCBuildConfiguration"; 311 | buildSettings = { 312 | CLANG_ENABLE_MODULES = "YES"; 313 | EMBEDDED_CONTENT_CONTAINS_SWIFT = "YES"; 314 | FRAMEWORK_SEARCH_PATHS = ( 315 | "$(inherited)", 316 | "$(PLATFORM_DIR)/Developer/Library/Frameworks" 317 | ); 318 | HEADER_SEARCH_PATHS = ( 319 | "$(inherited)" 320 | ); 321 | INFOPLIST_FILE = "parse-browser-history.xcodeproj/parse_browser_historyTests_Info.plist"; 322 | IPHONEOS_DEPLOYMENT_TARGET = "8.0"; 323 | LD_RUNPATH_SEARCH_PATHS = ( 324 | "$(inherited)", 325 | "@loader_path/../Frameworks", 326 | "@loader_path/Frameworks" 327 | ); 328 | MACOSX_DEPLOYMENT_TARGET = "10.10"; 329 | OTHER_CFLAGS = ( 330 | "$(inherited)" 331 | ); 332 | OTHER_LDFLAGS = ( 333 | "$(inherited)" 334 | ); 335 | OTHER_SWIFT_FLAGS = ( 336 | "$(inherited)" 337 | ); 338 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 339 | "$(inherited)" 340 | ); 341 | SWIFT_VERSION = "5.0"; 342 | TARGET_NAME = "parse-browser-historyTests"; 343 | TVOS_DEPLOYMENT_TARGET = "9.0"; 344 | WATCHOS_DEPLOYMENT_TARGET = "2.0"; 345 | }; 346 | name = "Debug"; 347 | }; 348 | "OBJ_38" = { 349 | isa = "XCBuildConfiguration"; 350 | buildSettings = { 351 | CLANG_ENABLE_MODULES = "YES"; 352 | EMBEDDED_CONTENT_CONTAINS_SWIFT = "YES"; 353 | FRAMEWORK_SEARCH_PATHS = ( 354 | "$(inherited)", 355 | "$(PLATFORM_DIR)/Developer/Library/Frameworks" 356 | ); 357 | HEADER_SEARCH_PATHS = ( 358 | "$(inherited)" 359 | ); 360 | INFOPLIST_FILE = "parse-browser-history.xcodeproj/parse_browser_historyTests_Info.plist"; 361 | IPHONEOS_DEPLOYMENT_TARGET = "8.0"; 362 | LD_RUNPATH_SEARCH_PATHS = ( 363 | "$(inherited)", 364 | "@loader_path/../Frameworks", 365 | "@loader_path/Frameworks" 366 | ); 367 | MACOSX_DEPLOYMENT_TARGET = "10.10"; 368 | OTHER_CFLAGS = ( 369 | "$(inherited)" 370 | ); 371 | OTHER_LDFLAGS = ( 372 | "$(inherited)" 373 | ); 374 | OTHER_SWIFT_FLAGS = ( 375 | "$(inherited)" 376 | ); 377 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 378 | "$(inherited)" 379 | ); 380 | SWIFT_VERSION = "5.0"; 381 | TARGET_NAME = "parse-browser-historyTests"; 382 | TVOS_DEPLOYMENT_TARGET = "9.0"; 383 | WATCHOS_DEPLOYMENT_TARGET = "2.0"; 384 | }; 385 | name = "Release"; 386 | }; 387 | "OBJ_39" = { 388 | isa = "PBXSourcesBuildPhase"; 389 | files = ( 390 | "OBJ_40", 391 | "OBJ_41" 392 | ); 393 | }; 394 | "OBJ_4" = { 395 | isa = "XCBuildConfiguration"; 396 | buildSettings = { 397 | CLANG_ENABLE_OBJC_ARC = "YES"; 398 | COMBINE_HIDPI_IMAGES = "YES"; 399 | COPY_PHASE_STRIP = "YES"; 400 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 401 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 402 | GCC_OPTIMIZATION_LEVEL = "s"; 403 | GCC_PREPROCESSOR_DEFINITIONS = ( 404 | "$(inherited)", 405 | "SWIFT_PACKAGE=1" 406 | ); 407 | MACOSX_DEPLOYMENT_TARGET = "10.10"; 408 | OTHER_SWIFT_FLAGS = ( 409 | "-DXcode" 410 | ); 411 | PRODUCT_NAME = "$(TARGET_NAME)"; 412 | SDKROOT = "macosx"; 413 | SUPPORTED_PLATFORMS = ( 414 | "macosx", 415 | "iphoneos", 416 | "iphonesimulator", 417 | "appletvos", 418 | "appletvsimulator", 419 | "watchos", 420 | "watchsimulator" 421 | ); 422 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 423 | "$(inherited)", 424 | "SWIFT_PACKAGE" 425 | ); 426 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 427 | USE_HEADERMAP = "NO"; 428 | }; 429 | name = "Release"; 430 | }; 431 | "OBJ_40" = { 432 | isa = "PBXBuildFile"; 433 | fileRef = "OBJ_12"; 434 | }; 435 | "OBJ_41" = { 436 | isa = "PBXBuildFile"; 437 | fileRef = "OBJ_13"; 438 | }; 439 | "OBJ_42" = { 440 | isa = "PBXFrameworksBuildPhase"; 441 | files = ( 442 | ); 443 | }; 444 | "OBJ_43" = { 445 | isa = "PBXTargetDependency"; 446 | target = "parse-browser-history::parse-browser-history"; 447 | }; 448 | "OBJ_5" = { 449 | isa = "PBXGroup"; 450 | children = ( 451 | "OBJ_6", 452 | "OBJ_7", 453 | "OBJ_10", 454 | "OBJ_14" 455 | ); 456 | path = ""; 457 | sourceTree = ""; 458 | }; 459 | "OBJ_6" = { 460 | isa = "PBXFileReference"; 461 | explicitFileType = "sourcecode.swift"; 462 | path = "Package.swift"; 463 | sourceTree = ""; 464 | }; 465 | "OBJ_7" = { 466 | isa = "PBXGroup"; 467 | children = ( 468 | "OBJ_8" 469 | ); 470 | name = "Sources"; 471 | path = ""; 472 | sourceTree = "SOURCE_ROOT"; 473 | }; 474 | "OBJ_8" = { 475 | isa = "PBXGroup"; 476 | children = ( 477 | "OBJ_9" 478 | ); 479 | name = "parse-browser-history"; 480 | path = "Sources/parse-browser-history"; 481 | sourceTree = "SOURCE_ROOT"; 482 | }; 483 | "OBJ_9" = { 484 | isa = "PBXFileReference"; 485 | path = "main.swift"; 486 | sourceTree = ""; 487 | }; 488 | "parse-browser-history::SwiftPMPackageDescription" = { 489 | isa = "PBXNativeTarget"; 490 | buildConfigurationList = "OBJ_25"; 491 | buildPhases = ( 492 | "OBJ_28" 493 | ); 494 | dependencies = ( 495 | ); 496 | name = "parse-browser-historyPackageDescription"; 497 | productName = "parse-browser-historyPackageDescription"; 498 | productType = "com.apple.product-type.framework"; 499 | }; 500 | "parse-browser-history::parse-browser-history" = { 501 | isa = "PBXNativeTarget"; 502 | buildConfigurationList = "OBJ_18"; 503 | buildPhases = ( 504 | "OBJ_21", 505 | "OBJ_23" 506 | ); 507 | dependencies = ( 508 | ); 509 | name = "parse-browser-history"; 510 | productName = "parse_browser_history"; 511 | productReference = "parse-browser-history::parse-browser-history::Product"; 512 | productType = "com.apple.product-type.tool"; 513 | }; 514 | "parse-browser-history::parse-browser-history::Product" = { 515 | isa = "PBXFileReference"; 516 | path = "parse-browser-history"; 517 | sourceTree = "BUILT_PRODUCTS_DIR"; 518 | }; 519 | "parse-browser-history::parse-browser-historyPackageTests::ProductTarget" = { 520 | isa = "PBXAggregateTarget"; 521 | buildConfigurationList = "OBJ_31"; 522 | buildPhases = ( 523 | ); 524 | dependencies = ( 525 | "OBJ_34" 526 | ); 527 | name = "parse-browser-historyPackageTests"; 528 | productName = "parse-browser-historyPackageTests"; 529 | }; 530 | "parse-browser-history::parse-browser-historyTests" = { 531 | isa = "PBXNativeTarget"; 532 | buildConfigurationList = "OBJ_36"; 533 | buildPhases = ( 534 | "OBJ_39", 535 | "OBJ_42" 536 | ); 537 | dependencies = ( 538 | "OBJ_43" 539 | ); 540 | name = "parse-browser-historyTests"; 541 | productName = "parse_browser_historyTests"; 542 | productReference = "parse-browser-history::parse-browser-historyTests::Product"; 543 | productType = "com.apple.product-type.bundle.unit-test"; 544 | }; 545 | "parse-browser-history::parse-browser-historyTests::Product" = { 546 | isa = "PBXFileReference"; 547 | path = "parse_browser_historyTests.xctest"; 548 | sourceTree = "BUILT_PRODUCTS_DIR"; 549 | }; 550 | }; 551 | rootObject = "OBJ_1"; 552 | } 553 | -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/project.xcworkspace/xcuserdata/redteam.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedowens/macOS-browserhist-parser/1971f704eb43c7d7d35b5831ec362ce4924f5dd6/parse-browser-history/parse-browser-history.xcodeproj/project.xcworkspace/xcuserdata/redteam.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/xcshareddata/xcschemes/parse-browser-history-Package.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /parse-browser-history/parse-browser-history.xcodeproj/xcshareddata/xcschemes/parse-browser-history.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /parse-browser-history/usage.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedowens/macOS-browserhist-parser/1971f704eb43c7d7d35b5831ec362ce4924f5dd6/parse-browser-history/usage.jpeg --------------------------------------------------------------------------------