Skip to content

Instantly share code, notes, and snippets.

@santaklouse
Last active May 29, 2025 02:41
Show Gist options
  • Save santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef to your computer and use it in GitHub Desktop.
Save santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef to your computer and use it in GitHub Desktop.
unlimited CrossOver trial (MacOS)

Run it in console for permanent install :

bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/install.sh?token=$(date +%s))"

After install script will fix crossover as well as expired bottles (Thanks to @djsmax).

#!/usr/bin/env bash
# checck if pidof exists
PIDOF="$(which pidof)"
# and if not - install it
(test "${PIDOF}" && test -f "${PIDOF}") || brew install pidof
# find app in default paths
CO_PWD=~/Applications/CrossOver.app/Contents/MacOS
test -d "${CO_PWD}" || CO_PWD=/Applications/CrossOver.app/Contents/MacOS
test -d "${CO_PWD}" || (echo 'unable to detect app path. exiting...' && exit)
PWD="${CO_PWD}"
cd "${PWD}"
PROC_NAME='CrossOver'
# get all pids of CrossOver
pids=(`pgrep "${PROC_NAME}"`, `pidof "${PROC_NAME}"`, `ps -Ac | grep -m1 "${PROC_NAME}" | awk '{print $1}'`)
pids=`echo ${pids[*]}|tr ',' ' '`
# kills CrossOver process if it is running
[ "${pids}" ] && kill -9 `echo "${pids}"` > /dev/null 2>&1
# wait until app finish
sleep 3
# make the current date RFC3339-encoded string representation in UTC time zone
DATETIME=`date -u -v -3H '+%Y-%m-%dT%TZ'`
# modify time in order to reset trial
plutil -replace FirstRunDate -date "${DATETIME}" ~/Library/Preferences/com.codeweavers.CrossOver.plist
plutil -replace SULastCheckTime -date "${DATETIME}" ~/Library/Preferences/com.codeweavers.CrossOver.plist
# show tooltip notification
/usr/bin/osascript -e "display notification \"trial fixed: date changed to ${DATETIME}\""
# reset all bottles
for file in ~/Library/Application\ Support/CrossOver/Bottles/*/.{eval,update-timestamp}; do rm -rf "${file}";done
# and after this execute original crossover
echo "${PWD}" > /tmp/co_log.log
"$($PWD/CrossOver.origin)" >> /tmp/co_log.log
#!/usr/bin/env bash
# find app in default paths
CO_PWD=~/Applications/CrossOver.app/Contents/MacOS
test -d "${CO_PWD}" || CO_PWD=/Applications/CrossOver.app/Contents/MacOS
test -d "${CO_PWD}" || (echo 'unable to detect app path. exiting...' && exit)
PWD="${CO_PWD}"
cd "${PWD}"
PROC_NAME='CrossOver'
# get all pids of CrossOver
pids=(`pgrep "${PROC_NAME}"`, `pidof "${PROC_NAME}"`, `ps -Ac | grep -m1 "${PROC_NAME}" | awk '{print $1}'`)
pids=`echo ${pids[*]}|tr ',' ' '`
# kills CrossOver process if it is running
[ "${pids}" ] && kill -9 `echo "${pids}"` > /dev/null 2>&1
TIMESTAMP=$(date +%s)
FIX_FILE_LINK="https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/CrossOver.sh?token=${TIMESTAMP}"
if [ -f CrossOver.origin ]; then
echo 'already installed. update and exit.'
echo "$(curl -fsSL ${FIX_FILE_LINK})" > CrossOver
exit
fi;
test -f CrossOver.origin || mv CrossOver CrossOver.origin
echo "$(curl -fsSL ${FIX_FILE_LINK})" > CrossOver
chmod +x CrossOver
echo 'Done. Please open CrossOver '
#!/usr/bin/env bash
# find app in default paths
CO_PWD=~/Applications/CrossOver.app/Contents/MacOS
test -d "${CO_PWD}" || CO_PWD=/Applications/CrossOver.app/Contents/MacOS
test -d "${CO_PWD}" || (echo 'unable to detect app path. exiting...' && exit)
PWD="${CO_PWD}"
cd "${PWD}"
PROC_NAME='CrossOver'
# get all pids of CrossOver
pids=(`pgrep "${PROC_NAME}"`, `pidof "${PROC_NAME}"`, `ps -Ac | grep -m1 "${PROC_NAME}" | awk '{print $1}'`)
pids=`echo ${pids[*]}|tr ',' ' '`
# kills CrossOver process if it is running
[ "${pids}" ] && kill -9 `echo "${pids}"` > /dev/null 2>&1
if [ -f CrossOver.origin ]; then
echo 'original file found. Roll it back and exit.'
mv CrossOver.origin CrossOver
exit
fi;
echo 'original file not found.'
@Thisisme222
Copy link

are both of you on linux? The script was made with the macos version in mind.
If you are using macos, please try using terminal instead.

am on macos, can confirm this happens. after running the script, crossover does not open. Notification below appears.
Screenshot 2025-04-11 at 9 12 16 PM

@FewJuho
Copy link

FewJuho commented Apr 12, 2025

Nygosaki

iam on macos sequoia rn using Iterm2, maybe paths depends on CrossOver version? (25.0.0)

@supahfox
Copy link

@FewJuho @supahfox are both of you on linux? The script was made with the macos version in mind. If you could open the C: drive of a bottle, navigate from there to base crossover directory, and then dump the entire folder into a zip and upload it here I can modify it to work on linux. If you are using macos, please try using terminal instead.

macos sequoia 15.4

@Nygosaki
Copy link

I see. Considering I've had crossover since way before 25, I am thinking that my paths might be outdated. I am currently on vacation, once I return I'll reinstall it and check things out.

@casvanluijtelaar
Copy link

casvanluijtelaar commented Apr 15, 2025

works in combination with https://github.com/Ghost420-over/crackover/blob/main/Reset_Crossover_bottles.command to update the bottles system.reg file. (had to modify both scripts to suite my setup)

@PrenSJ2
Copy link

PrenSJ2 commented Apr 15, 2025

I am on macos 15.4

all i did:

  1. give full disk access to iTerm (Terminal)
  2. brew install pidof
  3. sudo bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/install.sh)"

bosh 👍

@5taras
Copy link

5taras commented Apr 22, 2025

@FewJuho @supahfox are both of you on linux? The script was made with the macos version in mind. If you could open the C: drive of a bottle, navigate from there to base crossover directory, and then dump the entire folder into a zip and upload it here I can modify it to work on linux. If you are using macos, please try using terminal instead.

I am on Linux and I have to use Crossover to work with Word to type papers on physics for one specific journal.

@cashiusjk
Copy link

a warning to anyone who tries - crossover no longer starts after running this. I get to reinstall everything now, thanks.

@aSushiLegend
Copy link

I am on macos 15.4

all i did:

  1. give full disk access to iTerm (Terminal)
  2. brew install pidof
  3. sudo bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/install.sh)"

bosh 👍

Does this actually work? And if so can you give a full runthrough starting with installing Crossover etc

@aSushiLegend
Copy link

I am on macos 15.4

all i did:

  1. give full disk access to iTerm (Terminal)
  2. brew install pidof
  3. sudo bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/install.sh)"

bosh 👍

My crossover now no longer starts after doing this

@PrenSJ2
Copy link

PrenSJ2 commented Apr 26, 2025

I am on macos 15.4
all i did:

  1. give full disk access to iTerm (Terminal)
  2. brew install pidof
  3. sudo bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/install.sh)"

bosh 👍

My crossover now no longer starts after doing this

I just came across this too, and had to run the uninstall script: https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef#file-uninstall-sh
which seemed to also reset the trial, I guess I am just gonna create a zsh alias to run the uninstall and install scripts, then just run them every 14 days. kinda buggy but whatever

@aSushiLegend
Copy link

I am on macos 15.4
all i did:

  1. give full disk access to iTerm (Terminal)
  2. brew install pidof
  3. sudo bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/install.sh)"

bosh 👍

My crossover now no longer starts after doing this

I just came across this too, and had to run the uninstall script: https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef#file-uninstall-sh which seemed to also reset the trial, I guess I am just gonna create a zsh alias to run the uninstall and install scripts, then just run them every 14 days. kinda buggy but whatever

yh it went back to normal after running the uninstall script and reset to 14 days so i guess I just gotta do that every 13 days

@boozybatsMain
Copy link

CrossOver.sh script just killed my crossover app, it doesn't open anymore........

@aSushiLegend
Copy link

CrossOver.sh script just killed my crossover app, it doesn't open anymore........

Yh you just run the uninstall script and it will fix it. Just run this

bash -c "$(curl -fsSL https://gist.github.com/santaklouse/a137ee51692b74d4cf2cc1bb68ed64ef/raw/uninstall.sh)"

@PrenSJ2
Copy link

PrenSJ2 commented May 6, 2025

I ended up just paying the year, as i kept having to tediously uninstall then install .....

@TehBrian
Copy link

I'm waiting for the Cyber Monday deal to buy CrossOver. As a student who only uses Windows apps every once in a few months, CrossOver's regular pricing is too much for me to justify.

@Nygosaki
Copy link

Nygosaki commented May 13, 2025

@aSushiLegend the reason why it works for you, I think, is because Santaklouse's script generated a "backup" crossover.app file, which this script restored. I assume you ran his script before whatever update patched resetting our resetting the trial method, and your crossover got rolled back to that version.
I'd be really happy if you proved me wrong, as I've explored all of crossover's directories looking for where it could be taking its initial run date from, and found absolutely nothing. Not even full uninstalls, whether that's codewaver's uninstall script or a uninstall utility app have worked. The only thing remaining is to actually just reverse engineer the app.
If your .app is truly still vulnerable, could you upload it here?

@hackthegame101
Copy link

hackthegame101 commented May 14, 2025

Complete Guide to Reset CrossOver Trial on Mac

This guide will walk you through resetting both the CrossOver trial period and bottle settings on your Mac. Follow these steps carefully to fix the current issue assuming you have installed OP's original script.

Prerequisites

  • Make sure CrossOver is fully closed
  • Ensure ALL Windows emulated apps are NOT running
  • A firewall program (like LuLu or Little Snitch) to block Codeweavers' domains
  • A text editor (like TextEdit, VS Code, or Sublime Text)

Part 1: Reset the Trial Period

  1. Access the preferences file:

    • Open Finder
    • Click the "Go" menu at the top of your screen
    • Hold down the Option key to make "Library" appear in the dropdown
    • Click on "Library"
    • Navigate to the "Preferences" folder
    • Find the file named com.codeweavers.CrossOver.plist
  2. Edit the preferences file:

    • Right-click the file and open with a plist editor (like Xcode or a dedicated plist editor)
    • Locate the FirstRunDate key
    • Change its value to today's date
    • Save and close the file

Part 2: Reset the Bottle (Registry Fix)

  1. Create the reset script:
    • Open your text editor
    • Copy and paste this script:
#!/bin/bash
REGFILE="$HOME/Library/Application Support/CrossOver/Bottles/Steam/system.reg"
BAKFILE="$REGFILE.bak"
FINDSTR="\[Software\\\\\\\\CodeWeavers\\\\\\\\CrossOver\\\\\\\\cxoffice\] [0-9]*"
cp "$REGFILE" "$BAKFILE"
echo "Backup created: $BAKFILE"
MATCHLN=$(grep -n "$FINDSTR" "$REGFILE" | cut -d: -f1)
if [ -n "$MATCHLN" ]; then
  echo "Match found at line $MATCHLN."
  sed -n "${MATCHLN},$(($MATCHLN + 4))p" "$REGFILE"
  read -p "Do you want to delete these lines? (y/n): " RESP
  if [ "$RESP" == "y" ]; then
    awk -v line="$MATCHLN" 'NR >= line && NR <= line + 4 {next} {print}' "$REGFILE" > temp && mv temp "$REGFILE"
    echo "Lines deleted."
  else
    echo "Deletion canceled."
  fi
else
  echo "No match found."
fi
  • Save the file as reset_crossover.sh to your desktop or home folder
  1. Modify the script (if needed):

    • If your bottle is not named "Steam", edit line 2 of the script
    • Replace "Steam" with your actual bottle name
  2. Make the script executable:

    • Open Terminal
    • Navigate to where you saved the script:
      cd ~/Desktop  # If you saved it on desktop
      
    • Make it executable:
      chmod +x reset_crossover.sh
      
  3. Run the script:

    • In Terminal, run:
      ./reset_crossover.sh
      
    • When prompted, type y and press Enter to confirm deletion

Part 3: Prevent Online Verification

  1. Block CrossOver's internet access:(Not Required)
    • Open your firewall application (LuLu or Little Snitch)
    • Create rules to block these domains:
      • codeweavers.com
      • www.codeweavers.com
      • Any other Codeweavers domains

Part 4: Testing and Maintenance

  1. Test the reset:

    • Open CrossOver
    • Verify that your trial has been reset (should show 14 days remaining)
    • Open one of your Windows applications to ensure it works properly
  2. Regular maintenance:

    • Set a reminder to repeat this process weekly or before your trial expires
    • Keep the script handy for future use

Troubleshooting

If CrossOver still shows the trial as expired:

  1. Check bottle configuration:

    • Try resetting different bottles if you have multiple
    • The registry path might vary slightly between CrossOver versions
  2. Additional preference files:

    • Look for and delete CrossOver cache files:
      rm -rf ~/Library/Caches/com.codeweavers.CrossOver
      
  3. Complete reinstall:

    • As a last resort, uninstall CrossOver completely
    • Delete all CrossOver folders and preferences
    • Reinstall the application

@Nygosaki
Copy link

Nygosaki commented May 14, 2025

I don't know how its with others, but xcode & plutil (via bash) changes get reverted while prefs editor's stick, and I have no clue why.
I was also looking around with wireshark and crossover still doesn't check the trial period with any external servers. Still trying to figure out whats actually going on.
Edit: According to Thomas Tempelmann, "Mac OS X 10.8 introduced a caching system for app preferences ("cfprefsd"). While this probably increases performances for apps, it makes it harder for developers to manipulate preference values quickly for testing, because making changes directly to the plist files in the ~/Library/Preferences folder does not work any more with editors such as "Property List Editor.app" and the similar editor in Xcode. As of now (Dec 14, 2013), the only way to edit such preferences is by using the "defaults" command, which is rather difficult to use once it comes to editing dict or array entries."
I'll try testing the command to use it instead of plutil

@EpicLPer
Copy link

@hackthegame101 Can confirm this works, tho editing the script to just automatically go through all Bottles and remove the lines in the registry automatically might be nice.

@Nygosaki
Copy link

If someone could try this out on their device, I'd appreciate it

@aSushiLegend
Copy link

@aSushiLegend the reason why it works for you, I think, is because Santaklouse's script generated a "backup" crossover.app file, which this script restored. I assume you ran his script before whatever update patched resetting our resetting the trial method, and your crossover got rolled back to that version. I'd be really happy if you proved me wrong, as I've explored all of crossover's directories looking for where it could be taking its initial run date from, and found absolutely nothing. Not even full uninstalls, whether that's codewaver's uninstall script or a uninstall utility app have worked. The only thing remaining is to actually just reverse engineer the app. If your .app is truly still vulnerable, could you upload it here?

Yh unless they dropped an update within the last 3 weeks I don't know but it works so long as I run the script in terminal and then run Crossover and the close crossover and run the uninstall script.

@supahfox
Copy link

supahfox commented May 14, 2025

If someone could try this out on their device, I'd appreciate it

Works fine for me (25.0)

@aSushiLegend
Copy link

My old Crossover method broke and I tried the new one and it works fine for me

@xVc323
Copy link

xVc323 commented May 23, 2025

Script here — resets trial, bottle reset included (experimental).

@Nygosaki
Copy link

@xVc323 I was snooping with wireshark for a while and crossover still doesn't validate trials with their servers. IMO it's overkill and doesen't treat the actual issues causing things to fail, trying to treat the symptoms instead with a wide spray, but as long as it helps someone I'm glad.
The actual reason why it stopped working I wrote about in an earlier comment here

@romthebom7
Copy link

how does it work when i paste it into terminal but it doesn't work nothing happens

@xVc323
Copy link

xVc323 commented May 27, 2025

@Nygosaki You’re absolutely right. I set up a testing environment and didn’t find any obvious network traffic to CodeWeavers that looked related to trial validation. That said, I’m no expert in network analysis so I can’t be 100% certain. The traffic I did see seemed to be tied to things like TIE files and software downloads. I'll simplify my script accordingly.

@UrkiMimi
Copy link

UrkiMimi commented May 28, 2025

If anyone needs it, I'll drop the Python script I made in like 5 minutes that I've been using for little over a month.
All this does is set the FirstRunDate to the current time. This doesn't fix effected bottles.

import plistlib
import os
from datetime import datetime

# set os path
userPath = os.path.expanduser('~')

# open plist
with open(f'{userPath}/Library/Preferences/com.codeweavers.CrossOver.plist', 'rb') as f:
    pl = plistlib.load(f)


# set first run date to correct time
pl['FirstRunDate'] = datetime.utcnow()

# save plist
with open(f'{userPath}/Library/Preferences/com.codeweavers.CrossOver.plist', 'wb') as f:
    plistlib.dump(pl, f)

@proffsmoke
Copy link

If anyone needs it, I'll drop the Python script I made in like 5 minutes that I've been using for little over a month. All this does is set the FirstRunDate to the current time. This doesn't fix effected bottles.

import plistlib
import os
from datetime import datetime

# set os path
userPath = os.path.expanduser('~')

# open plist
with open(f'{userPath}/Library/Preferences/com.codeweavers.CrossOver.plist', 'rb') as f:
    pl = plistlib.load(f)


# set first run date to correct time
pl['FirstRunDate'] = datetime.utcnow()

# save plist
with open(f'{userPath}/Library/Preferences/com.codeweavers.CrossOver.plist', 'wb') as f:
    plistlib.dump(pl, f)

works for me, very thx

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