Skip to content

Instantly share code, notes, and snippets.

@dannote
Last active December 11, 2024 08:15
Show Gist options
  • Save dannote/17e0396fe2e19c6e60c915838376d267 to your computer and use it in GitHub Desktop.
Save dannote/17e0396fe2e19c6e60c915838376d267 to your computer and use it in GitHub Desktop.
Final Cut Pro X trial reset
#!/usr/bin/swift
// DISCLAIMER
// This script modifies an unencrypted file associated with the trial version of Final Cut Pro.
// Under the DMCA (17 U.S.C. § 1201), this modification does not qualify as circumvention of a technological
// protection measure (TPM), as it does not involve bypassing encryption, authentication, or similar protections.
// Distributing this code is therefore legal under the DMCA.
// This script is intended for educational and research purposes, such as exploring trial-related file structures,
// or for system troubleshooting in controlled environments with explicit permissions. It is not intended to be used
// in a manner that violates Apple's software license agreement.
// WARNING
// Using this script to reset or extend the trial period of Final Cut Pro without Apple's authorization likely violates
// the software license agreement. Such actions may lead to legal consequences. The responsibility for compliance with
// all applicable laws and agreements lies solely with the user. The author of this script assumes no liability for misuse
// or any resulting consequences.
import Foundation
let path = URL(fileURLWithPath: NSString(string: "~/Library/Containers/com.apple.FinalCutTrial/Data/Library/Application Support/.ffuserdata").expandingTildeInPath)
let data = try! NSData(contentsOf: path) as Data
let dictionary = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! NSDictionary
let mutableDictionary = dictionary.mutableCopy() as! NSMutableDictionary
for (key, value) in mutableDictionary {
if value is NSDate {
mutableDictionary[key] = Date()
}
}
try! NSKeyedArchiver.archivedData(withRootObject: mutableDictionary, requiringSecureCoding: false).write(to: path)
print("You'd better buy it")
@andresreibel
Copy link

andresreibel commented Oct 1, 2024 via email

@l0u1sg
Copy link

l0u1sg commented Nov 15, 2024

The latest version of Final Cut Pro seems not to work with this script:

main/final-cut-pro-trial-reset.swift:6: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=260 "The file “.ffuserdata” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/[RESTRICTED]/Library/Application Support/.ffuserdata, NSURL=file:///Users/[RESTRICTED]/Library/Application%20Support/.ffuserdata, NSUnderlyingError=0x12e610c40 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

Does someone have a solution?

@TehBrian
Copy link

The latest version of Final Cut Pro seems not to work with this script:

main/final-cut-pro-trial-reset.swift:6: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=260 "The file “.ffuserdata” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/[RESTRICTED]/Library/Application Support/.ffuserdata, NSURL=file:///Users/[RESTRICTED]/Library/Application%20Support/.ffuserdata, NSUnderlyingError=0x12e610c40 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

Does someone have a solution?

Try this: https://gist.github.com/TehBrian/bf82c7505b647d423da6d5abbe2b95a3

@l0u1sg
Copy link

l0u1sg commented Nov 17, 2024 via email

@TehBrian
Copy link

@l0u1sg, I've updated https://gist.github.com/TehBrian/bf82c7505b647d423da6d5abbe2b95a3 with the correct path for newer versions of Final Cut Pro.

Additionally, I've made a similar Gist for Logic Pro, https://gist.github.com/TehBrian/1c236b6d9c58e736c0480a876759164d, which I'll keep updated as well.

@l0u1sg
Copy link

l0u1sg commented Nov 18, 2024 via email

@dannote
Copy link
Author

dannote commented Nov 21, 2024

@TehBrian thank you, updated the code accordingly.

@dannote
Copy link
Author

dannote commented Dec 6, 2024

@andresreibel As I clearly stated in the disclaimer up there, this is not a place to distribute cracks, hacks or anything else that violates DMCA. Any attempts to advertise stuff like that will be suppressed immediately.

@andresreibel
Copy link

andresreibel commented Dec 6, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment